[TOC] ## 概述 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报 ![D688A5EF-E0CE-45FC-882C-AB10238FA02C.png](http://yanxuan.nosdn.127.net/7d4862545fd22e48331b93f2b13fd364.png) :-: UDP封装 **UDP不提供可靠性** : 它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。 ![7E316A2A-CBB3-4B78-A661-3827C7C3EBF5.png](http://yanxuan.nosdn.127.net/b0f8389439d5b811d6650550c7fc9169.png) :-: UDP首部 ### IP分片 物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上 IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指在IP层和链路层之间传送的数据单元。一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片 ![F71D130E-4B6B-4476-B070-33C17EE04772.png](http://yanxuan.nosdn.127.net/6b378b7ecfd95c0ec50074158ef60ceb.png) ### 最大UDP数据报长度 理论上,IP数据报的最大长度是65535字节,这是由IP首部(图3-1)16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节 **数据报截断** 由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,该问题的答案取决于编程接口和实现。 典型的 Berkeley版 socket apl对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(43 BSD Reno及其后的版本可以通知应用程序数据报被截断。 SVR4下的 Socket API(包括 Solaris2x)并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UD数据报中多次进行读取操作。 TLⅠAPI不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。