遵循 TCP/IP 四层模型,详细描述一台终端访问 www.taobao.com 的完整过程。这是一个典型的 HTTP over TCP over IP over Ethernet 场景。
场景概述
终端:一台已接入局域网的电脑,IP为 192.168.1.100,MAC为 AA:BB:CC:11:22:33。
网关/路由器:IP为 192.168.1.1,MAC为 AA:BB:CC:44:55:66。
目标:访问 www.taobao.com,其服务器IP(假设)为 140.205.94.189。
链路:终端 → 家用路由器 → 运营商网络 → 互联网 → 淘宝CDN/服务器。
第一阶段:应用层 - 发起请求与域名解析
用户行为:用户在浏览器地址栏输入 http://www.taobao.com 并按下回车。
应用层协议(HTTP/DNS):
本地解析:浏览器首先检查本地缓存(如hosts文件、浏览器DNS缓存)是否有 www.taobao.com 的IP记录。若无,则调用操作系统API发起DNS查询。
DNS协议(应用层):
操作系统生成一个 DNS查询报文(内容:"请问 www.taobao.com 的A记录是什么?")。
该报文被封装成一个 DNS over UDP 的请求(默认使用UDP端口53)。
此时,数据单元是一个DNS查询/响应消息。
第二阶段:传输层 - 建立端到端通信
传输层协议(UDP for DNS):
操作系统为这个DNS查询分配一个随机的源端口(如 54321),目标端口为 53。
UDP头部被添加到DNS消息前,包含源/目标端口号和长度校验和。
此时,数据单元变成一个UDP数据报。
第三阶段:网络层 - 路由与逻辑寻址
网络层协议(IP):
操作系统查询本地路由表,决定这个目标(DNS服务器IP,如 8.8.8.8)的数据包应该发送给谁。对于非本地网络地址,下一跳都是默认网关 192.168.1.1。
生成 IP头部:
源IP: 192.168.1.100
目标IP: 8.8.8.8(DNS服务器)
协议字段: 17(表示载荷是UDP)
IP头部被添加到UDP数据报前。
此时,数据单元变成一个IP数据包。
ARP查询(若需要):
为了将IP数据包发送给网关 192.168.1.1,终端需要知道网关的MAC地址。
终端检查本地ARP缓存。若无记录,则在局域网内广播一个 ARP请求帧:"谁的IP是 192.168.1.1?请告诉 192.168.1.100"。
网关 192.168.1.1 收到后,回复一个 ARP应答帧,包含自己的MAC地址 AA:BB:CC:44:55:66。终端将其存入缓存。
第四阶段:网络接口层 - 物理帧封装与传输
网络接口层协议(以太网):
根据ARP结果,操作系统构造一个以太网帧:
目标MAC: AA:BB:CC:44:55:66(网关)
源MAC: AA:BB:CC:11:22:33(终端)
类型字段: 0x0800(表示载荷是IPv4)
将IP数据包封装为此帧的数据载荷,并附加帧尾校验序列(FCS)。
此时,数据单元变成一个以太网帧。
物理传输:
网卡将帧转换为电信号/光信号/无线电波,通过网线/空中发送到交换机,交换机根据MAC地址表将其转发到连接网关路由器的端口。
第五阶段:网络路径上的逐跳转发
网关及后续路由器处理:
网关(家用路由器)收到以太网帧,检查目标MAC是自己,于是解封装,取出IP数据包。
路由器检查IP包的目标IP 8.8.8.8,非本机,需要进行路由转发。
它根据自身的路由表,决定下一跳地址(运营商边缘路由器),并查询其MAC地址(通过ARP或在广域网链路上使用PPP/HDLC等协议)。
重新封装:丢弃旧的以太网头部,为IP数据包封装一个新的链路层头部(目标MAC变为下一跳路由器的MAC,源MAC变为自己的出接口MAC)。
这个过程在互联网的每一跳路由器上重复,直到数据包到达DNS服务器 8.8.8.8。IP头部中的源/目标IP在整个过程中保持不变(除非涉及NAT),但每跳的链路层封装都会改变。
第六阶段:返回响应与建立TCP连接
DNS响应:
DNS服务器 8.8.8.8 收到请求后,递归或迭代查询,最终获得 www.taobao.com 的IP地址 140.205.94.189。
它构建一个 DNS响应报文,按照原路(反向路径)返回给终端 192.168.1.100。这个过程同样经历网络层、链路层的封装与转发。
终端操作系统收到DNS响应后,将 www.taobao.com -> 140.205.94.189 的映射存入缓存,并将IP地址返回给浏览器。
传输层协议(TCP) - 三次握手:
浏览器获得目标IP后,要求操作系统建立一条TCP连接到 140.205.94.189:80。
第一次握手(SYN):
操作系统生成一个TCP段,设置 SYN=1,序列号 Seq=J,源端口随机(如 50000)。
该TCP段被封装进IP包(目标IP: 140.205.94.189),再封装进以太网帧,发送出去。
第二次握手(SYN+ACK):
淘宝服务器收到SYN包,同意连接,回复 SYN=1, ACK=1,确认号 Ack=J+1,并生成自己的序列号 Seq=K。
第三次握手(ACK):
终端收到SYN+ACK包,回复 ACK=1,确认号 Ack=K+1。
至此,TCP连接建立成功。这是一个可靠的、面向字节流的通道。
第七阶段:应用层HTTP通信与网页渲染
应用层协议(HTTP) - 请求网页:
通过已建立的TCP连接,浏览器构造一个 HTTP GET 请求报文:
text
GET / HTTP/1.1
Host: www.taobao.com
Connection: keep-alive
User-Agent: Mozilla/5.0...
(其他头部信息)
该HTTP报文作为TCP的载荷,被可靠地传输到服务器。
服务器响应:
淘宝的Web服务器(或负载均衡器/CDN节点)收到请求,处理并生成 HTTP响应报文:
状态行: HTTP/1.1 200 OK
头部: Content-Type: text/html; charset=utf-8, Content-Length: ...
实体主体:网页的HTML代码。
这个HTTP响应同样通过TCP连接分片(如果很大)传回终端。
浏览器渲染:
浏览器收到HTTP响应后,解析HTML,开始渲染。
在解析过程中,发现HTML中引用了大量其他资源(CSS、JS、图片等),这些资源的URL可能指向不同的CDN域名。
重复上述整个过程:为每个新域名发起DNS查询(可能并行),建立新的TCP连接(HTTP/1.1可能复用),发送HTTP请求,获取资源,最终完成整个页面的加载和渲染。
第八阶段:连接终止
传输层协议(TCP) - 四次挥手:
当页面加载完成且一段时间无活动后,TCP连接会优雅关闭。
第一次挥手:浏览器端发送 FIN 段。
第二次挥手:服务器回复 ACK 段。
第三次挥手:服务器发送自己的 FIN 段。
第四次挥手:浏览器回复最后的 ACK 段,连接完全关闭
