一、MTU介绍
- 前面的文章介绍了“路径最大传输单元(MTU)”,参阅:https://blog.csdn.net/qq_41453285/article/details/95997936
- MTU是指经过两台主机之间路径的所有网络报文段中最大传输单元的最小值
- 知道路径最大传输单元后能够有助于一些协议(比如TCP)避免分片。在前面UDP的文章介绍了基于ICMP消息的路径最大传输单元发现(PMTUD)过程是如何实现的,但由于应用程序已经指定了尺寸(即,非传输层协议),UDP协议一般不会采用上述发现过程获得的数据报大小。TCP在支持字节流抽象的实现过程中能够决定使用多大的报文段,因此它很大程度上控制了最后生成的IP数据包
二、分组层路径最大传输单元发现(PLPMTUD)
- 我们将会进一步探寻TCP是如何使用路径最大传输单元的。我们的讨论内容适用于TCP/IPv4与TCP/IPv6
- 一种称作“分组层路径最大传输单元发现”(PLPMTUD)的算法能够避免对ICMP的使用。根据[RFC4821],该算法也能够被TCP或其他传输协议使用。我们可以利用IPv6协议中“数据包太大” (PTB)的术语来代表ICMPv4地址不可达(需要分片)或ICMPv6数据包太大的消息
路径最大传输单元发现过程
- TCP常规的路径最大传输单元发现过程如下:
- 在一个连接建立时,TCP使用对外接口的最大传输单元的最小值,或者根据通信对方声明的最大段大小来选择发送方的最大段大小(SMSS)
- 路径最大传输单元发现不允许TCP发送方有超过另一方所声明的最大段大小的行为
- 如果对方没有指明最大段大小的数值,发送方将假设采用默认的536字节,但是这种情况比较少见
- 如果为每一个目的地保存对应的路径最大传输单元,那么就能方便地对段大小进行选择
- 值得注意的是,一条连接的两个方向的路径最大传输单元是不同的
- 一旦为发送方的最大段大小选定了初始值,TCP通过这条连接发送的所有IPv4数据报都会对DF位字段进行设置。TCP/IP没有DF位字段,因此只需要假设所有的数据报都已经设置了该字段而不必进行实际操作:
- 如果接收到PTB消息,TCP就会减少段的大小,然后用修改过的段大小进行重传
- 如果在PTB消息中已包含了下一跳推荐的最大传输单元,段大小的数值可以设置为下一跳最大传输单元的数值减去IPv4(或IPv6)与TCP头部的大小
- 如果下一跳最大传输单元的数值不存在(例如,一个之前的ICMP错误被返回时会缺乏这一信息),发现者可能需要尝试多个数值(例如,采用二分搜索法选择一个可用的数值)。这也会影响到TCP的拥塞控制管理。对于分组层路径最大传输单元发现而言,除了PTB的消息不被使用以外其他情况基本类似。相反,执行路径最大传输单元发现的协议必须能够快速地检测消息丢弃并调整自已的数据报大小
- 由于路由是动态变化的,在减少段大小的数值一段时间后需要尝试一个更大的数值(接近初始的发送方最大段大小)。根据[RFCl191]与[RFC1981]的指导意见,该时间间隔大约为10分钟
路径最大传输单元发现过程存在的问题(黑洞问题、黑洞探测)
- 在互联网环境中,由于防火墙阻塞PTB消息,路径最大传输单元发现过程会存在一些问题
- 在备种操作问题中,黑洞问题的情况虽有所好转(在[LSlO]中,80%被调查的系统都能够正确地处理PTB消息),但仍悬而未决
- 在TCP实现依靠传输ICMP消息来调整它的段大小的情况下,如果TCP从未接收到任何ICMP消息,那么在路径最大传输单元发现过程中就会造成黑洞问题。这种情况可能由多方面的原因造成,其中包括了防火墙或NAT配置为禁止转发ICMP消息。其后果在于一旦TCP使用了更大的数据包将不能被正确处理。 由于只是不能转发大数据包,所以诊断出这一问题是十分困难的。那些较小的数据包(比如 用于建立连接的SYN与SYN +ACK数据包)是能够成功处理的
- 一些TCP实现具有“黑洞探测”功能。当一个报文段在反复重传数次后,将会尝试发送一个较小的报文段
三、例子
- 待续
转载:https://blog.csdn.net/qq_41453285/article/details/104040188
查看评论