UDP:用户数据协议
UDP是面向数据报的运输协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。同时UDP提供不可靠性:它把应用应用程序传给IP层的数据发送出去,但是并不保证他们能到达目的地。
应用程序必须关系IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报进行分片。
UDP首部的各字段如图1所示。其中,端口号表示发送和接收进程。UDP长度字段指的是UDP首部和UDP数据的字节长度,该字段要求最小长度为8字节。UDP校验和覆盖UDP首部和UDP数据。
图1 UDP首部
如果发送端没有计算校验和而接收端检测到校验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文。
IP分片:
如果IP数据报的长度大于MTU,则需要对IP数据报进行分片。把一份IP数据报分片以后,只有达到目的地才进行重新组装。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP和UDP)是透明的。
IP分片过程:
对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时,被复制到每个片中。标志字段用其中一个比特表示“更多的片”(MF)。除了最后一片以外,其他每个组成数据报的片都要把该比特位置1。片偏移字段指的是该片偏移原始数据报开始处的位置。当数据报分片后,每个片的总长度要改为该片的长度值。
为什么只丢失一片数据也需要重传整个数据报?
是因为IP层本身没有超时重传的机制----由更高层来负责超时和重传。如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何分片的。
在分片时,除了最后一片以外,其他每一片中的数据部分(除IP首部外的其余部分)必须是8字节的整数倍。IP数据报是指IP层端到端的传输单元(在分片之前和重组装之后),分组是指在IP层和链路层之间传输的数据单元。
发送ICMP不可达差错报文给发送端的情况:
- 当路由器收到一份需要分片但是又设置了不可分标志比特位的IP数据报;
- 路径MTU发现机制。
最大UDP数据报长度受到两个因素的影响:
- 应用程序可能受到其程序接口的限制;
- 限制来自于TCP/IP内核的实现。
如果接收到的数据报长度大约应用程序所能处理的长度,那么会发生什么情况呢?
该问题的答案取决于编程接口和实现。例如,典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。SVR4下的socket API并不截断数据报,超出部分数据在后面的读取中返回,但它也不通知应用程序。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据。
当一个系统(路由器或主机)接收数据报的速度大于其处理速度时,可能产生ICMP“源站抑制(source quench)”差错。