读书笔记八:TCP/IP详解之 UDP:用户数据报协议
UDP:用户数据报协议
UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。
UDP 的数据结构
UDP封装: 20字节IP首部+8字节UDP首部+UDP数据
UDP首部格式:
解释:
- 源端口号:该项是任选项,默认值是0,可以被指定。端口号表示发送进程和接收进程.
- 目的端口号:该项必须指定,因为这个作为接收主机内特定应用进程相关联的地址。
- UDP长度:该字段表示数据报文的长度(包含首部和数据部分),最小8个字节。
- UDP伪首部包含了IP首部的一些字段,只在计算UDP校验和时使用,并不实际存在。
UDP协议头
UDP端口号
由于很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的UDP包都会交给该程序。端口号理论上可以有2^16这么多。因为它的长度是16个bit。如果端口不可达会发送ICMP端口不可达报文。(traceroute)
UDP检验和
这是一个可选的选项,并不是所有的系统都对UDP数据包加以检验和数据(相对TCP协议的必须来说),但是RFC中标准要求,发送端应该计算检验和。
UDP检验和覆盖UDP协议头和数据,这和IP的检验和是不同的,IP协议的检验和只是覆盖IP数据头,并不覆盖所有的数据。UDP和TCP都包含一个伪首部,这是为了计算检验和而设置的。伪首部甚至还包含IP地址这样的IP协议里面都有的信息,目的是让UDP两次检查数据是否已经正确到达目的地。如果发送端没有打开检验和选项,而接收端计算检验和有差错,那么UDP数据将会被悄悄的丢掉(不保证送达),而不产生任何差错报文。
UDP校验和包含UDP伪首部,UDP首部和数据,如果数据不足16bit的整数倍,填充0补数。
当接收端检查到校验和有误,直接丢弃UDP报文,而不产生差错报文。(与IP层检查IP首部校验和有错误时操作相同)
UDP长度
UDP报文可以很长,可以有65535字节那么长。但是一般网络在传送的时候,一次一般传送不了那么长的协议(涉及到MTU的问题),就只好对数据分片,当然,这些是对UDP等上级协议透明的,UDP不需要关心IP协议层对数据如何分片。
IP分片
IP首部中的16位标识字段,3位标志字段和13位片偏移字段作用于IP分组重组。标识字段标识每一份IP数据报,IP数据报分片时该字段复制到每个分片中。
标志字段其中一位表示”更多的片”,除最后一片外,其他分组数据报都置为1。另一位表示”不分片位”,如果置为1,当需要对IP数据报分片时,丢弃数据报并发送ICMP差错报文(需要分片但设置了不分片选项)。
片偏移字段表示该片偏移原始数据报开始处的位置。
分片重组过程:
(1)当IP层收到一份IP数据报,首先IP选路,然后查询该接口MTU,如果IP数据报长度大于接口MTU,既要IP分片.
(2)IP数据报分片,到达【最终目的地址】才进行重新组装.
(3)分组和重组发生在【网络层(IP)】,对运输层(UDP/TCP)是透明的.
(4)即使丢失了一片数据报,重传整个IP数据报.因为IP层没有超时重传机制,该机制由更高层协议提供,如TCP.
(5)在分片中,除最后一片外,其他数据部分(除IP首部外的数据)必须为8bit的倍数.
(6)【传输层】首部只出现在第一片IP数据报中。
分组指在IP层和链路层之间传输的数据单元。分组可以为一个完整的IP数据报,也可以为IP数据报的一个分片。然后把分组封装成链路层的数据帧。
UDP和ARP之间的交互作用
这是不常被人注意到的一个细节,这是针对一些系统地实现来说的。当ARP缓存还是空的时候。UDP在被发送之前一定要发送一个ARP请求来获得目的主机的MAC地址,如果这个UDP的数据包足够大,大到IP层一定要对其进行分片的时候,想象中,该UDP数据包的第一个分片会发出一个ARP查询请求,所有的分片都会 等到这个查询完成以后再发送。事实上是这样吗?
结果是,某些系统会让每一个分片都发送一个ARP查询,所有的分片都在等待,但是接受到第一个回应的时候(因为arp队列是后入先出的,所以最后一个分片反而第一个获得响应),主机却只发送了最后一个数据片而抛弃了其他(只发送了ip数据报的最后一个分片,前面的分片却没有发送),这实在是让人匪夷所思(这实际上是ARP的正常操作。在大多数的实现中,等待一个ARP应答时,只将最后一个报文发送给特定目的主机)。这样,因为分片的数据不能被及时组装,接受主机将会在一段时间内将永远无法组装的IP数据包抛弃,并且发送组装超时的ICMP报文(其实很多系统不产生这个差错),以保证接收主机自己的接收端缓存不被那些永远得不到组装的分片充满。
ICMP不可达差错(需要分片)
当路由器收到一份【需要分片】的数据报,而在IP首部【设置了不分片(DF)】的标识比特,那么将向发送该数据报的源地址发送ICMP不可达差错(需要分片).路径MTU发现机制即利用该差错报文实现.
ICMP源站抑制差错
当目标主机的处理速度赶不上数据接收的速度,因为接受主机的IP层缓存会被占满,所以主机就会发出一个ICMP源站抑制差错报文。