网络协议栈的不同层次
在网络协议栈的不同层次,数据的封装形式和数据结构大小因协议而异。以下是按照OSI七层模型或TCP/IP模型的每一层次,数据封装的类型、大小范围及其数据结构的分析:
1. 物理层(Physical Layer)
- 封装形式:Bit(比特流)
- 数据结构:0 和 1 组成的序列,由物理信号(如电压高低、光脉冲等)表示。
- 大小:没有固定大小,连续的比特流。
- 类型:
- 二进制位。
- 通过硬件传输(如光纤、网线、无线电波)。
2. 数据链路层(Data Link Layer)
- 封装形式:Frame(帧)
- 数据结构:
- 帧头:包含目标MAC地址、源MAC地址、帧类型/长度等字段。
- 数据字段:包含网络层传递下来的数据。
- 帧尾:包含校验信息(如FCS)。
- 大小范围:
- 以太网帧:64字节(最小帧)到1518字节(标准最大帧)或1522字节(带VLAN)。
- 特殊协议支持巨型帧(Jumbo Frame):最大9000字节。
- 类型:
- 以太网帧(IEEE 802.3)。
- 无线局域网帧(IEEE 802.11)。
3. 网络层(Network Layer)
- 封装形式:Packet(包)
- 数据结构:
- 包头:包含源IP地址、目标IP地址、TTL(生存时间)、协议类型等。
- 数据字段:包含传输层传递的数据。
- 大小范围:
- IPv4包:20字节(最小头部)到65535字节(最大大小,包括头部和数据)。
- IPv6包:40字节(固定头部)加可变大小的扩展头部和数据。
- 类型:
- IPv4包。
- IPv6包。
4. 传输层(Transport Layer)
- 封装形式:Segment(段,TCP) 或 Datagram(数据报,UDP)
- 数据结构:
- 段头/报头:
- TCP段头:包含源端口号、目标端口号、序列号、确认号、窗口大小、校验和等。
- UDP报头:包含源端口号、目标端口号、长度、校验和。
- 数据字段:包含应用层传递的数据。
- 段头/报头:
- 大小范围:
- TCP段:
- 段头:20字节(最小)到60字节(含可选字段)。
- 数据:受网络层MTU(最大传输单元)限制。
- UDP数据报:
- 报头:8字节。
- 数据:最大65507字节(总大小不超过65535字节,减去IP头)。
- TCP段:
- 类型:
- TCP段。
- UDP数据报。
5. 应用层(Application Layer)
- 封装形式:Message(消息) 或 Data(数据)
- 数据结构:
- 完全由应用定义,可能是文本、二进制数据、文件、音视频流等。
- 大小范围:
- 没有严格限制,取决于具体应用和协议。
- 大数据通常会分片传输,由传输层分段处理。
- 类型:
- HTTP请求/响应消息。
- DNS查询。
- SMTP邮件数据。
封装过程与数据大小关系
以下是典型封装过程和限制的数据大小:
层次 | 封装形式 | 数据结构 | 大小范围 |
---|---|---|---|
物理层 | Bit(比特) | 连续的0和1组成的信号流 | 无限制,具体取决于传输速率和媒介。 |
数据链路层 | Frame(帧) | MAC地址、长度/类型字段、数据字段、校验和 | 64字节到1518字节(以太网标准)。 |
网络层 | Packet(包) | IP头部、数据字段 | 20到65535字节(IPv4最大长度)。 |
传输层 | Segment(段) | 端口号、序列号、确认号、数据字段 | 最大受网络层MTU限制(通常小于1500字节)。 |
应用层 | Message(消息) | 应用定义的任意数据 | 没有限制,通常依赖于传输层的可靠性和分片能力。 |
常见网络协议对应的大小
- 以太网(MTU):默认1500字节。
- IPv4包:最大65535字节。
- TCP段:受MTU限制(如以太网中为1460字节)。
- UDP数据报:最大65507字节(IP头部20字节+UDP头部8字节)。
不同层次的数据封装会逐层增加头部信息,导致实际可用的数据大小减少。
bin,帧,包,段结构
标准以太网帧 64~1518字节
+-------------------------------------------------------------------------------------+
| 应用层 (Application Layer) |
| 数据单元: 消息 (Message) / 数据 (Data) |
| 封装形式: 原始数据 |
| 示例: HTTP请求/响应、DNS查询、邮件内容等 |
+-------------------------------------------------------------------------------------+
↓ 封装
+-------------------------------------------------------------------------------------+
| 传输层 (Transport Layer) |
| 数据单元: TCP段 (Segment) 或 UDP数据报 (Datagram) |
| 封装内容: |
| - 段头: |
| 源端口、目的端口、序列号、确认号、控制位、窗口大小、校验和等 |
| - 数据: 应用层数据 |
| 示例: TCP段(用于可靠传输)或 UDP数据报(无连接传输) |
| 数据大小: TCP段头 20~60字节,UDP报头 8字节,数据字段受网络层MTU限制 |
+-------------------------------------------------------------------------------------+
↓ 封装
+-------------------------------------------------------------------------------------+
| 网络层 (Network Layer) |
| 数据单元: 包 (Packet) |
| 封装内容: |
| - 包头: |
| 源IP地址、目的IP地址、TTL、协议类型、标志、分片偏移、校验和等 |
| - 数据: 传输层的段/数据报 |
| 示例: IPv4包、IPv6包 |
| 数据大小: IPv4包头 20~60字节,IPv6包头固定40字节 |
+-------------------------------------------------------------------------------------+
↓ 封装
+-------------------------------------------------------------------------------------+
| 数据链路层 (Data Link Layer) |
| 数据单元: 帧 (Frame) |
| 封装内容: |
| - 帧头: |
| 目标MAC地址、源MAC地址、类型/长度字段 |
| - 数据: 网络层的包 |
| - 帧尾: 帧校验序列 (FCS) |
| 示例: 以太网帧、Wi-Fi帧 |
| 数据大小: 标准以太网帧 64~1518字节 (或1522字节带VLAN),巨型帧最大9000字节 |
+-------------------------------------------------------------------------------------+
↓ 封装
+-------------------------------------------------------------------------------------+
| 物理层 (Physical Layer) |
| 数据单元: 比特流 (Bit Stream) |
| 封装内容: |
| - 物理信号: 电信号(高低电压)、光信号、无线电波等 |
| 示例: 光纤信号、以太网信号、电缆信号 |
| 数据大小: 无固定大小,取决于链路速率和传输时间 |
+-------------------------------------------------------------------------------------+
应用层到物理层的封装过程
以下是网络协议栈中每一层数据的示例,展示了从应用层到物理层的封装过程,标注了每一层的数据类型、数据结构和大致大小,并且以更清晰的格式逐层展开。
1. 应用层(Application Layer)
- 数据单元: 消息 (Message) 或 数据 (Data)
- 示例数据: 一个HTTP请求:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0
- 数据大小: 大小不固定,具体取决于应用数据的内容。
- 封装形式: 纯文本或二进制数据。
2. 传输层(Transport Layer)
- 数据单元: TCP段 (Segment) 或 UDP数据报 (Datagram)
- 示例: 将应用层的HTTP请求封装为TCP段。
- 封装后的数据:
+----------------------+-------------------+ | TCP段头部 | 应用层数据 | +----------------------+-------------------+ TCP段头部 (20字节): - 源端口: 12345 - 目标端口: 80 - 序列号: 1000 - 确认号: 0 - 数据偏移: 5 - 保留位: 0 - 控制位: SYN - 窗口大小: 8192 - 校验和: 0xFFFF - 紧急指针: 0
- 数据大小:
- TCP头部:20~60字节
- 数据部分:应用层数据(如HTTP请求)。
3. 网络层(Network Layer)
- 数据单元: 包 (Packet)
- 示例: 将TCP段封装为IPv4包。
- 封装后的数据:
+-----------------------+------------------+ | IP包头 | 传输层数据 (TCP段)| +-----------------------+------------------+ IP包头 (20字节): - 版本: 4 - 头部长度: 5 - 服务类型: 0 - 总长度: 60 - 标识符: 1234 - 标志: 0 - 分片偏移: 0 - TTL: 64 - 协议: 6 (TCP) - 头部校验和: 0x1A2B - 源IP地址: 192.168.1.2 - 目的IP地址: 203.0.113.1
- 数据大小:
- IP头部:20~60字节
- 数据部分:传输层数据(TCP段)。
4. 数据链路层(Data Link Layer)
- 数据单元: 帧 (Frame)
- 示例: 将IPv4包封装为以太网帧。
- 封装后的数据:
+----------------------+------------------+ | 帧头 | 网络层数据 (IP包)| +----------------------+------------------+ | 帧尾 | +----------------------+ 以太网帧结构: - 帧头 (14字节): - 前导码: 7字节 - 起始帧分隔符 (SFD): 1字节 - 目标MAC地址: 6字节 (00:1A:2B:3C:4D:5E) - 源MAC地址: 6字节 (00:1A:2B:3C:4D:5F) - 类型: 0x0800 (IPv4) - 数据部分: 网络层数据 (IP包) - 帧尾 (4字节): - 帧校验序列 (FCS)
- 数据大小:
- 帧头:14字节
- 数据部分:网络层数据(IP包)
- 帧尾:4字节
5. 物理层(Physical Layer)
- 数据单元: 比特流 (Bit Stream)
- 示例: 将以太网帧转化为电信号,形成比特流。
- 封装后的数据:
比特流示例: 1010101010101010 11111110 ... 目标MAC地址 ... 源MAC地址 ... 数据 ... 校验序列
- 数据大小: 无固定大小,取决于数据链路层帧的长度。
- 传输形式:
- 电信号(高低电压)
- 光信号(光脉冲)
- 无线信号(频率变化)
逐层封装完整示例
1. 应用层: HTTP请求
- GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
2. 传输层: TCP段
- 源端口: 12345
- 目标端口: 80
- 序列号: 1000
- 控制位: SYN
- 应用层数据: GET /index.html HTTP/1.1 ...
3. 网络层: IP包
- 源IP: 192.168.1.2
- 目标IP: 203.0.113.1
- 协议: TCP
- 数据: TCP段
4. 数据链路层: 以太网帧
- 目标MAC: 00:1A:2B:3C:4D:5E
- 源MAC: 00:1A:2B:3C:4D:5F
- 类型: IPv4
- 数据: IP包
5. 物理层: 比特流
- 1010101010101010 11111110 ... 数据链路层帧数据转为电信号
不同网段传输
当一个数据包需要从一个网段传输到另一个不同的网段时,确实涉及到ARP(地址解析协议)和DNS(域名系统)的使用,这些服务帮助确定如何将数据包正确地发送给下一跳。以下是更详细的流程说明:
1. DNS 查询
如果用户尝试访问的不是一个IP地址而是域名(如www.example.com),那么首先需要进行DNS查询来获取该域名对应的IP地址。
- 客户端:发起DNS请求,询问域名对应的IP地址。
- DNS服务器:响应包含对应IP地址的信息。
- 结果缓存:通常,DNS查询结果会被缓存一段时间以提高效率。
2. 确定下一跳
一旦得到了目的IP地址,源主机需要确定是否可以直接与目的主机通信,或者需要通过路由器(即下一跳)来转发数据包。
- 检查路由表:源主机检查其路由表,以确定到达目的IP地址的最佳路径。
- 直接连接:如果目的IP地址位于同一子网内,则不需要经过路由器,可以直接发送数据包。
- 通过路由器:如果目的IP地址位于不同的子网中,则数据包应该被发送到默认网关(通常是连接到当前子网的路由器)。
3. ARP 请求
当确定了下一跳是路由器或另一台主机后,源主机需要知道该设备的MAC地址,以便在数据链路层上构建帧并发送数据包。
- ARP广播:源主机发出ARP请求,询问哪个设备拥有特定的目的IP地址,并要求该设备回应其MAC地址。
- ARP回应:目标设备(下一跳路由器或最终目的主机)回复ARP应答,提供其MAC地址。
- 更新ARP缓存:源主机将收到的MAC地址信息添加到自己的ARP缓存中,以便将来快速查找。
4. 数据传输
有了目的MAC地址后,源主机可以构建完整的帧,并将数据包封装在这个帧中,然后通过物理网络发送出去。
- 构建帧:包括源MAC地址、目的MAC地址、类型/长度字段以及数据本身。
- 发送帧:帧通过物理网络介质(如电缆或无线信道)发送到下一跳设备。
5. 路由器处理
- 路由器接收到数据包后,会根据其路由表查找最佳路径,并决定下一个要转发到的路由器或直接送达的目的地。
- 在这个过程中,路由器
不会改变数据包的源IP地址和目的IP地址
,但会更新二层帧头信息(如MAC地址
),以便数据包可以在新的网段中继续传输。
每一跳的路由器都会重复这个过程,直到数据包最终到达目的地。每经过一次路由器,都会执行以下操作:
- 解封帧:剥离数据链路层的帧头,读取目的IP地址。
- 路由决策:根据内部路由表决定下一跳。
- ARP查询:如果必要,使用ARP来找到下一跳设备的MAC地址。
- 重建帧:用新的目的MAC地址重新封装数据包,继续发送。
总结
- DNS:用于将域名转换为IP地址。
- 路由选择:通过检查路由表确定下一跳。
- ARP:用于获取下一跳设备的MAC地址。
整个过程中,源IP地址和目的IP地址保持不变,而MAC地址则根据每一跳的变化而更新。这确保了即使跨多个网段,数据也能准确无误地传送到目的地。