TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

时间:2021-06-01 10:32:26

目录:

UDP 首部

IP分片

路径MTU确定

应用场景

1. UDP 首部

UDP是一个简单的面向数据报的运输层协议。

UDP提供无连接、不可靠的服务:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。

TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

端口号表示发送进程和接收进程。TCP和UDP用目的端口号来分用来自IP层的数据的过程。TCP端口号与UDP端口号是相互独立的。

UDP长度字段指的是 UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报)。

UDP检验和覆盖UDP首部和UDP数据。UDP的检验和是可选的。计算过程:

首先,UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0。其次,UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地。

TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

如果检验和的计算结果为0,则存入的值为全165535),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被丢弃,不产生任何差错报文。

UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。

TCP发生检验和差错的比例与UDP相比要高得多原因:

  1. 如果输出UDP的检验和没有被使能,这个主机上的操作系统(SunOS 4.1.1)就不会验证一个进入UDP的检验和
  2. TCP连接经常是“远程”连接(经过许多路由器和网桥等中间设备),而UDP一般为本地通信。

2. IP 分片

任何时候IP层接收到一份要发送的数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口的 MTU。 IP把MTU与数据报长度进行比较,如果数据报长度大于 MTU,则将数据报进行分片。

分片可以发生在原始发送端主机上,也可以发生在中间路由器上。把一份IP数据报分片以后,只有到达目的地才进行重新组装。重新组装由目的端的IP层来完成。

如果重组?

  • 标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。
  • 片偏移字段指明该片偏移原始数据报开始处的位置。当数据报被分片后,每个片的总长度值要改为该片的长度值。

标志字段中有一个比特称作“不分片”位。如果将这一比特置 1,IP将不对数据报进行分片。如果数据报长度大于MTU,把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)给起始端。

当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中的标识字段和片偏移字段可以提供重组的信息。

需要注意:即使只丢失一个分片,也要重传整个数据报。因为IP层本身没有超时重传的机制,没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是发送端,那么发送端就无法知道数据报是如何被分片的。因为这个原因,经常要避免分片。

需要重申的是

  • 任何传输层首部只出现在第1片数据中。 其他分组都不包含传输层首部。
  • 在分片时,除最后一片外,其他每一片中的数据部分(除 IP首部外的其余部分)必须是 8字节的整数倍。

这是由IP头部格式中的“总长度(16bit)”和“偏移(13bit)”两个字段所决定的。总长度定义了IP包的最大长度为2^16,偏移说明了IP分片时它最多能表示2^13个偏移单位,这样偏移单位就是2^16/2^13=8。如果选4,则13bit的"偏移"就不能表示出IP的最大长度了;而如果选16,,只需要12bit的"偏移"就能表示出IP的最大长度了。即偏移单位小于8B时,“偏移”不能够表示出IP的最大长,偏移单位大于8时,“偏移”不会被完全利用。

TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

分片例子

假定有一个以太网和一份 8192字节的UDP数据报(包括首部和数据),那么需要分成多少个数据报片,每个数据报片的偏移和长度为多少?

答:以太网 MTU 为1500字节,减去IP首部长度20字节,每个分组UDP数据报长度位1480字节。

0-1480,1480-1480,2960-1480,4440-1480,5920-1480,7400-792。总共分成6个分组。

假定这些数据报片要经过一条 MTU为552的SLIP链路?

答:552-20(IP首部)=532。532/8=66.5

0-528,528-528,1056-528,1584-528,...,7920-272,。总共分成16个分组。

3.确定路径MTU

ICMP不可达差错(需要分片):

发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。

如果某个程序需要判断到达目的端的路途中最小MTU是多少,那么这个差错就可以被该程序使用。这种情况下的 ICMP不可达差错报文格式如下图所示。在第2个32 bit字中,16~31 bit可以提供下一站的MTU。

TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

确定路径MTU的步骤:

  1. 发送分组,并设置“不分片”标志比特;
  2. 发送的第一个分组的长度正好与出口 MTU相等,每次收到ICMP“不能分片”差错时就减小分组的长度;
  3. 如果路由器发送的 ICMP差错报文是新格式,包含出口的 MTU,那么就用该 MTU值来发送,否则就用下一个最小的 MTU值来发送。MTU值的个数是有限的。因此经过几次尝试之后就确定路径MTU。

4.应用场景

广播:一个主机要向网上的所有其他主机发送帧。

多播(multicast)处于单播和广播之间:帧仅传送给属于多播组的多个主机。

广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由IP地址确定)内的两进程(由端口号确定)间存在一条连接。

ARP和RARP 使用的就是广播。

协议栈各层对收到帧的过滤过程

TCP/IP 详解卷一学习笔记(三): UDP 用户数据报协议

  1. 网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。
  2. 设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。
  3. 设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为IP数据报时,就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层(如TCP或UDP)。每次UDP收到由IP传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个ICMP不可达报文(TCP根据它的端口号作相似的过滤)。如果UDP数据报存在检验和错,将被丢弃。

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷 。对于不参与一个应用的主机来说,不得不处理这些广播数据报。一直到UDP层,收到的UDP广播数据报才会被丢弃。多播可以解决这个问题。