TCP/IP详解之第11章-UDP:用户数据报协议
知识要点
UDP同TCP一样是传输层协议,且网络层均使用IP协议。
1
2
3
4
5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP header | UDP header | UDP payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 bytes 8 bytes
UDP是面向数据报的,即将进程的单次输出封装成一个UDP数据报。
1
2
3
4
5
6
7
8
9
10
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+UDP和TCP的校验和均覆盖UDP首部和UDP数据,但是UPD的校验和是可选项,而TCP的校验和是必需项。
UDP数据报和TCP段计算校验和时都包含一个12字节的伪首部,其中包含了32位源IP地址和32位目的IP地址,用于检测UPD数据报是否已正确抵达目的地。
UDP校验和是端到端的,由发送端计算,接收端验证,以检测端到端之间UDP数据报是否发生任何改动。
UDP不提供传输的可靠性保障,即通过UDP发送的数据不保证能否抵达目的地。
使用UDP时应避免IP分片,因为IP层没有超时重传机制。
由于以太网帧的MTU为1500(IEEE 802的MTU为1492),因此,当UDP数据报中的用户数据大于1472(1500-20-8)时会触发IP层分片。
可利用路径MTU发现机制获取路径上最小的MTU值,可用以下命令:
1
2
3ping -D -s 8.8.8.8
或
tracepath 8.8.8.8理论上,IP数据报的最大长度为65535(2^16),即UDP数据报中用户数据最大长度为65507=65535-20-8。但是,大多数实现所提供的长度小于这个理论值,原因有二:
- 应用程序可能会受到程序接口限制
- TCP/IP的内核实现中,IP数据报的长度小于65535。
UDP允许应用层指定可接收的最大字节数,因为IP能够发送或接收特定长度的数据包,并不意味着应用层可以读取同样长度的数据。
习题详解
在 1 1 . 5 节中,向UDP数据报中写入1473 字节用户数据时导致以太网数据报片的发生。在采用以太网IEEE 802封装格式时,导致分片的最小用户数据长度为多少?
答:因为使用IEEE 802封装时,IP数据报前面存在8个额外的字节,即IEEE 802帧用户数据最大长度为1492(1500-8),因此,UDP导致分片的最小用户数据长度为1465=1492-20-8+1。阅读RFC 791[Postel 1981a],理解为什么除最后一片外,其他片中的数据长度均要求为
8字节的整数倍?答:这与IP报文格式的设计相关。在IP报文中,表示报文总长度值的字段占16bits,即IP报文的最大长度为65535。而表示分片偏移量的字段占13bits,能表示范围为0~8191。由于IP报文最小长度为20字节,因此IP报文用户数据的最大长度为65515(65535 - 20)个字节。如果使用8字节作为偏移量最小跨度,那么最多可表示8189(65515 / 8)个分片,这与最大分片偏移量(8191)很接近。且当偏移量取最大值时,最后一个分片的长度为3个字节 = 65535 - 20 - (8189 * 8)。
假定有一个以太网和一份8192字节的UDP数据报,那么需要分成多少个数据分片,每个数据分片的偏移和长度为多少?
答:将8192字节的UDP数据封装成IP报文需加上8字节的UDP头部,即IP报文的数据长度为8200字节。又因为以太网帧的MTU为1500,每个分片除去20字节的IP头部,IP报文最大数据长度为1480,且刚好是8的倍数,满足IP分片要求。
分片数=8200 / 1480 + 1 = 6,8200 = 1480 * 5 + 800,分片采用tcpdump记号:
- 分片一:1480@0+,分片长度为1480,偏移量为0,标识位MF=1(More Fragement)
- 分片二:1480@1480+
- 分片三:1480@2960+
- 分片四:1480@4440+
- 分片五:1480@5920+
- 分片六:800@7400+
一个用UDP发送数据报的应用程序,它把数据报分成4个数据分片。假定第1片和第2片到达目的端,而第3片和第4片丢失了。应用程序在10秒钟后超时重发该UDP数据报,并且被分成相同的4片(相同的偏移和长度)。假定这一次接收主机重新组装的时间为60秒,那么当重发的第3片和第4片到达目的端时,原先收到的第1片和第2片还没有丢弃。接收端能否把这4片数据重新组装成一份IP数据报?
答:不能。IP数据报中有一个标识字段,只有标识字段相同的数据分片才能组装成一份IP数据报。当应用程序超时重传时,重传IP数据报具有新的标识,因此,其所生成的分片不能与其他IP数据报的分片重组。
在讨论分片时没有提及任何IP首部中的选项—它们是否也要复制到每个数据报片中,或者只留在第一个数据报片中?我们已经讨论过下面这些IP选项:记录路由、时间戳、严格和宽松的源站选路。你希望分片如何处理这些选项?
答:不严格和严格的源站选路选项被复制到每一个数据包分片中。时间戳选项和记录路由选项只出现在第一个数据包分片中,而不会被复制到每一个数据包分片中。
在图1-8中,我们说UDP数据报是根据目的UDP端口号进行分配的,这正确吗?
答:不正确,很多实现是根据目的IP地址、源IP地址和源端口号来过滤送往一个给定UDP端口号的输入数据报。