UDP:用户数据报协议

1 引言
U D P是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 U D P数据报,并组装成一份待发送的 I P数据报。

U D P不提供可靠性:它把应用程序传给 I P层的数据发送出去,但是并不保证它们能到达目的地。

2 UDP首部
U D P首部的各字段如图11 - 2所示。

端口号表示发送进程和接收进程。在图 1 - 8中,我们画出了 T C P和U D P用目的端口号来分用来自I P层的数据的过程。由于 I P层已经把I P数据报分配给T C P或U D P(根据I P首部中协议字段值),因此T C P端口号由T C P来查看,而 U D P端口号由 U D P来查看。 T C P端口号与U D P端口号是相互独立的。

U D P长度字段指的是 U D P首部和U D P数据的字节长度。该字段的最小值为 8字节(发送一份0字节的 U D P数据报是 OK)。这个 U D P长度是有冗余的。 I P数据报长度指的是数据报全长,因此U D P数据报长度是全长减去 I P首部的长度。

3 UDP检验和
U D P检验和覆盖U D P首部和U D P数据。回想I P首部的检验和,它只覆盖 I P的首部—并不覆盖I P数据报中的任何数据。
U D P和T C P在首部中都有覆盖它们首部和数据的检验和。 U D P的检验和是可选的,而 T C P的检验和是必需的。
首先, U D P数据报的长度可以为奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
其次, U D P数据报和 T C P段都包含一个 1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含 I P首部一些字段。其目的是让 U D P两次检查数据是否已经正确到达目的地

如果检验和的计算结果为 0,则存入的值为全 1( 6 5 5 3 5),这在二进制反码计算中是等效的。如果传送的检验和为 0,说明发送端没有计算检验和。


如果发送端没有计算检验和而接收端检测到检验和有差错,那么 U D P数据报就要被悄悄地丢弃。不产生任何差错报文
U D P检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现U D P首部和数据在发送端到接收端之间发生的任何改动。

5 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数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置 1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值
最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置 1, I P将不对数据报进行分片。相反把数据报丢弃并发送一个 I C M P差错报文( “需要进行分片但设置了不分片比特”,见图6 - 3)给起始端。

当I P数据报被分片后,每一片都成为一个分组,具有自己的 I P首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在 I P首部中有足够的信息让接收端能正确组装这些数据报片。

尽管I P分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?因为 I P层本身没有超时重传的机制——由更高层来负责超时和重传。

I P数据报是指 I P层端到端的传输单元(在分片之前和重新组装之后),分组是指在I P层和链路层之间传送的数据单元。一个分组可以是一个完整的 I P数据报,也可以是I P数据报的一个分片。

6 ICMP不可达差错(需要分片)
发生I C M P不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在 I P首部又设置了不分片( D F)的标志比特。如果某个程序需要判断到达目的端的路途中最小 M T U是多少—称作路径M T U发现机制,那么这个差错就可以被该程序使用。

格式如下:

如果路由器没有提供这种新的 I C M P差错报文格式,那么下一站的 M T U就设为0。

7 用Traceroute确定路径MTU
尽管大多数的系统不支持路径 M T U发现功能,但可以很容易地修改 t r a c e r o u t e程序(第8章),用它来确定路径 M T U。要做的是发送分组,并设置“不分片”标志比特。发送的第一个分组的长度正好与出口 M T U相等,每次收到I C M P“不能分片”差错时就减小分组的长度。如果路由器发送的 I C M P差错报文是新格式,包含出口的 M T U,那么就用该 M T U值来发送,否则就用下一个最小的 M T U值来发送。

8 采用UDP的路径MTU发现

9 UDP和ARP之间的交互作用

10 最大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数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于 8 1 9 2字节的 U D P数据报。

第二个限制来自于 T C P / I P的内核实现。可能存在一些实现特性(或差错),使I P数据报长度小于6 5 5 3 5字节。
数据报截断
由于I P能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此, U D P编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?
不幸的是,该问题的答案取决于编程接口和实现。

11 ICMP源站抑制差错
当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。注意限定词“可能”。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。

12 UDP服务器的设计
服务器来说,它启动后处于休眠状态,等待客户请求的到来。对于 U D P来说,当客户数据报到达时,服务器苏醒过来,数据报中可能包含来自客户的某种形式的请求消息。
 

12.1 客户IP地址及端口号
来自客户的是 U D P数据报。 I P首部包含源端和目的端 I P地址, U D P首部包含了源端和目的端的 U D P端口号。当一个应用程序接收到 U D P数据报时,操作系统必须告诉它是谁发送了这份消息,即源I P地址和端口号。
这个特性允许一个交互 U D P服务器对多个客户进行处理。给每个发送请求的客户发回应答。

12.2 目的IP地址
一些应用程序需要知道数据报是发送给谁的,即目的 I P地址。
12.3 UDP输入队列
大多数 U D P服务器是交互服务器。这意味着,单个服务器进程对单个U D P端口上(服务器上的名知端口)的所有客户请求进行处理。

通常程序所使用的每个 U D P端口都与一个有限大小的输入队列相联系。这意味着,来自不同客户的差不多同时到达的请求将由 U D P自动排队。接收到的 U D P数据报以其接收顺序交给应用程序(在应用程序要求交送下一个数据报时)。
 

12.3 UDP输入队列
大多数 U D P服务器是交互服务器。这意味着,单个服务器进程对单个U D P端口上(服务器上的名知端口)的所有客户请求进行处理。
通常程序所使用的每个 U D P端口都与一个有限大小的输入队列相联系。这意味着,来自不同客户的差不多同时到达的请求将由 U D P自动排队。接收到的 U D P数据报以其接收顺序交给应用程序(在应用程序要求交送下一个数据报时)。
12.4 限制本地IP地址
12.5 限制远端IP地址
12.6 每个端口有多个接收者

 

总结
U D P是一个简单协议。它的正式规范是 RFC 768 [Postel 1980],只包含三页内容。它向用户进程提供的服务位于 I P层之上,包括端口号和可选的检验和。我们用 U D P来检查检验和,并观察分片是如何进行的。
接着,我们讨论了 I C M P不可达差错,它是新的路径 M T U发现功能中的一部分(2 . 9节)。用Tr a c e r o u t e和U D P来观察路径 M T U发现过程。还查看了 U D P和A R P之间的接口,大多数的A R P实现在等待A R P应答时只保留最近传送给目的端的数据报。
当系统接收I P数据报的速率超过这些数据报被处理的速率时,系统可能发送 I C M P源站抑制差错报文。使用U D P时很容易产生这样的 I C M P差错。
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值