TCP头部解析

TCP头部解析:


0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|          Source Port          |       Destination Port        |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|                        Sequence Number                        |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|                    Acknowledgment Number                      |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|  Data |           |U|A|P|R|S|F|                               |
	| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
	|       |           |G|K|H|T|N|N|                               |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|           Checksum            |         Urgent Pointer        |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|                    Options                    |    Padding    |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	|                             data                              |
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
							TCP Header Format
  • Source Port: 16 bits,源端口号码html

  • Destination Port: 16 bits,目的端口号码web

    • 源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址惟一肯定一个TCP链接
  • Sequence Number: 32 bits,序列号app

  • Acknowledgment Number: 32 bits,确认号码svg

    • 若是设定了ACK控制位,则这个头部包含了分片接收者期待接收的下一个系列号码。
    • 一旦链接创建,这个头部就老是发送。
    • 序列号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一
      个数据字节。若是将字节流看做在两个应用程序间的单向流动,则 TCP用序号对每一个字节进
      行计数。序号是32 bit的无符号数,序号到达 2 32 1 2^{32}-1 后又从0开始
    • 当创建一个新的链接时, SYN标志变1。序号字段包含由这个主机选择的该链接的初始序
      号ISN( Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个 ISN加1,由于
      SYN标志消耗了一个序号
    • 既然每一个传输的字节都被计数,确认序号包含发送确认的一端所指望收到的下一个序号。
      所以,确认序号应当是上次已成功收到数据字节序号加 1。只有ACK标志为 1时
      确认序号字段才有效。
    • TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。所以,连
      接的每一端必须保持每一个方向上的传输数据序号。
  • Data Offset: 4 bits,数据偏移函数

    • TCP头部中32bit双字(words)的数目。
    • 指示了数据从哪里开始。
    • TCP头部(即便是包含选项的头部)是32bits长度的整数号码。
  • Reserved: 6 bits,保留spa

    • 保留之后使用。
    • 必须是0值。
  • Control Bits: 6 bits (from left to right),控制位指针

    • URG: Urgent Pointer field significant,紧急指针字段有效
    • ACK: Acknowledgment field significant,确认头部字段有效
    • PSH: Push Function,强制函数,接收方应该尽快将这个报文段交给应用层
    • RST: Reset the connection,重置链接
    • SYN: Synchronize sequence numbers,同步系列号码
    • FIN: No more data from sender,再没有来自发送者的数据
  • Window: 16 bits,窗口code

    • 接收端正准备接收的数据八位字节的数目,开始于确认字段(acknowledgment)指示的位置
  • Checksum: 16 bits,校验和orm

    • 在头部和文本中的全部16 bit字的补偿总和。若是分片包含一个0值的头部和文本八位字节要检验,为校验用最后一个八位字节右边填充0值以构成一个16 bit的字。填充不做为分片的一部分传送。当计算校验和的时候,校验和字段本身被0代替。xml

    • 校验和也包括TCP头部以前的伪头部。这些伪头部包括源地址,目的地址,协议和TCP长度。这能够避免报文被错误地路由。这些信息在Internet协议中携带,在TCP/Network接口的参数中传递,或者是TCP调用IP的返回值。

      +--------+--------+--------+--------+
                 |           Source Address          |
                 +--------+--------+--------+--------+
                 |         Destination Address       |
                 +--------+--------+--------+--------+
                 |  zero  |  PTCL  |    TCP Length   |
                 +--------+--------+--------+--------+
    • TCP长度是TCP头部加上数据长度的八位字节数(这不是一个明确传输的数量,可是被计算),且它不计入12个八位字节的伪头部。

  • Urgent Pointer: 16 bits,紧急指针

    • 该字段传达了紧急指针的当前值,是该分片里面从系列号码开始的正偏移。
    • 紧急指针指向根据紧急数据后面的八位字节的系列号码。该头部只有当URG控制位设置时才有效。
  • Options: 选项,可变

    • 选项位于TCP头部后面,长度上是8 bits的整数倍。全部选项包含在校验和中。选项能够开始于任何八位字节巴结。选项的格式有两种状况:

      • 1:单独的选项类型(option-kind)的八位字节
      • 2:选项类型的八位字节,选项长度的八位字节,以及真正的选项数据字节。
    • 选项长度(option-length)计入了选项类型(option-kind),选项长度(option-length)以及选项数据(option-data)。

    • 注意选项列表可能比数据偏移字段暗示的短。超过End-of-Option选项的头部的内容必须进行填充。

    • TCP必须实现全部的选项

    • 当前定义的选项包括:

      Kind     Length    Meaning
        ----     ------    -------
        0         -       End of option list.
        1         -       No-Operation.
        2         4       Maximum Segment Size.
    • 特定选项定义:

      • End of Option List,选项列表的结束

        +--------+
          |00000000|
          +--------+
           Kind=0
        • 选项代码指示了选项列表的结束。这可能同根据数据偏移字段获得的TCP头部不一致。
        • 这个选项用在全部选项的结束,而不是每一个选项的结束。且仅在选项的结束同TCP头部的结束不一致的状况下须要使用
      • No-Operation,无操做

        +--------+
          |00000001|
          +--------+
           Kind=1
        • 该选项代码能够在选项之间使用,好比,为了在一个字边界上对齐接下来的选项的开始。
        • 不保证发送者使用这个选项,因此接收者必须准备处理没有在一个字边界对齐的选项。
      • Maximum Segment Size,最大分片大小

        +--------+--------+---------+--------+
          |00000010|00000100|   max seg size   |
          +--------+--------+---------+--------+
           Kind=2   Length=4
      • Maximum Segment Size Option Data: 16 bits, 最大分片大小选项数据

        • 若是这个选项存在,则其指示了发送这个分片的TCP的最大接收分片。
        • 这个字段必须仅在初始化链接请求阶段发送(好比,在SYN 控制位设置的分片)。
        • 若是不使用这个选项,则容许任意大小的分片。
  • Padding: 可变,填充

    • TCP报头填充用于确保TCP报头结束,数据开始于32位边界。
    • 填充由零组成。