UDP数据包封装过程

UDP 数据包在通过网络发送之前,需要被封装在 IP (网际协议) 数据报中。这个过程是 TCP/IP 协议栈中网络层 (IP) 为传输层 (UDP) 提供服务的关键步骤。以下是详细的封装过程:

  1. 应用层数据准备:

    • 应用程序(例如 DNS 客户端、简单的文件传输工具、视频流客户端等)生成需要发送的数据。

    • 应用程序指定目标 IP 地址和目标端口号,以及源端口号(通常由操作系统自动分配)。它使用 UDP 套接字 API 发送数据。

  2. 传输层 (UDP) 封装:

    • 操作系统中的 UDP 模块接收来自应用程序的数据和指定的目标端口、源端口。

    • 构建 UDP 首部: UDP 模块创建一个 8 字节的 UDP 首部,包含以下字段:

      • 源端口号 (16 位): 发送方应用程序的端口号。

      • 目的端口号 (16 位): 接收方应用程序的端口号。

      • 长度 (16 位): UDP 数据报的总长度(包括首部和数据),以字节为单位。

      • 校验和 (16 位): (可选但强烈推荐)用于检测 UDP 首部和数据在传输过程中可能发生的错误。计算时通常会引入一个 IP 伪首部。

    • 封装: UDP 模块将应用程序数据作为 载荷 (Payload) 附加在刚刚创建的 UDP 首部之后,形成一个完整的 UDP 数据报 (UDP Datagram)。结构如下:

      |<----------- UDP Datagram ------------>|
      +-----------------+---------------------+
      |   UDP Header    |   Application Data  |
      |   (8 bytes)     |     (Payload)       |
      +-----------------+---------------------+
  3. 网络层 (IP) 封装:

    • 操作系统将完整的 UDP 数据报(包括 UDP 首部和应用数据)向下传递给网络层 (IP 层)。

    • IP 层负责将数据跨越网络路由到目标主机。

    • 构建 IP 首部: IP 模块创建一个标准的 IP 首部(IPv4 通常是 20 字节,IPv6 是 40 字节)。关键的字段包括:

      • 版本 (4 位): 4 (IPv4) 或 6 (IPv6)。

      • 首部长度 (4 位 - IPv4) / 载荷长度 (16 位 - IPv6): IPv4 指 IP 首部的长度,IPv6 指 IP 首部之后数据的长度(即 UDP 数据报的长度)。

      • 服务类型 (8 位 - IPv4) / 流量类别 (8 位 - IPv6): 用于 QoS (服务质量)。

      • 总长度 (16 位 - IPv4): 整个 IP 数据报的总长度(IP 首部 + IP 载荷)。

      • 标识 (16 位 - IPv4)、标志 (3 位 - IPv4)、分片偏移 (13 位 - IPv4): 用于处理数据报分片。

      • 生存时间 (8 位 - IPv4) / 跳数限制 (8 位 - IPv6): 防止数据报在网络中无限循环 (TTL/Hop Limit)。

      • 协议 (8 位 - IPv4) / 下一个首部 (8 位 - IPv6): 这是最关键字段之一! 明确指示 IP 载荷中封装的是哪种上层协议的数据。对于 UDP,该值设置为 17 (0x11)。

      • 首部校验和 (16 位 - IPv4): IPv4 用于检测 IP 首部错误(IPv6 取消了此字段,依赖下层校验)。

      • 源 IP 地址 (32 位 - IPv4, 128 位 - IPv6): 发送主机的 IP 地址。

      • 目的 IP 地址 (32 位 - IPv4, 128 位 - IPv6): 接收主机的 IP 地址。

      • (IPv4 选项 - 可变长度,IPv6 扩展首部 - 可变长度): 可选字段。

    • 封装: IP 模块将整个 UDP 数据报 作为 IP 载荷 (IP Payload) 附加在刚刚创建的 IP 首部之后,形成一个完整的 IP 数据报 (IP Datagram)。结构如下:

      |<----------- IP Datagram ------------>|
      +-----------------+---------------------+
      |   IP Header     |   UDP Datagram      |
      | (e.g., 20 bytes)| (UDP Hdr + App Data)|
      +-----------------+---------------------+
      |<--- IP Payload (UDP Datagram) ----->|
  4. 数据链路层封装 (发送端网络接口):

    • 完整的 IP 数据报被向下传递给数据链路层(如以太网、Wi-Fi)。

    • 数据链路层在其前面添加 链路层首部 (Frame Header)(包含源 MAC 地址、目的 MAC 地址或下一跳路由器的 MAC 地址、类型字段等),并在末尾添加 帧校验序列 (FCS/Trailer) 用于错误检测。

    • 类型/长度字段 (Type/Length Field): 在链路层首部中,有一个字段(如以太网的 EtherType)用于标识网络层协议。对于 IPv4,该值为 0x0800;对于 IPv6,该值为 0x86DD。这告诉接收方的数据链路层,载荷是一个 IP 数据报。

    • 封装后的结构称为 帧 (Frame)

      |<---------------- Frame -------------->|
      +-----------------+---------------------+-----------------+
      | Frame Header   |   IP Datagram       | Frame Trailer   |
      | (e.g., MAC Addr)| (IP Hdr + UDP Data) | (e.g., FCS)     |
      +-----------------+---------------------+-----------------+
  5. 物理层传输:

    • 数据链路层将帧转换为物理信号(电信号、光信号、无线电波等),通过物理介质(网线、光纤)发送出去。

总结封装顺序 (从内到外):

  1. 应用层数据: 用户数据。

  2. UDP 首部: 添加源/目的端口、长度、校验和 → 形成 UDP 数据报

  3. IP 首部: 添加源/目的 IP 地址、TTL、最重要的 协议号 (17) 等 → 将 UDP 数据报 封装成 IP 数据报

  4. 帧首部/尾: 添加源/目的 MAC 地址、类型 (0x0800/0x86DD)、FCS → 将 IP 数据报 封装成 

  5. 物理信号: 帧被转换为比特流在物理介质上传输。

关键点:

  • 协议号 (17): 这是 IP 首部中标识载荷为 UDP 的关键字段。接收方 IP 层根据这个字段决定将解封装后的数据交给 UDP 模块处理。

  • 端口号: 位于 UDP 首部中,IP 层不处理端口号。端口号的作用是让目标主机的 UDP 模块将数据交给正确的应用程序。

  • 地址分层: IP 地址用于在网络层进行主机到主机的路由 (End-to-End)。MAC 地址用于在数据链路层进行单跳的物理设备寻址 (Hop-by-Hop)。端口号用于在传输层进行进程到进程的交付。

  • 解封装: 接收方主机执行相反的过程:数据链路层剥离帧首尾,检查类型字段并将 IP 数据报交给 IP 层。IP 层检查目的 IP 地址、协议号 (17),剥离 IP 首部,将 UDP 数据报交给 UDP 层。UDP 层检查目的端口号,剥离 UDP 首部,将应用数据交给绑定在该端口的应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值