小结:从**应用层**到**物理层**的封装(bit帧包段)

发布于:2025-02-10 ⋅ 阅读:(104) ⋅ 点赞:(0)

网络协议栈的不同层次

在网络协议栈的不同层次,数据的封装形式和数据结构大小因协议而异。以下是按照OSI七层模型或TCP/IP模型的每一层次,数据封装的类型、大小范围及其数据结构的分析:


1. 物理层(Physical Layer)

  • 封装形式Bit(比特流)
  • 数据结构:0 和 1 组成的序列,由物理信号(如电压高低、光脉冲等)表示。
  • 大小:没有固定大小,连续的比特流。
  • 类型
    • 二进制位。
    • 通过硬件传输(如光纤、网线、无线电波)。

2. 数据链路层(Data Link Layer)

  • 封装形式Frame(帧)
  • 数据结构
    1. 帧头:包含目标MAC地址、源MAC地址、帧类型/长度等字段。
    2. 数据字段:包含网络层传递下来的数据。
    3. 帧尾:包含校验信息(如FCS)。
  • 大小范围
    • 以太网帧:64字节(最小帧)到1518字节(标准最大帧)或1522字节(带VLAN)。
    • 特殊协议支持巨型帧(Jumbo Frame):最大9000字节。
  • 类型
    • 以太网帧(IEEE 802.3)。
    • 无线局域网帧(IEEE 802.11)。

3. 网络层(Network Layer)

  • 封装形式Packet(包)
  • 数据结构
    1. 包头:包含源IP地址、目标IP地址、TTL(生存时间)、协议类型等。
    2. 数据字段:包含传输层传递的数据。
  • 大小范围
    • IPv4包:20字节(最小头部)到65535字节(最大大小,包括头部和数据)。
    • IPv6包:40字节(固定头部)加可变大小的扩展头部和数据。
  • 类型
    • IPv4包
    • IPv6包

4. 传输层(Transport Layer)

  • 封装形式Segment(段,TCP)Datagram(数据报,UDP)
  • 数据结构
    1. 段头/报头
      • TCP段头:包含源端口号、目标端口号、序列号、确认号、窗口大小、校验和等。
      • UDP报头:包含源端口号、目标端口号、长度、校验和。
    2. 数据字段:包含应用层传递的数据。
  • 大小范围
    • TCP段
      • 段头:20字节(最小)到60字节(含可选字段)。
      • 数据:受网络层MTU(最大传输单元)限制。
    • UDP数据报
      • 报头:8字节。
      • 数据:最大65507字节(总大小不超过65535字节,减去IP头)。
  • 类型
    • 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(消息) 应用定义的任意数据 没有限制,通常依赖于传输层的可靠性和分片能力。

常见网络协议对应的大小

  1. 以太网(MTU):默认1500字节。
  2. IPv4包:最大65535字节。
  3. TCP段:受MTU限制(如以太网中为1460字节)。
  4. 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地址则根据每一跳的变化而更新。这确保了即使跨多个网段,数据也能准确无误地传送到目的地。


网站公告

今日签到

点亮在社区的每一天
去签到