【网络是怎样连接的】| 【01】浏览器如何生成消息?如何与服务器通信?

使用c表示client客户端;
使用s表示server服务器;

1、生成HTTP请求消息

1.1 URL

【URL】:如http://开头的一串网址;
	- FTP:文件传输协议,端口为25;
	- HTTP:超文本传送协议,Web服务器,端口为80;
- URL中包含域名、文件路径、以及参数;

URL解析

【解析】:URL的格式多种多样,伴随着协议的不同而不同;

在这里插入图片描述

【URL中省略文件名的情况】:
- 以`/dir/`结尾的URL:表示后续还有文件名但本省略了;(由于事先再服务器上设置的默认文件名)
- 以`.com/`结尾的URL:表示访问一个名为`/`的目录,文件名省略;
- 以`.com`结尾,当没有路径名时,代表已设置好访问根目录下的默认文件;
- 以`/name`结尾,该name可以为文件名或者目录;

1.2 HTTP基本思路

当解析完url即可使用HTTP协议来访问Web;

【基本思路】:首先c会向s发送请求消息(对什么和进行怎样的操作);
- 其中对什么(访问目标)被称为【URI】;
- 而进行怎样的操作(让Web server完成什么工作)被称为【方法】;

【URI】是一个存放网页数据的文件名或一个CGI程序的文件名,也可直接使用URL来作为URI;
	- 【CGI】:对Web Server调用其他程序的规则所做的定义;

HTTP请求

【GET】:能够发送只有几百个字节;
【POST】:超过几百个字节需POST发送;
方法 HTTP1.0 HTTP1.1 含义
GET yes yes 获取URI指定的信息,URI为文件,则返回文件内容;若为CGI程序,则返回程序的输出数据
POST yes yes 从c向s发送data;
HEAD yes yes 和GET基本相同,但其只返回HTTP的消息头,不返回数据的内容,用于获取文件最后更新时间等信息
OPTIONS yes 用于通知或查询通信选项
PUT yes 替换URI指定的服务器上的文件,若URI不存在,则创建该文件
DELETE yes 删除URI指定的服务器上的文件
TRACE yes 将s收到的请求行和header直接返回给c;用于在使用代理的环境中检查改写请求的情况
CONNECT yes 使用代理传输加密消息时使用的方法
当c向s发送数据时,会先发送头字段,在发送数据;s收到请求后,进行解析,通过URI和方法执行,将结果存放在响应消息中;
【GET请求】:请求消息中写上Get方法,在URI中写上存放网页数据的文件名,表示要获取该文件的数据;当Web s收到请求后,
读取该文件的数据,存放到响应消息中,并返回给客户端;
【POST请求】:URI会指向Web s中允许的一个应用程序的文件米,在请求中,需要另外加上表单信息,Web s收到请求后将消息发送给URI中指定的程序,后Web s从该程序中接收结果,放到响应消息中;

在这里插入图片描述

1.3 生成HTTP请求消息

当解析了URL后,浏览器确定了Web服务器和访问路径,在根据这些信息生成HTTP请求消息;
- 【请求行】:告诉Web s应进行怎样的操作末尾需要加上HTTP版本号;
- 【消息头】:用来存放额外信息;
- 【空行】:在下完消息头后;
- 【消息体】:GET方法不需要;
- 

在这里插入图片描述
常用字段
在这里插入图片描述
在这里插入图片描述

1.4 发送请求后会收到响应

响应信息上第一行的内容为状态码和响应短语,告知程序的执行结果;
【含义】:
1xx:告知请求的处理进度和情况;
2xx:成功;
3xx:表示需要进一步操作;
4xx:客户端错误;
5xx:服务端错误; 

在这里插入图片描述

当网页中含有图片的请求

当网页含有图片时,遇到HTML内有图片相关标签,则会预留图片空间,然后再次访问Web s获取图片;
- 每个请求消息只能写一个URI,每次只能获取1个文件,若要获取多个文件则需要对每个文件单独发送一条请求;

在这里插入图片描述

2、向DNS服务器查询Web服务器的IP地址

2.1 IP地址

有关IP的内容可以在此查看

当生成HTTP消息后,需要委托系统将消息发送给Web s,但还需要先查明服务器域名对应的IP地址;
- 我们通过IP地址判断出访问对象服务器的位置,从而将消息发送到服务器

2.2 为什么域名和IP地址并用及DNS如何查询IP

从效率上,使用IP在路由的转发上效率更高;
如果Web服务器使用了虚拟主机功能,可能不误通过IP地址来访问;

中间借用DNS未桥梁,在域名和IP之间进行转换;

2.3 Socket库提供查询IP地址的功能

Socket库中有一个解析器,向DNS发送查询消息,并接收返回的响应消息;

在C中调用Socket库中的gethostbyname,并传入域名,即可取出IP地址,将其写入浏览器的内存中;

内部原理

解析器委托操作系统内的协议栈向DNS发送查询消息,协议栈会执行发送消息的操作,然后通过网卡将消息发送给DNS
服务器;
【协议栈】:操作系统内部的网络控制软件;
【DNS服务器】:其IP地址已被事先设置;

在这里插入图片描述

DNS基本工作

基本工作:接收来自客户端的查询消息(查询域名和记录类型相关的记录),然后根据消息的内容返回响应;
【客户端的查询消息类型】:
- 域名;
- Class:用来识别网络的信息
	【IN】表示互联网;
- 记录类型:表示域名对应何种类型的记录,
	【A】表示域名的IP地址;
	【MX】表示邮件服务器;

在这里插入图片描述
域名层次结构

DNS域名用句点分隔:(www.baidu.com)句点分隔开的为不同层次的界限(越靠右的位置其层级越高);
- 一个层级的部分称为域;故上述网址中:顶层为com域,下一层为baidu域....;
- 具有层次结构的域名信息会注册到DNS服务器中,一个域的信息可作为一个整体存放在DNS中(不可拆分);
- 可创建下级域供下级使用;
- 根域为DNS服务器最顶层,任何DNS都能够访问;

寻找相应的DNS获取域名IP地址

下级域一般将其DNS服务器的IP地址注册到上级DNS中;故我们将从上级查询;
- 首先c将会访问最近的一台DNS服务器,若最近的没有存放该网址对应的域名,故从顶层向下查找;

在这里插入图片描述
通过缓存加快DNS服务器的响应

一台DNS服务器能够管理多个域的信息,其具有缓存功能(具有时效性),提高后续访问速度;

2.4 委托协议栈发送消息

当知道IP地址后,就可以委托操作系统内部的协议栈向目标IP发送消息(HTTP消息是一种数字消息);
- 使用Socket来进行收发数据,将数据送入管道,在从另一端取出,该数据流动是双向的;

【连接】:
首先双方通信要建立管道,其出入口称为套接字,即先创建套接字形成管道;
服务器创建好套接字后等待客户端连接,客户端的套接字创建成功后即可连接上,随后即可通信;
【断开】:
当数据全部发送完毕后,管道将会被断开,在连接时由客户端发起,断开时可由任意一方发起;
只要其中一方断开,则另外一方也会被断开,紧接着套接字也会被删除,即通信结束;

【步骤】:创建套接字 - c连接s - 收发数据 - 断开管道删除套接字(该操作都由系统协议栈来执行);

创建套接字

创建套接字只需调用socket即可,创建成功后会返回一个描述符;
- 描述符:用来识别不同的套接字;

连接阶段

使用connect即可,需要传入描述符、服务器IP地址和端口号;
- 描述符:创建套接字所返回的;
- 服务器IP地址:通过DNS服务器查询;
- 端口号:自己指定,在创建套接字时,协议栈会随机分配一个,在连接时,会将这个端口号通知给服务器;

收发数据

发送数据使用write即可,需要指定发送的数据以及描述符,将数据送入套接字;
接收数据使用read即可,需要指定存放接收响应消息的内存地址(接收缓冲区);

断开阶段

Web服务器发送响应消息后,应主动执行断开操作,web服务器会先调用close来断开,该操作传达到后,c的套接字也会进入断开阶段;
-  重复的断开和连接效率会很低,后续在HTTP1.1后可以使用一次连接多次请求和响应;

猜你喜欢

转载自blog.csdn.net/weixin_45926547/article/details/124851637