linux网络编程(四)UDP用户数据报文协议
UDP是一种基于 IP 协议的不可靠网络传输协议, 在 IP 数据的位置如图 5.19 所示。

UDP 协议是 TCP/IP 的传输层协议的一部分,与TCP的传输不一样,它提供无连接、不可靠的传输服务。 UDP协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序;接收方不向发送方发送接收的确认信息,如果出现丢包或者重包的现象,也不会向发送方发送反馈,因此不能保证使用 UDP 协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。
使用 UDP 协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,也就是说,应用程序必须根据 UDP 的缺点提供解决方案。
UDP 协议相比较 TCP 协议执行时的速度要比 TCP 快得多,因为 UDP 协议简单得多,对系统造成的负载低。 在高负载的系统(例如服务器)或者系统资源受限的系统(例如嵌入式系统)上应用比较多,在不需要可靠传输的应用程序上有比较广泛的应用,例如流媒体的传输、 域名服务器、 嵌入式机顶盒系统等。
1.UDP的数据格式
UDP 传输数据时的字段格式如图 5.20 所示。

- 源端口号和目的端口号分别是一个16位的字段,用来表示发送方和接收方的UDP端口。
- UDP数据长度表示UDP头部和UDP数据段的长度,单位为字节。由于UDP头部为8个字节,因此发送UDP的长度字段最少为8字节。UDP的长度与IP协议的长度有关联性,IP的长度指的是数据的全长,UDP的长度等于IP的长度减去IP头部的长度。
- UDP校验和表示整个UDP字段的CRC16校验和,它的计算方法与IP字段是一致的。UDP的校验和字段是可选的,即可以不进行CRC校验,此时校验和部分为全0,UDP校验和允许发送的数据为奇数长度,此时要加一个空字节, 即全0的字节进行填充,这个字节仅仅为了方便计算校验和,不发送到目的地址。
2. UDP 数据的传输过程
如图5.21所示为使用UDP协议的应用程序的数据传输过程,用户数据由主机A发送给主机B,数据封装在UDP的数据部分。
发送的过程是一个封包的过程。主机A上,在传输层用户发送的数据增加 UDP 头部,用户数据封装在 UDP 的数据部分。在 IP 层增加IP头部数据,UDP 的数据和头部都封装在 IP 层的数据部分。 IP 层将数据传输给网络设备的驱动程序,太网增加头部和尾部后,发送到以太网上。
接收数据的过程是一个解封包的过程。 主机B上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。 IP 层剥去IP头,进行校验,将数据发送给其上层 UDP 层。 UDP 则将 UDP 的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机B 上的应用程序会得到干净的有效数据,然后进行处理。
下面分析一帧基于UDP的TFTP协议帧:
以太网首部
0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00
IP首部
0000: 45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8
0020: 00 01
UDP首部
0020: 05 d4 00 45 00 3f ac 40
TFTP协议
0020: 00 01 'c' ':' '\' 'q'
0030: 'w' 'e' 'r' 'q' '.' 'q' 'w' 'e' 00 'n' 'e' 't' 'a' 's' 'c' 'i'
0040: 'i' 00 'b' 'l' 'k' 's' 'i' 'z' 'e' 00 '5' '1' '2' 00 't' 'i'
0050: 'm' 'e' 'o' 'u' 't' 00 '1' '0' 00 't' 's' 'i' 'z' 'e' 00 '0'
0060: 00
以太网首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上层协议类型0x0800表示IP。
IP首部:每一个字节0x45包含4位版本号和4位首部长度,版本号为4,即IPv4,首部长度为5,说明IP首部不带有选项字段。服务类型为0,没有使用服务。16位总长度字段(包括IP首部和IP层payload的长度)为0x0053,即83字节,加上以太网头部14+4字节校验可知整个帧长度是101字节。IP报标识是0x9325,标志字段和片偏移字段设置为0x0000,就是DF=0允许分片,MF=0此数据报没有更多分片,没有分片偏移。TTL是0x80,也就是128。上层协议0x11表示UDP协议。IP首部校验和为0x25ec,源主机IP是c0 a8 0037(192.168.0.55),目的主机IP是c0 a8 0001(192.168.0.1)。
UDP首部:源端口号0x05d4(1492)是客户端的端口号,目的端口号0x0045(69)是TFTP服务的well-known端口号。UDP报长度为0x003f,即63字节,包括UDP首部和UDP层payload的长度。UDP首部和UDP层payload的校验和为0xac40。
【注:很多服务有well-known的端口号,然而客户端程序的端口号却不必是well-known的,往往是每次运行客户端程序时由系统自动分配一个空闲的端口号,用完就释放掉,称为ephemeral的端口号。】
相关分析:
当tftp的纯数据供55字节(udp payload),加上udp头部8字节,就是63字节,也就是前面说的UDP 头部字段记录的UDP数据长度,再加上ip头部20字节,也就是83字节,即前面说的ip头部记录的ip包大小,即udp payload + udp头部 可以当作ip 层的payload,ip层payload + ip头部 = 83字节,加上以太网头部14字节,尾部校验4字节,总共101字节,即完整的一帧数据帧。

浙公网安备 33010602011771号