1、UDP首部
2、UDP分片
在第二章,讲链路层是,提到过以太网,刨除数据帧帧头,最多传输的长度为1500,也就是说,如果一个ip数据报,长度大于1500,则需要分片。
分片方法:
- 在ip头中3位标志,13位片偏移,这俩东西就是用来分片的。
- 3位标志中:一个更多的片标识,除了最后一个分片,其它分片都要有这个标识,还有一个不分片标识,如果置上,则即便IP数据报再长,也不分片,但是会将该IP数据报丢弃,并发送一个ICMP差错报文给发送端。
- 13位片偏移:用于表示相对于起始的偏移量,就是个offset。
- 每个分片都有一个独立的IP头,20个字节。
- IP的分片和组装都是在IP层完成的,其对UDP/TCP网络层是透明的。
- 如果在传输过程中,某个分片丢失,则需要重传整个IP数据报,不能单独传递某个分片,这主要是,如果是中间某个路由器做的分片,起始端也不知道如何分片的,所以只能重传整个IP数据报。
- 至于重不重传。则只能有网络层来决定。TCP会丢包重传,但是UDP则不会,IP层是没有丢包重传机制的。
- 传输单元,IP层叫IP数据报,链路层叫分组
IP报分片如下图所示,注意,只有第一个分片有UDP头,但是每个分片都有IP首部。
3、ICMP不可达差错(需要分片)
如果在IP首部设置了不可分片标志,但是达到MTU上限,必须分片,则会丢弃该IP报,返回ICMP不可达差错。
U D P长度字段指的是U D P首部和U D P数据的字节长度。该字段的最小值为8字节(发送一
份0字节的U D P数据报是O K)。这个U D P长度是有冗余的。I P数据报长度指的是数据报全长
(图3 - 1),因此U D P数据报长度是全长减去I P首部的长度
份0字节的U D P数据报是O K)。这个U D P长度是有冗余的。I P数据报长度指的是数据报全长
(图3 - 1),因此U D P数据报长度是全长减去I P首部的长度
Host Requirements RFC声明,U D P检验和选项在默认条件下是打开的。它还声明,
如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验
和不为0)。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证
接收到的检验和。
如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验
和不为0)。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证
接收到的检验和。
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层来完成,其目的是使分片和重新组装过程对运输层(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层本身没有超时重传的机制——由更高层来
负责超时和重传(T C P有超时和重传机制,但U D P没有。一些U D P应用程序本身也执行超时和
重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对
应于一份I P数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的
是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这
个原因,经常要避免分片。
其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到
这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每
个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。
另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,I P将不对数据报
进行分片。相反把数据报丢弃并发送一个I C M P差错报文(“需要进行分片但设置了不分片比
特”,见图6 - 3)给起始端。在下一节我们将看到出现这个差错的例子。
当I P数据报被分片后,每一片都成为一个分组,具有自己的I P首部,并在选择路由时与
其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在I P首部中有足
够的信息让接收端能正确组装这些数据报片。
尽管I P分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重
传整个数据报。为什么会发生这种情况呢?因为I P层本身没有超时重传的机制——由更高层来
负责超时和重传(T C P有超时和重传机制,但U D P没有。一些U D P应用程序本身也执行超时和
重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对
应于一份I P数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的
是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这
个原因,经常要避免分片。
前两份U D P数据报(第1行和第2行)能装入以太网数据帧,没有被分片。但是对应于写
1 4 7 3字节的I P数据报长度为1 5 0 1,就必须进行分片(第3行和第4行)。同理,写1 4 7 4字节产生
的数据报长度为1 5 0 2,它也需要进行分片(第5行和第6行)。
当I P数据报被分片后,t c p d u m p打印出其他的信息。首先,frag 26304(第3行和第4
行)和frag 26313(第5行和第6行)指的是I P首部中标识字段的值。
分片信息中的下一个数字,即第3行中位于冒号和@号之间的1 4 8 0,是除I P首部外的片长。
两份数据报第一片的长度均为1 4 8 0:U D P首部占8字节,用户数据占1 4 7 2字节(加上I P首部的
2 0字节分组长度正好为1 5 0 0字节)。第1份数据报的第2片(第4行)只包含1字节数据—剩下
的用户数据。第2份数据报的第2片(第6行)包含剩下的2字节用户数据。
在分片时,除最后一片外,其他每一片中的数据部分(除I P首部外的其余部分)必须是8
字节的整数倍。在本例中,1 4 8 0是8的整数倍。
位于@符号后的数字是从数据报开始处计算的片偏移值。两份数据报第1片的偏移值均为0(第3行
和第5行),第2片的偏移值为1 4 8 0(第4行和第6行)。跟在偏移值后面的加号对应于I P首部中3 bit标志
字段中的“更多片”比特。设置这一比特的目的是让接收端知道在什么时候完成所有的分片组装。
最后,注意第4行和第6行(不是第1片)省略了协议名(U D P)、源端口号和目的端口号。
协议名是可以打印出来的,因为它在I P首部并被复制到各个片中。但是,端口号在U D P首部,
只能在第1片中被发现。
1 4 7 3字节的I P数据报长度为1 5 0 1,就必须进行分片(第3行和第4行)。同理,写1 4 7 4字节产生
的数据报长度为1 5 0 2,它也需要进行分片(第5行和第6行)。
当I P数据报被分片后,t c p d u m p打印出其他的信息。首先,frag 26304(第3行和第4
行)和frag 26313(第5行和第6行)指的是I P首部中标识字段的值。
分片信息中的下一个数字,即第3行中位于冒号和@号之间的1 4 8 0,是除I P首部外的片长。
两份数据报第一片的长度均为1 4 8 0:U D P首部占8字节,用户数据占1 4 7 2字节(加上I P首部的
2 0字节分组长度正好为1 5 0 0字节)。第1份数据报的第2片(第4行)只包含1字节数据—剩下
的用户数据。第2份数据报的第2片(第6行)包含剩下的2字节用户数据。
在分片时,除最后一片外,其他每一片中的数据部分(除I P首部外的其余部分)必须是8
字节的整数倍。在本例中,1 4 8 0是8的整数倍。
位于@符号后的数字是从数据报开始处计算的片偏移值。两份数据报第1片的偏移值均为0(第3行
和第5行),第2片的偏移值为1 4 8 0(第4行和第6行)。跟在偏移值后面的加号对应于I P首部中3 bit标志
字段中的“更多片”比特。设置这一比特的目的是让接收端知道在什么时候完成所有的分片组装。
最后,注意第4行和第6行(不是第1片)省略了协议名(U D P)、源端口号和目的端口号。
协议名是可以打印出来的,因为它在I P首部并被复制到各个片中。但是,端口号在U D P首部,
只能在第1片中被发现。
发送的第3份数据报(用户数据为1 4 7 3字节)分片情况如图11 - 8所示。需要重申的是,任
何运输层首部只出现在第1片数据中。
何运输层首部只出现在第1片数据中。
另外需要解释几个术语:I P数据报是指I P层端到端的传输单元(在分片之前和重新组装
之后),分组是指在I P层和链路层之间传送的数据单元。一个分组可以是一个完整的I P数据报,
也可以是I P数据报的一个分片。
之后),分组是指在I P层和链路层之间传送的数据单元。一个分组可以是一个完整的I P数据报,
也可以是I P数据报的一个分片。
理论上,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字节。但是,大多数实现所提供的长度比这个最大值小。
限制的。去除2 0字节的I P首部和8个字节的U D P首部,U D P数据报中用户数据的最长长度为
6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。