【lwip】12-一文解决TCP原理( 三 )


  • 在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的 。
  • RST :复位标志 。复位标志有效,重建连接 。
  • SYN :同步标志 。同步序列编号(Synchronize Sequence Numbers)栏有效 。
    • 在连接建立时用来同步序号 。当 SYN=1,ACK=0 时表示这是一个连接请求报文段 。若对方同意建立连接,则响应报文中 SYN=1,ACK=1 。
  • FIN :结束标志 。用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接 。
  • 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据 。流量控制 。
  • 校验和 :检验和覆盖了整个的TCP报文段:TCP首部(包括伪首部)和TCP数据 。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证 。
  • 【【lwip】12-一文解决TCP原理】紧急指针 :紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号 。
    • TCP的紧急方式是发送端向另一端发送紧急数据的一种方式 。
    • 只有当 URG 标志置1时紧急指针才有效 。
  • 选项 :长度可变,最长可达40字节 。当没有使用“选项”时,TCP的首部长度是20字节 。选项字段长度需要为4字节的整数倍,不够的需要进行填充来模组4字节整数倍 。
  • 12.4.3 TCP伪首部TCP校验和的计算包括了三部分:TCP伪首部+TCP首部+TCP数据区 。
    TCP伪首部包含IP首部一些字段 。其目的是让TCP验证数据是否已经正确到达目的地 。
    TCP伪首部只参与校验,不参与实际发送 。
    【lwip】12-一文解决TCP原理

    文章插图
    12.4.4 TCP选项字段kind(Type)LengthNameReference描述&用途01EOLRFC 793选项列表结束11NOPRFC 793无操作(用于补位填充)24MSSRFC 793最大segment长度33WSOPTRFC 1323窗口扩大系数(Window Scaling Factor)42SACK-PremittedRFC 2018表明支持SACK5可变SACKRFC 2018SACK Block(收到乱序数据)810TSOPTRFC 1323Timestamps1918TCP-MD5RFC 2385MD5认证284UTORFC 5482user Timeout(超过一定闲置时间后拆除连接)29可变TCP-AORFC 5925认证(可选用各种算法)253/254可变ExperimentalRFC 4727保留,用于科研实验12.4.5 选项格式一般Option的格式为TLV结构,如下所示:
    Kind / Type(1 Byte)Length(1 Byte)Value
    1. EOL和NOP Option(Kind 0、Kind 1)只占1 Byte,没有Length和Value字段;
    2. NOP用于将TCP Header的长度补齐至32bit的倍数(由于Header Length字段以32bit为单位,因此TCP Header的长度一定是32bit的倍数);
    3. SACK-Premitted Option占2 Byte,没有Value字段;
    4. 其余Option都以1 Byte的“Kind”开头,指明Option的类型;Length指明Option的总长度(包括Kind和Length)
    5. 对于收到“不能理解”的Option,TCP会无视掉,并不影响该TCP Segment的其它内容 。
    12.4.6 wireshark报文分析
    【lwip】12-一文解决TCP原理

    文章插图
    12.5 TCP状态变迁图需要熟记TCP的状态变迁图,这有助于源码阅读 。
    【lwip】12-一文解决TCP原理

    文章插图
    12.6 TCP连接与关闭12.6.1 三次握手TCP 是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接,俗称“三次握手” 。
    主要分为三个步骤:
    1. 第一步 :客户端向服务端发送一个 SYN报文段 (只有首部,且SYN被置 1),初始序号(ISN),假设为 A,ACK 置 0 。( 客户端进入SYN_SEND状态 )
    2. 第二步 :服务器端收到SYN报文段 ,便知道客户端需要请求握手,从 SYN报文段 中提取对应的信息,为该 TCP 连接分配 TCP 缓存和变量,并向该客户 TCP 发送允许连接的报文段(握手应答报文) 。这个报文段只有首部,包含3个重要的信息:( 建立客户端-->服务端的连接 )( 服务器进入SYN_RECV状态 )

      经验总结扩展阅读