从浏览器到服务器:TCP 段的网络传输之旅
本文以简化的网络架构为例,详细介绍了当你在浏览器中输入网址(例如www.google.com)并按下回车键后,TCP段的完整传输过程。我们将探讨DNS解析、ARP、TCP/IP封装、PAT和路由如何协同工作,将数据从个人电脑通过局域网和广域网发送到谷歌的服务器。需要注意的是,本文为了便于学习,展示的是一个基础案例,而实际应用中的网络实现往往更为复杂。
1. DNS解析:将域名转换为IP地址
当你输入www.google.com这样的域名时,浏览器首先需要将其解析为IP地址才能发起通信,步骤如下:
- 系统会检查本地DNS缓存,包括/etc/hosts文件或操作系统缓存。
- 如果在本地缓存中未找到对应记录,就会向电脑中配置的DNS服务器(通常由互联网服务提供商或路由器提供)发送DNS查询请求。
- DNS服务器会返回对应的IP地址(例如142.250.190.132)。
- 此时,浏览器已准备好与目标IP地址建立TCP连接。
2. 准备建立TCP连接
在发送数据包之前,系统需要做一些准备工作:
- 源IP地址:网卡的IP地址。
- 目的IP地址:从DNS服务器获取到的IP地址。
- 源MAC地址:网卡的MAC地址。
- 目的MAC地址:
- 如果目标设备与本机在同一子网,可通过ARP协议获取其MAC地址。
- 如果目标设备在不同子网(通常情况如此),数据包必须经过默认网关转发,因此需要获取网关的MAC地址。
系统如何获取网关的MAC地址:通过ARP(地址解析协议)
- 利用子网掩码判断目标设备是否在子网外。
- 如果是,发送ARP广播:“谁拥有192.168.1.1这个IP地址?”
- 网关会回复其MAC地址。
- 个人电脑会将该MAC地址缓存起来,以便后续进行帧封装。
3. 数据封装:四层协议栈
- 应用层(HTTP消息):
- 例如,GET / HTTP/1.1请求。
- 传输层(TCP段):
- 添加源端口和目的端口(例如,40000 → 443,443是HTTPS的默认端口),源端口是操作系统分配的动态端口(1024-65535,例如40000)。
- 必要时对数据进行分段。
- 网络层(IP数据包):
- 添加源IP地址和目的IP地址。
- 其他字段:TTL(生存时间)、校验和等。
- 数据链路层(以太网帧):
- 添加源MAC地址和目的MAC地址。
- 包含一个带有FCS(帧校验序列)的尾部,用于错误检查。
最后,完整的以太网帧会被发送到局域网交换机。
4. 通过交换机发送到网关(第二层)
交换机维护着一张MAC地址表。例如:00:1A:2B:3C:4D:5E → Gi0/1, VLAN 10,表示拥有该MAC地址的设备连接在Gi0/1端口。
- 当交换机从某个端口接收到帧时,会检查源MAC地址与该端口的映射关系是否存在于表中。如果不存在,就将该映射添加到表中。
- 交换机检查网关的目的MAC地址是否存在于表中。
- 如果不存在,交换机就会将帧从除源端口之外的所有端口发送出去。网关收到广播帧后,会回复其MAC地址(例如00:1A:2B:3C:4D:5E)。交换机随后会将这个MAC地址与端口的映射记录到表中,这样后续发往网关的帧就可以直接转发(不再需要广播)。
5. 网关执行PAT(端口地址转换)
如果个人电脑使用私有IP地址,边缘路由器(PAT设备)必须进行地址转换:
- 源IP地址:从私有IP地址(例如192.168.1.100)转换为路由器的公网IP地址(例如203.0.113.10)。
- 源端口:替换为临时的公网端口(例如50000)。
- PAT表条目:192.168.1.100:8080 → 203.0.113.10:50000。
之后,路由器会将修改后的IP数据包转发到广域网。
6. 广域网中的路由器:寻找最短路径
路由表的构建方式有两种:手动配置(静态路由)或通过动态路由协议自动生成(例如,用于内部网络的OSPF协议、用于互联网服务提供商之间通信的BGP协议)。这些协议通过交换路径信息来找到最佳路由。每台广域网路由器都维护着一个路由表数据库,该数据库将目的IP网络映射到:
- “下一跳”路由器(路径中的下一台路由器)。
- 出接口(用于发送数据包的物理端口)。
- 度量值(例如跳数、带宽、延迟),用于确定“最佳”路径。
路由决策过程:
- 检查IP头部:TTL、校验和等。
- 最长前缀匹配:将目的IP地址与最具体的网络进行匹配。
- 选择最佳路径:基于成本最低的度量值。
- 更新头部:
- 递减TTL值。
- 将目的MAC地址替换为下一跳路由器的MAC地址。
- 转发到下一跳路由器。
这个过程会逐跳重复,直到数据包到达目标所在的本地互联网服务提供商。
7. 最终交付与解封装
最后一台路由器确定该数据包属于某个直接连接的局域网段:
- 它将帧转发到交换机或直接转发到服务器。
- 服务器接收到帧后开始解封装:
- 数据链路层 → 网络层 → TCP段 → HTTP消息。
- 该消息最终由应用程序(例如Nginx或Apache等Web服务器)处理。
8. 服务器如何响应
服务器的响应遵循与请求相同的封装过程,但源IP地址、目的IP地址以及源端口、目的端口是反向的(例如,源IP地址:谷歌服务器的IP地址;目的IP地址:经过PAT转换后的个人电脑私有IP地址)。
- 服务器生成响应并发送回去。
- 在第一台路由器(PAT网关)处,利用PAT表进行映射:203.0.113.10:50000 → 192.168.1.100:8080。
- 路由器相应地重写IP地址和端口字段,并将数据包转发回个人电脑。