”从输入网址到看到网页中间经历了什么?“是一个常见面试题,这个问题贯穿了整个网络系统,对回答者的网络综合素质要求较高。本文中对此问题的大致流程进行较细致的阐述,但篇幅有限,其中仍有一些细节性的知识需要读者自行查阅。
用户最开始是在浏览器输入网址,所以第一步,就需要浏览器对输入的URL地址进行解析,从URL地址中,组装成一个HTTP请求。如输入 www.baidu.com
就会生成一个对www.baidu.com的get请求。具体的HTTP请求信息细节可查阅其他资料。
从URL地址中解析出域名后,还需要通过DNS对域名进行解析,即查询域名所对应的IP地址。DNS是一种服务,其有很多个层级排列的服务器,类似与一个树状结构,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bmpNMRk-1667130070904)(C:\Users\Acer\AppData\Roaming\Typora\typora-user-images\image-20221028162035511.png)]
每个域名服务器中,都保存有大量的域名与IP地址的映射。接下来拿 WWW.baidu.com
举例,对DNS域名解析流程进行阐述:
浏览器首先会查询本地缓存中是否有地址映射,如果有直接返回,没有则继续查询。
客户端查询自身的hosts文件是否有这个网址的映射关系,如果没有,则查找本地DNS解析器缓存。
如果hosts和本地DNS解析器缓存中都没有查询到映射关系,则客户端访问本地DNS服务器,采用迭代的方法查询www.baidu.com
的IP地址,如果查询成功的话,直接返回。如果不成功,则本地DNS服务器访问根服务器进行查询。
根服务器接收到消息后,会返回给本地DNS服务器一个.com
的DNS服务器地址。本地DNS再次对.com
的地址发送请求,comDNS服务器
则会返回一个baidu.com
域的地址,反复此操作,直到查询到 www.baidu.com
的IP地址。
在完成HTTP请求的组装后,整个请求还很单薄,无法通过各种物理设备安全传输到目的IP地址的主机上,还需要通过TCP、IP等各种协议的配合完成请求的传输以及响应接受。所以从上到下还需要加上TCP、IP、MAC的请求头,对请求进行进一步的包装,才会对消息进行发送。
HTTP协议是基于TCP的,TCP是一个可靠传输协议,保证整个请求的可靠送达。首先来看看TCP请求头部有哪些重要参数。
源端口号和目标端口。这两个字段主要为上层的应用层服务,标识了应用的类别。HTTP 默认端口号是 80
, HTTPS 默认端口号是 443
。
序号,解决包乱序的问题。
确认号,确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决不丢包的问题。
一些状态位。例如 SYN
是发起一个连接,ACK
是回复,RST
是重新连接,FIN
是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
TCP还可以流量控制和拥塞控制。
总的来说,在这一阶段,TCP将整个HTTP请求视为一个整体,设置参数组装请求头,放在HTTP请求的头部之前,形成了一个新的请求。
注:如果 HTTP 请求消息比较长,超过了 MSS
的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。数据会被以 MSS
的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。
TCP协议基于IP协议,IP协议主要实现远程定位的功能, IP 协议可以将数据封装成网络包发送给目的IP对象。首先也看看IP的重要参数有哪些:
06
(十六进制)标识为TCP。每个主机内部都维护了一张路由表,上面描述了为了达到某个目的IP而应该访问的IP,一个典型的路由表如下所示,根据目标网络即可找到对应的网关进行发送:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkESOVp9-1667130070905)(C:\Users\Acer\AppData\Roaming\Typora\typora-user-images\image-20221028170041940.png)]
与TCP类似,在这一阶段,IP将整个TCP请求视为一个整体,设置参数组装请求头,放在头部之前,形成了一个网络包。
MAC地址和ARP协议主要是用于以太网内部通信。在 MAC 包头里需要发送方 MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。
既然是以太网通信,所以每次不同主体间通信的时候,发送方MAC地址和接收方MAC地址都是不同的。发送方就是当前发送方的MAC地址,接收方是通过ARP协议获得的接收方的MAC地址。
ARP协议用于找到IP地址对应的MAC地址。其会在以太网中以广播的形式,询问某个IP地址的所有者,如果对方和自己处于同一个子网中,通过上面的操作就可以得到对方的 MAC 地址。
当然,为了增加性能,ARP协议也设置了缓存,如果缓存中直接就有IP与MAC地址的映射就不需要再发送广播了。
网卡和交换机实现在以太网内进行点对点的消息传播。
首先网卡将网络包解析成电信号,让网络包能在介质上传播,控制网卡的是网卡驱动程序。
交换机接受到的包后,查看其MAC地址,然后查询MAC地址表,将包转发到指定的端口上,端口另一端链接的就是目的MAC地址的主机。如果表中没有查询到,就会进行广播。
目前为止,实现的也只是以太网内的通信,如果想要包传播的更远,还需要路由器的帮助。
完成包接收操作之后,路由器首先删除包开头的 MAC 头部。因为MAC 头部的作用就是将包送达路由器。随后从IP请求头中解析出其目的IP,再查询路由表判断下一跳的位置,获取其IP地址。
获得下一跳地址后,如果是以太网内,就直接通过ARP协议进行交付了。如果并不在以太网内,就需要再次通过ARP协议,通过下一跳IP地址查找到下一跳的MAC地址,并通过交换机发送给下一跳。
经过多轮转发后,最后包被传送到目的IP的主机上。
在传输完成后,包成功发送到了目的主机上。这时候还会对包进行一些通用的处理和解析。
数据包抵达服务器后,服务器首先解析出MAC头部,查看MAC头部的目的地址是否和自身相符,如果不符则丢弃。随后解析出IP头部,对比目的IP地址,并通过协议项确定上层协议。如果TCP的话,就会解析出TCP头部,查看序列号、窗口值等,最后看到HTTP请求,再做出一些处理。
处理完后,对响应请求同样封装、再发送。
客户机接收到响应请求后,浏览器对响应进行解析与渲染,用户就看到了网页。
参考资料:
[1] 图解网络介绍 | 小林coding (xiaolincoding.com)
[2] 计算机网络.谢希仁