协议UDP协议 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都会产生一个UDP数据报,并组装成一份待发送的IP数据报,这与面向字符流的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系(主要是在传输层就进行分段了,因此不会受IP分片的影响)。
UDP的校验和
至于UDP的校验和,这里注意下区别就好了,UDP对首部和数据部分都进行校验,而IP首部的校验和仅对IP的首部进行校验,顺带提下TCP,TCP的校验和也是对首部和数据部分都进行校验,另外,UDP的校验和是可选的,而TCP的是必选的。
不可靠协议
UDP是不可靠的协议,没有超时和重传功能,当UDP数据封装到IP数据报传输时,如果丢失,会发送一个ICMP差错报文给源主机,另外,如果UDP数据报的发送端没打开UDP校验和,而接收端计算校验和有差错,那么UDP数据报将会被丢掉,也不会发送ICMP差错报文。
路径MTU发现
可以修改Traceroute程序来确定路径MTU。要做的是发送分组,并设置将IP首部设置为不分片,发送的***个分组的长度正好于出口MTU相等,每次收到ICMP不可分片的差错报文时,就减小分组长度,使新的ICMP不可分片差错报文中返回更小的MTU,每次用更小的MTU值来传送,这样能找到更小的MTU值。
利用路径MTU发现机制,应用程序可以充分利用更大的MTU来发送报文。
UDP***长度
理论上IP数据报的***长度为65535字节,因此理论上的UDP数据报的***长度为65507(65535-20-8)字节,但是,大多数实现所提供的长度比这个***值小。一般有两个因素的限制(书上给出了一些例子,见P120):
1、应用程序可能胡受到其程序接口的限制,一些API的实现中可能有限定UDP数据报的***长度。另外,现在大部分系统都默认提供了可读写大于8192字节的UDP数据报。
2、受限于TCP/IP内核的实现,可能存在一些实现特性,使IP数据报长度小于65535字节。
数据报截断
正是由于UDP***数据报的限制(受限于上面的两个因素,一般都会小于65507),大于这个限制的数据报会被截断,从而发生数据丢失,且不会有任何数据丢失的通知,这也是UDP协议不可靠传输的另一个体现。而TCP则没有任何信息边界,TCP首部中没有对TCP最长报文段的限制,因此TCP以应用程序读操作时所要求的长度来传送数据(理论上一次可以发送很大的数据,但考虑到网络的传输性能,***不要一次传输太大的数据),当然在超过MSS值时会产生分段,因此不会发生数据截断。
ICMP源站抑制差错
当一个系统中的某主机或路由器处理数据的速度赶不上接受数据的速度时,因为接收主机的IP缓存会被占满,可能会产生这个差错,从而发送一个ICMP源站抑制差错报文,这里要注意是“可能”。