zoukankan      html  css  js  c++  java
  • TCP路径MTU发现

    路径MTU

    当在同一个网络上的两台主机互相通信时,该网络的MTU是非常重要的。当时如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU,而是两台通信主机路径中的最小MTU,称为路径MTU;

    两台主机之间的路径MTU不一定是个常数,它取决于当时所选的路由,而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的;

    路径MTU发现

    路径MTU发现通过在IP首部中设置”不要分片(DF)”标志,来发现当前路径上的路由器是否需要对正在发送的IP数据报进行分片。当设置了DF标志位,而其长度又超过了MTU,那么路由器将返回一个ICMP差错;

    TCP路径MTU发现按照以下方式进行:在连接建立时,TCP使用输出接口或者对端声明的MSS中的最小值MTU作为起始的报文段大小。路径MTU发现不允许TCP超过对端声明的MSS。如果对端没有指定MSS,则默认536;

    一旦选定了起始报文段的大小,在该连接上的所有被TCP发送的IP数据报都将被设置DF标志。如果某个中间路由器需要对一个设置了DF标志的数据报进行分片,它就丢弃这个数据报,并产生一个CIMP”不能分片”差错;

    如果收到这个ICMP差错,TCP就减少段大小并进行重传。如果路由器产生的是一个较新的该类ICMP差错,则报文段大小被设置为下一跳的MTU减去IP和TCP首部长度。如果是一个较旧的该类ICMP差错,则必须尝试下一个可能的最小MTU。当由这个ICMP差错引起的重传发生时,拥塞窗口需要不断变化,但要启动慢启动;

    由于路由可以动态变化,因此在最后一次减少路径MTU的一段时间以后,可以尝试使用一个较大的值(直到等于对端声明的MSS或者输出接口MTU的最小值);

    在对非本地目的地,默认的MSS通常为536字节,路径MTU发现可以避免在通过MTU小于576的中间链路进行分片。对于本地目的主机,也可以避免在中间链路的MTU小于端点网络的情况下进行分片。但为了能使路径MTU更加有用和充分利用MTU大于576的广域网,一个实现必须停止使用为非本地目的制定的536的MTU默认值。MSS的一个较好的选择是输出接口的MTU(当然要减去IP和TCP首部大小);

    文章来源:<TCP/IP详解>

  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11750582.html
Copyright © 2011-2022 走看看