UDP 数据包在通过网络发送之前,需要被封装在 IP (网际协议) 数据报中。这个过程是 TCP/IP 协议栈中网络层 (IP) 为传输层 (UDP) 提供服务的关键步骤。以下是详细的封装过程:
-
应用层数据准备:
-
应用程序(例如 DNS 客户端、简单的文件传输工具、视频流客户端等)生成需要发送的数据。
-
应用程序指定目标 IP 地址和目标端口号,以及源端口号(通常由操作系统自动分配)。它使用 UDP 套接字 API 发送数据。
-
-
传输层 (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) | +-----------------+---------------------+
-
-
网络层 (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) ----->|
-
-
数据链路层封装 (发送端网络接口):
-
完整的 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) | +-----------------+---------------------+-----------------+
-
-
物理层传输:
-
数据链路层将帧转换为物理信号(电信号、光信号、无线电波等),通过物理介质(网线、光纤)发送出去。
-
总结封装顺序 (从内到外):
-
应用层数据: 用户数据。
-
UDP 首部: 添加源/目的端口、长度、校验和 → 形成 UDP 数据报。
-
IP 首部: 添加源/目的 IP 地址、TTL、最重要的 协议号 (17) 等 → 将 UDP 数据报 封装成 IP 数据报。
-
帧首部/尾: 添加源/目的 MAC 地址、类型 (0x0800/0x86DD)、FCS → 将 IP 数据报 封装成 帧。
-
物理信号: 帧被转换为比特流在物理介质上传输。
关键点:
-
协议号 (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 首部,将应用数据交给绑定在该端口的应用程序。
692

被折叠的 条评论
为什么被折叠?



