一、从输入网址到页面加载,中间发生了什么?
你在浏览器输入一个网址,按回车,页面加载完成。
这个过程涉及了哪些环节?
本文从数据包的角度,完整拆解一次网络请求的全过程------从发送端的数据封装开始,经过中间设备的转发,到接收端的解封装结束。
二、数据在发送端:自上而下的封装过程
当你在浏览器输入某个网址并按下回车,数据从应用层开始,逐层向下传递,每一层添加对应的控制信息。
2.1 应用层
浏览器构造一个HTTP请求报文,包含请求行、请求头和请求体。例如:
text
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Chrome/...
这段文本就是应用层的数据。HTTP协议负责定义客户端与服务器之间通信的格式。
应用层将这段数据交给传输层处理。此时的数据单位称为数据(Data)。
2.2 传输层(TCP/UDP)
传输层收到应用层的数据后,根据应用层的需求选择TCP或UDP协议。
这里以TCP为例。传输层将数据分割成适当大小的数据段,并封装TCP头部。TCP头部包含以下关键字段:
| 字段 | 说明 |
|---|---|
| 源端口(Source Port) | 浏览器随机分配的端口号 |
| 目的端口(Destination Port) | 80(HTTP)或443(HTTPS) |
| 序列号(Sequence Number) | 数据段的编号,用于接收端重组 |
| 确认号(Acknowledgment Number) | 确认已收到的数据 |
| 标志位(Flags) | SYN、ACK、FIN等控制标志 |
封装完成后,数据单元称为数据段(Segment),交给网络层处理。
2.3 网络层(IP)
网络层收到数据段后,进行以下操作:
-
在数据段前面封装IP头部
-
查询路由表,决定从哪个网卡发出
IP头部包含以下关键字段:
| 字段 | 说明 |
|---|---|
| 源IP地址(Source IP) | 发送设备的IP地址 |
| 目的IP地址(Destination IP) | 接收设备的IP地址 |
| TTL(Time to Live) | 数据包的生存时间(跳数限制) |
| 协议号(Protocol) | 标识上层协议(6=TCP,17=UDP) |
封装完成后,数据单元称为数据包(Packet),交给数据链路层处理。
2.4 数据链路层(以太网)
数据链路层收到数据包后,进行以下操作:
-
在IP包前面封装MAC头部
-
在IP包后面添加FCS(帧校验序列)尾部
MAC头部包含以下关键字段:
| 字段 | 说明 |
|---|---|
| 源MAC地址 | 发送网卡的MAC地址 |
| 目的MAC地址 | 下一跳设备的MAC地址(网关或目标设备) |
| 类型(Type) | 标识上层协议(0x0800=IPv4) |
FCS尾部包含CRC校验码,用于接收端检测数据是否在传输过程中出错。
封装完成后,数据单元称为数据帧(Frame),交给物理层处理。
2.5 物理层
物理层将数据帧转换为比特流(0和1的序列),通过物理介质(网线、光纤、WiFi)发送出去。
三、数据在传输路径上的转发过程
数据从发送端发出后,经过多个网络设备的处理,最终到达接收端。
3.1 交换机:二层转发
数据到达交换机时,交换机工作在数据链路层,只查看MAC头部:
-
检查目的MAC地址
-
查找MAC地址表,确定对应的端口
-
从该端口转发数据帧
如果MAC地址表中没有对应的记录,交换机将数据帧从除接收端口外的所有端口广播出去------称为"洪泛"(Flooding)。目标设备收到后回应,交换机据此学习并记录新的MAC地址映射。
交换机的核心功能:在同一网络内,根据MAC地址转发数据帧。
交换机不检查IP头部,不关心数据内容。
3.2 路由器:三层转发
如果数据的目的IP不在当前子网内,数据会被发送到网关(路由器)。路由器工作在网络层:
-
剥离MAC头部,查看IP头部
-
检查目的IP地址
-
查询路由表,确定下一跳地址
-
重新封装MAC头部(源MAC变为路由器出口的MAC,目的MAC变为下一跳设备的MAC)
-
从对应端口转发数据包
路由器的核心功能:在不同网络之间,根据IP地址转发数据包。
每经过一个路由器,MAC地址会变化,但IP地址保持不变。TTL值减1。
四、数据在接收端:自下而上的解封装过程
数据到达接收端服务器后,过程完全反过来。
4.1 物理层
物理层收到比特流,还原为数据帧,交给数据链路层。
4.2 数据链路层
数据链路层执行以下操作:
-
检查FCS校验码,确认数据在传输过程中没有出错
-
如果校验通过,剥离MAC头部和FCS尾部
-
查看MAC头部中的"类型"字段(0x0800=IPv4),确定上层协议
-
将数据包交给网络层
4.3 网络层
网络层执行以下操作:
-
检查IP头部,确认目的IP地址是否为本机
-
剥离IP头部
-
查看IP头部中的"协议"字段(6=TCP),确定上层协议
-
将数据段交给传输层
4.4 传输层
传输层执行以下操作:
-
检查TCP头部,确认目的端口号
-
检查序列号是否连续,确认没有丢包
-
剥离TCP头部
-
将数据交给应用层
4.5 应用层
应用层收到原始数据,根据协议(HTTP)解析请求,生成响应(HTTP响应报文),通过同样的路径返回给客户端。
五、一个完整的传输路径图解
text
发送端 接收端
┌─────────────┐ ┌─────────────┐
│ 应用层 │ │ 应用层 │
│ HTTP请求 │ │ HTTP请求 │
└──────┬──────┘ └──────▲──────┘
│ 添加TCP头部 │ 剥离TCP头部
┌──────▼──────┐ ┌──────┴──────┐
│ 传输层 │ │ 传输层 │
│ TCP头部 │ │ TCP头部 │
│ + 数据 │ │ + 数据 │
└──────┬──────┘ └──────▲──────┘
│ 添加IP头部 │ 剥离IP头部
┌──────▼──────┐ ┌──────┴──────┐
│ 网络层 │ │ 网络层 │
│ IP头部 │ │ IP头部 │
│ + TCP头部 │ │ + TCP头部 │
│ + 数据 │ │ + 数据 │
└──────┬──────┘ └──────▲──────┘
│ 添加MAC头部+FCS │ 剥离MAC头部+FCS
┌──────▼──────┐ ┌──────┴──────┐
│ 数据链路层 │ │ 数据链路层 │
│ MAC头部 │ │ MAC头部 │
│ + IP头部 │ │ + IP头部 │
│ + TCP头部 │ │ + TCP头部 │
│ + 数据 + FCS│ │ + 数据 + FCS│
└──────┬──────┘ └──────▲──────┘
│ 转换为比特流 │ 还原为帧
┌──────▼──────┐ ┌───────┐ ┌──────┐ ┌──────┴──────┐
│ 物理层 │───│交换机 │───│路由器│───│ 物理层 │
│ 比特流 │ │(二层) │ │(三层)│ │ 比特流 │
└─────────────┘ └───────┘ └──────┘ └─────────────┘
最后
数据包在网络上传输的过程,可以概括为三个阶段:
-
发送端封装:数据自上而下逐层封装,每层添加控制信息
-
网络转发:交换机根据MAC地址转发,路由器根据IP地址转发
-
接收端解封装:数据自下而上逐层剥离,恢复原始数据
每一层只处理自己负责的信息,对上层数据内容不关心。这种分层设计保证了网络的灵活性和可扩展性。