zoukankan      html  css  js  c++  java
  • TCP报头中的选项字段

    TCP的选项有哪些内容

      TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图所示。

    • 选项的第一个字段kind说明选项的类型,有的TCP选项没有后面两个字段,仅包含1字节的kind字段
    • 第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节
    • 第三个字段info(如果有的话)是选项的具体信息

    常见的TCP选项有7种,如图所示

     注意:

    上图中kind=0时,Name有问题,应该是EOP

    部分报文分析:

    1、kind=0,选项表结束(EOP)选项
      告知选项结束

    2、kind=1,空操作(NOP)选项
      没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍

    3、kind=2,最大报文段长度(MSS)选项
      TCP连接初始化时,通信双方使用该选项来协商最大报文段长度,防止IP分片。每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中)。如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节(这个默认值允许2 0字节的IP首部和2 0字节的TCP首部以适合576字节IP数据报)。计算方法如下:

      TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。

    4、kind=3,窗口扩大因子选项(WSOPT)
      TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口(滑动窗口)大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。
      假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改 /proc/sys/net/ipv4/tcp_window_scaling 内核变量来启用或关闭窗口扩大因子选项。
    和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收窗口大小就是该TCP报文段的实际接收窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。

    5、kind=4,选择性确认(SACK-permitted)选项
      TCP通信时,如果某个TCP报文段丢失,则TCP会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改 /proc/sys/net/ipv4/tcp_sack 内核变量来启用或关闭选择性确认选项。

    6、kind=5,SACK实际工作的选项
      该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。

    7、kind=8,时间戳选项。
      该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改 /proc/sys/net/ipv4/tcp_timestamps 内核变量来启用或关闭时间戳选项。
    参考文章

    https://blog.csdn.net/yangzqiao/article/details/103060162

    https://www.cnblogs.com/cangqinglang/p/13817086.html

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/15055644.html

  • 相关阅读:
    C#实现仪器的自动化控制
    .Net FrameWork常用类
    编码:隐匿在计算机软硬件背后的语言(8)--自动操作(三)
    深入理解计算机系统(4)-- 整数和浮点数
    编码:隐匿在计算机软硬件背后的语言(8)--自动操作(二)
    C#中二进制、十进制和十六进制互相转换的方法
    深入理解计算机系统(3)-- 信息存储
    mysql-5.7.17-winx64免安装版环境配置 问题小记
    python生成随机数:uniform(), randint(), gauss(), expovariate()
    深度学习翻译 效果优于各类翻译器
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/15055644.html
Copyright © 2011-2022 走看看