1 UDP协议简介
UDP是简单的面向数据包的运输层协议,将每个输出操作产生的UDP数据报组装成IP数据报
应用程序必须关心IP数据报的长度,因为如果超过网络的MTU,就要对IP数据报进行分片
2 UDP首部
3 UDP检验和
UDP和TCP的首部中都有覆盖首部和数据的检验和。UDP的检验和是可选的,TCP则是必须的。
UDP数据报的长度可以为奇数字节。UDP检验和计算方法同IP数据报一样,计算检验和是必须是若干个16字节相加,必要时需要再最后填充字节0
计算检验和格式:
如果检验和的计算结果为0,则存入的值为全1(6 5 5 3 5)。如果传送的检验和为0,说明发送端没有计算检验和。
如果发送端没有计算检验和而接收端检测到检验和有差错,那么U D P数据报就要被悄悄
地丢弃。不产生任何差错报文(当I P层检测到I P首部检验和有差错时也这样做)。
检验和示例:
TCP/IP的所有协议的检验和都检测不出交换2个16bit的差错
4 例子
tcpdump输出:
接收端收到数据源,没有任何确认,发送端并不知道另一端是否已经收到这些数据报
每次运行程序,源端的UDP端口号发生变化
5 IP分片
如果发送的IP数据报大于发送接口对应链路的MTU,则需要进行分片。
分片可以发送在原始发送端主机上,也可以发生在中间路由器上。
分片的数据可能再次进行分片。
标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每
个组成数据报的片都要把该比特置1。
片偏移字段指的是该片偏移原始数据报开始处的位置。
当数据报被分片后,每个片的总长度值要改为该片的长度值。
标志字段中有一个比特称作“不分片”位。如果将这一比特置1,I P将不对数据报
进行分片。相反把数据报丢弃并发送一个I C M P差错报文给起始端。
因为如果对数据报分片的是中间路由器,那么起始端就无法知道数据报是如何分片的,因此即时只丢失一片数据也要重传整个数据报。
在一个以太网上,数据帧的最大长度是1 5 0 0字节,其中1 4 7 2字节留给数据,假定I P首部为2 0字节, U D P首部为8字节。
tcpdump输出:
UDP分片示意图:
6 ICMP不可达差错(需要分片)
发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在I P首
部又设置了不分片( D F)的标志比特。
ICMP不可达差错可以用来判断到达目的端的路途中最小的MTU
ICMP不可达差错报文格式:
如果路由器没有提供这种新的ICMP差错报文格式,那么下一站的M T U就设为0。
示例:
bsdi上tcpdump输出:
solaris上pingbsdi,ping分组数据长度从500字节增长到600字节
回显应答与回显请求报文长度相同(超过6 0 0字节),但是sun外出的SLIP接口MTU为552。因此回显应答需要进行分片,但是D F标志比特又被设置了,产生一个ICMP不可达差错报文
7 用Traceroute确定路径MTU
在这个例子中,路由器bsdi没有在ICMP差错报文中返回出口MTU,因此我们选择另一个
MTU近似值。TTL为2的第1行输出打印的主机名为bsdi,但这是因为它是返回ICMP差错报文的路由器。T T L为2的最后一行正是我们所要找的。
ICMP报文输出MTU的例子:
8 采用UDP的路径MTU发现
前四行可知发往该目的地址的数据报不能讲DF比特置1
当IP定时器超时,通知IP查看是不是因为路径MTU增大而将DF比特再一次置1
第7行和第19行看出IP每过30秒就将DF比特置1
solaris分片的数据报还将被bsdi分片
slip上的tcpdump:
在本例中,solaris不应该对外出数据报分片,它应该将D F比特置0,让具有最小MT U的路由器来完成分片工作
9 UDP和ARP之间的交互作用
tcpdump输出:
发送方很快产生6个ARP请求。当发送方接收到第一个ARP应答时,只发送最后一个数据报片
10 最大UDP数据报长度
IP首部16比特总长度字段限制IP数据报的最大长度为65535字节,去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最大长度为65507字节。
限制数据报长度的两个因素:
1)应用程序可能受到其程序接口的限制
2)TCP/IP的内核实现,可能存在一些实现特性,是IP数据报长度小于65535字节
IP能够发送或接收特定长度的数据报并不意味着应用程序可以读取该长度的数据报。当接收到的数据报长度大于UDP编程接口允许应用程序制定每次返回的最大字节数时,处理情况取决于编程接口和实现。有的对数据报进行截断,并丢弃多余的数据;有的并不截断数据报,超出部分数据在后面的读取中返回。
11 ICMP源站抑制差错
当一个系统接收数据报的速度比其处理速度快时,可能产生这个差错。注意是可能,即时一个系统已经没有缓存并丢弃数据报,UDP也不要求它一定发生源站抑制报文。
如果采用UDP协议,通常忽略其接收到的源站抑制报文(TCP不同,TCP接收源站抑制报文,并放慢在该链接上的数据传输速度)。其部分原因在于,在接收到源站抑制差错报文时,导致源站抑制的进程可能已经中止了。