11.1 引言
- 简单的面向数据报的运输层协议:进程的每个输出操作产生一个UDP数据报,并组装成一份待发送的IP数据报;
- 不提供可靠性,不保证能达到目的地;
- IP数据报分片;
11.2UDP首部
- TCP与UDP的端口号是相互独立的。
- UDP长度指的是UDP首部和UDP数据的直接长度,最小为8字节,即数据量为0;
- UDP数据报长度是全长减去IP首部的长度
11.3UDP校验和
- 检验范围包括首部和数据
- 检验和是可选的
- 根据16bit校验和算法,由于校验数据个数可能为奇数个,因此计算是可能会增加一个填充字节;但此字节可能不会被传送
- UDP和TCP数据报都包含一个12字节的伪首部
11.5IP分片
- 发送IP报文前,会先查询对应接口的MTU。大于MTU将分片
- 每次分片后,在下一站就进行组装,整个传输过程中,可能会多次分片
- 标志字段有一个比特称为“部分片“位。如果置1,IP将不会分片。反而会丢弃,并发送一个ICMP差错报文
- 分片的IP数据报到达时,可能是失序的
- IP协议没有超时重传,由更高级协议实现
- 如果传输过程中丢失一包IP报文,整个报文都将重传,因为起始端无法知道数据报是如何分片的
- 分片时,拆分的范围是UDP首部和UDP数据报,即UDP首部只在第一个分组中出现
11.6ICMP不可达差错(需要分片)
- 当路由器收到一份需要分片的数据报,而IP首部又设置了不分片(DF)的标识比特,此时将产生ICMP不可达差错报文(需要分片)
- 此差错报文可以用来判断到达目的端路途中最小MTU是多少,即路径MTU发现机制
11.7用Traceroute确定路径MTU
- 基本原理:发送已知长度的IP报文,通过检查收到的ICMP“不能分片”差错来判断整个路径中的最小MTU;当收到差错时,减小分组长度,知道到达目的端口。
11.9UDP和ARP之间的交互作用
首先,清除arp缓存。arp -a
- 当发送一个会被分为6组的IP数据报时,每个IP数据报片都会发送一个ARP请求
- 在收到ARP请求的回复后,只发送最后一个数据报片,大多数实现都是这样的
其次,超时后,并未收到ICMP差错报文,原因有:
- Berkeley派生的实现从不产生该差错,只是在定时器溢出是将该报文片丢弃
- 并未收到包含UDP首部的偏移量为0的第一 个数据报片,则不要求产生ICMP差错,原因是没有运输层首部,无法去人哪个进程发送的数据报
11.10最大UDP数据报长度
- UDP编程接口允许应用程序制定每次返回的最大字节数。
- TCP已应用程序读操作时所允许的长度来发送数据,因此,不会发生数据丢失
11.11ICMP源站抑制差错
当一个系统接收数据报的速度比起处理速度比其处理速度快时,可能产生这个差错。
协议提出路由器不应该产生源站抑制差错报文。因其会消耗网络带宽,对于拥塞来说是一种无效而不公平的调整。
- BSD实现通常忽略接收到的源站抑制报文,因为当收到此报文时,可能造成此报文的进程已经终止了
UDP协议如果希望知道接收端是否收到数据,可在应用程序中建立一些应答机制。
11.12UDP服务器的设计
- 客户IP地址及端口号:应用收到UDP数据报是,操作系统必须告诉它是谁发送了这份消息,即源IP地址和端口号。
- 目的IP地址:一些应用需要知道数据报是发送给谁的。即目的源IP。
- UDP输入队列:UDP接收队列有可能能溢出,溢出直接丢弃,没有其他类似源站抑制处理。此队列是FIFO的。
- 限制本地IP地址:大多数UDP服务器在创建UDP端点时都使其本地IP具有通配符的特点。即如果UDP数据报目的地为服务端口,那么本地任何接口均可接收它。
- 限制远端IP地址:允许UDP端点对远端地址进行限制。
- 每个端口有多个接收者:多个端点可使用同一个IP地址和端口号。如果目的IP地址和端口号处有多个端点时,就行每个端点传送一根数据报复制。
小结:
- UDP想用户进程提供的服务位于IP成之上,包括端口号和可选的校验和。
- ICMP不可达差错,它是新路径MTU发现功能的一部分。
- ICMP源站抑制差错报文,处理速度慢于接收速度。
- 等待ARP应答时只保留最近传送目的端的数据报。