MAC 头部
字段名称 | 长度(字节) | 描述 |
---|---|---|
目标 MAC 地址 | 6 | 接收设备的 MAC 地址。 |
源 MAC 地址 | 6 | 发送设备的 MAC 地址。 |
以太网类型/长度 | 2 | 表示上层协议类型(如 IPv4、IPv6)或数据长度(以太网 II 或 802.3)。 |
数据负载 | 46-1500 | 上层协议封装的数据,长度 46~1500 字节。 |
帧校验序列(FCS) | 4 | CRC32 校验,用于检测帧传输中的错误。 |
IPv4 头部
字段名称 | 长度(位) | 描述 |
---|---|---|
版本号 | 4 | 指定 IP 协议版本,IPv4 的值为 4。 |
首部长度 | 4 | 指定 IP 首部的长度(以 4 字节为单位)。 |
服务类型(TOS) | 8 | 指示服务质量(如低延迟、高吞吐量)。 |
总长度 | 16 | 表示整个数据包的长度,包括头和数据。 |
标识 | 16 | 用于区分不同的分片。 |
标志 | 3 | 控制分片行为,如“更多分片”标志(MF)。 |
片偏移 | 13 | 分片数据在原数据包中的偏移量。 |
生存时间(TTL) | 8 | 表示数据包在网络中生存的最大跳数。 |
协议 | 8 | 指示上层协议类型(如 6 表示 TCP,17 表示 UDP)。 |
头校验和 | 16 | 对 IP 头进行校验,确保数据完整性。 |
源 IP 地址 | 32 | 表示发送方的 IP 地址。 |
目的 IP 地址 | 32 | 表示接收方的 IP 地址。 |
选项(可选部分) | 可变 | 用于扩展功能,如安全性和时间戳。 |
数据部分 | 可变 | 上层协议的数据。 |
IPv6 头部
字段名称 | 长度(位) | 描述 |
---|---|---|
版本号 | 4 | 指定 IP 协议版本,IPv6 的值为 6。 |
流量类别 | 8 | 指示数据包的服务类型和优先级。 |
流标识 | 20 | 用于标识数据流,支持 QoS(服务质量)。 |
有效载荷长度 | 16 | 数据部分的长度(不包括头部)。 |
下一个头部 | 8 | 指示上层协议(如 TCP:6,UDP:17,ICMPv6:58)。 |
跳限制(Hop Limit) | 8 | 数据包可经过的最大路由跳数,类似 IPv4 的 TTL。 |
源地址 | 128 | 发送方的 IPv6 地址。 |
目的地址 | 128 | 接收方的 IPv6 地址。 |
扩展头部(可选) | 可变 | 包括路由头、分片头、认证头等。 |
数据部分 | 可变 | 封装的传输层协议数据。 |
TCP 头部
字段名称 | 长度(位) | 描述 |
---|---|---|
源端口号 | 16 | 发送方的端口号。 |
目的端口号 | 16 | 接收方的端口号。 |
序列号 | 32 | 数据流中第一个字节的编号。 |
确认号 | 32 | 表示期望接收的下一个字节序号。 |
数据偏移 | 4 | TCP 头的长度(以 4 字节为单位)。 |
保留位 | 6 | 保留字段,目前未使用。 |
控制位 | 6 | 标志位,用于连接和数据流控制(如 SYN、ACK、FIN 等)。 |
窗口大小 | 16 | 用于流量控制,表示接收方可接收的数据量。 |
校验和 | 16 | 检测头部和数据部分是否完整。 |
紧急指针 | 16 | 紧急数据的位置,仅在 URG 标志位置位时有效。 |
选项 | 可变 | 包括 MSS(最大报文段大小)等扩展功能。 |
数据部分 | 可变 | 封装的应用层数据。 |
UDP 头部
字段名称 | 长度(位) | 描述 |
---|---|---|
源端口号 | 16 | 发送方的端口号。 |
目的端口号 | 16 | 接收方的端口号。 |
长度 | 16 | 整个 UDP 数据报的长度,包括头部和数据部分。 |
校验和 | 16 | 用于检测数据报是否完整。 |
数据部分 | 可变 | 封装的应用层数据。 |
场景:用户浏览网页的详细过程
1. 用户输入 URL
用户在浏览器中输入 URL(例如
http://www.example.com
),并按下回车键。
- 应用层协议:HTTP
- 浏览器生成一个 HTTP 请求:
- 方法:
GET
- URL:
http://www.example.com
- HTTP 版本:
HTTP/1.1
- 其他头部字段(如 User-Agent、Host)。
- 目标是从服务器获取网页内容。
2. DNS 查询
为了知道
www.example.com
对应的服务器 IP 地址,浏览器首先发起 DNS 查询。
应用层:DNS 请求
- 浏览器检查本地 DNS 缓存。如果没有找到 IP 地址,则构造一个 DNS 查询报文。
- 查询目标为
www.example.com
的 IP 地址。传输层:UDP 协议
- DNS 查询被封装在 UDP 数据段中。
- UDP 头部包含:
- 源端口号:随机分配(例如 51000)。
- 目标端口号:53(DNS 服务器的标准端口)。
网络层:IPv4/IPv6
- UDP 数据段被封装在 IP 数据包中。
- IP 头部包含:
- 源 IP 地址:用户设备的 IP 地址(如
192.168.1.100
)。- 目标 IP 地址:DNS 服务器的 IP 地址。
链路层:以太网帧
- IP 数据包被封装在以太网帧中。
- MAC 头部包含:
- 源 MAC 地址:用户设备的 MAC 地址。
- 目标 MAC 地址:路由器的 MAC 地址(下一跳)。
DNS 响应
- DNS 服务器返回
www.example.com
的 IP 地址(如93.184.216.34
),使用类似的封装方式。
3. 建立 TCP 连接
得到服务器的 IP 地址后,浏览器与
93.184.216.34
建立 TCP 连接。(1) 三次握手过程
第一次握手:SYN
- 客户端生成一个 TCP SYN 包,请求建立连接。
- TCP 头部:
- 标志位:SYN=1,ACK=0。
- 序列号:随机生成(如 1000)。
- IP 头部:
- 源 IP 地址:
192.168.1.100
。- 目标 IP 地址:
93.184.216.34
。- MAC 头部:
- 源 MAC 地址:用户设备的 MAC 地址。
- 目标 MAC 地址:路由器的 MAC 地址(或下一跳设备)。
第二次握手:SYN-ACK
- 服务器响应 TCP SYN 包,返回 SYN-ACK。
- TCP 头部:
- 标志位:SYN=1,ACK=1。
- 序列号:随机生成(如 3000)。
- 确认号:客户端序列号 + 1(即 1001)。
第三次握手:ACK
- 客户端发送 ACK 包,确认连接已建立。
- TCP 头部:
- 标志位:ACK=1。
- 确认号:服务器序列号 + 1(即 3001)。
4. 发送 HTTP 请求
TCP 连接建立后,浏览器通过 HTTP 协议 向服务器发送网页请求。
HTTP 请求内容
- GET
/index.html HTTP/1.1
。- Host:
www.example.com
。封装过程
- 传输层:TCP
- HTTP 数据被封装在 TCP 数据段中。
- TCP 头部:
- 源端口号:随机分配(如 51001)。
- 目标端口号:80(HTTP 的标准端口)。
- 网络层:IP
- TCP 数据段被封装在 IP 数据包中。
- IP 头部:
- 源 IP 地址:用户设备的 IP 地址。
- 目标 IP 地址:服务器的 IP 地址。
- 链路层:以太网
- IP 数据包被封装在以太网帧中。
- MAC 头部:
- 源 MAC 地址:用户设备的 MAC 地址。
- 目标 MAC 地址:路由器的 MAC 地址。
5. 服务器响应
服务器接收到 HTTP 请求后,处理并返回网页内容。
HTTP 响应内容
- HTTP/1.1 200 OK
- Content-Type: text/html
- 网页的 HTML 数据。
封装过程
- 传输层:TCP
- HTTP 响应数据被封装在 TCP 数据段中。
- TCP 头部:
- 源端口号:80。
- 目标端口号:51001(客户端的端口)。
- 网络层:IP
- TCP 数据段被封装在 IP 数据包中。
- IP 头部:
- 源 IP 地址:服务器的 IP 地址。
- 目标 IP 地址:客户端的 IP 地址。
- 链路层:以太网
- IP 数据包被封装在以太网帧中。
- MAC 头部:
- 源 MAC 地址:服务器的 MAC 地址。
- 目标 MAC 地址:下一跳路由器的 MAC 地址。
6. 浏览器解析网页
浏览器收到服务器返回的 HTTP 响应后,解封装数据:
- 链路层: 检查 MAC 地址,确认帧是给自己的,移除 MAC 头。
- 网络层: 检查 IP 地址,确认包是给自己的,移除 IP 头。
- 传输层: 检查 TCP 序列号和确认号,按序重组数据,移除 TCP 头。
- 应用层: 提取 HTTP 数据(网页内容)。
浏览器根据 HTML 内容渲染网页,并显示给用户。
7. 释放连接
当网页加载完成,浏览器和服务器通过 TCP 四次挥手 释放连接。
四次挥手过程
- 客户端发送 FIN 包:
- 表示客户端关闭数据发送。
- TCP 头部:FIN=1,ACK=1。
- 服务器回复 ACK 包:
- 表示已接收关闭请求。
- TCP 头部:ACK=1。
- 服务器发送 FIN 包:
- 表示服务器关闭数据发送。
- TCP 头部:FIN=1,ACK=1。
- 客户端回复 ACK 包:
- 表示已接收服务器的关闭请求。
- TCP 头部:ACK=1。