1、 UDP定义
U D P是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个
U D P数据报,并组装成一份待发送的I P数据报。这与面向流字符的协议不同,如T C P,应用程序产生的全体数据与真正发送的单个I P数据报可能没有什么联系。
U D P不提供可靠性:它把应用程序传给I P层的数据发送出去,但是并不保证它们能到达目的地。
应用程序必须关心I P数据报的长度(write的数据长度有限制)。如果它超过网络的M T U(2 . 8节),那么就要对I P数据报进行分片。
2、 包格式定义
3、 IP分片
物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的I P数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其M T U。I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一份I P数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网
络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。重新组装由目的端的I P层来完成,其目的是使分片和重新组装过程对运输层( T C P和U D P)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。I P首部中包含的数据为分片和重新组装提供了足够的信息。
I P数据报是指I P层端到端的传输单元(在分片之前和重新组装之后),分组是指在I P层和链路层之间传送的数据单元。一个分组可以是一个完整的I P数据报,也可以是I P数据报的一个分片。
注意任何传输层(UDP/TCP)首部仅仅出现在第一个分片中。
4、 MTU发现机制
对UDP数据报设置不可分片标示,以此来判断路由器的MTU。
发生I C M P不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在I P首部又设置了不分片( D F)的标志比特。如果某个程序需要判断到达目的端的路途中最小M T U是多少—称作路径M T U发现机制( 2 . 9节),那么这个差错就可以被该程序使用。
5、 UDP和ARP
我们用s o c k程序来产生一个包含8 1 9 2字节数据的U D P数据报。预测这将会在以太网上产生6个数据报片(见习题11 . 3)。同时也确保在运行该程序前, A R P缓存是清空的,这样,在发送第一个数据报片前必须交换A R P请求和应答。
(1) 在第一个A R P应答返回以前,总共产生了6个A R P请求。我们认为其原因是I P很快地产生了6个数据报片,而每个数据报片都引发了一个A R P请求。
(2) 在接收到第一个A R P应答时(第7行),只发送最后一个数据报片(第9行)!看来
似乎将前5个数据报片全都丢弃了。实际上,这是A R P的正常操作。在大多数的实现中,在等待一个A R P应答时,只将最后一个报文发送给特定目的主机。
6、 最大UDP数据报长度
理论上,I P数据报的最大长度是6 5 5 3 5字节,这是由I P首部(图3 - 1)1 6比特总长度字段所限制的。去除2 0字节的I P首部和8个字节的U D P首部, U D P数据报中用户数据的最长长度为6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。
第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大U D P数据报的长度直接相关。
第二个限制来自于T C P / I P的内核实现。可能存在一些实现特性(或差错),使I P数据报长度小于6 5 5 3 5字节。
7、 数据报截断:应用程序接口读取长度和数据包长度
由于I P能够发送或接收特定长度的数据报(上面讨论的最大UDP数据报长度)并不意味着接收应用程序可以读取该长度的数据(socket应用层得read/recv API)。因此, U D P编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?
(1) 典型的B e r k e l e y版socket API对数据报进行截断,并丢弃任何多余的数据。应用程
序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
(2) S V R 4下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。
(3) TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。
在讨论T C P时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界(UDP是以IP数据报为分界)。T C P以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。
UDP是一个数据包一个数据报的发送和接受,而TCP是一个字节流的传输。
8、 ICMP源站抑制差错
我们同样也可以使用U D P产生I C M P“源站抑制(source quench)”差错。当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。注意限定词“可能”。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。
9、 UDP输入队列
通常一个客户启动后直接与单个服务器通信,然后就结束了。而对于服务器来说,它启动后处于休眠状态,等待客户请求的到来。对于U D P来说,当客户数据报到达时,服务器苏醒过来,数据报中可能包含来自客户的某种形式的请求消息。
单个服务器进程对单个U D P端口上(服务器上的名知端口)的所有客户请求进行处理。
通常程序所使用的每个U D P端口都与一个有限大小的输入队列相联系。这意味着,来自
不同客户的差不多同时到达的请求将由U D P自动排队。接收到的U D P数据报以其接收顺序交给应用程序。
10、 UDP本地地址和端口的绑定和限制
U D P服务器本身可以创建的三类地址绑定。
11、 程序端点和IP/端口的对应关系
大多数的系统在某一时刻只允许一个程序端点与某个本地I P地址及U D P端口号相关联。当目的地为该I P地址及端口号的U D P数据报到达主机时,就复制一份传给该端点。
当U D P数据报到达的目的I P地址为广播地址或多播地址,而且在目的I P地址和端口号处有多个端点时,就向每个端点传送一份数据报的复制(端点的本地I P地址可以含有星号,它可匹配任何目的I P地址)。但是,如果U D P数据报到达的是一个单播地址,那么只向其中一个端点传送一份数据报的复制。