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,源端口号码

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

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

  • Acknowledgment Number: 32 bits,确认号码

    • 如果设定了ACK控制位,则这个头部包含了分片接收者期待接收的下一个系列号码。
    • 一旦连接建立,这个头部就总是发送。
    • 序列号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一
      个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP用序号对每个字节进
      行计数。序号是32 bit的无符号数,序号到达 2 32 - 1 2^{32}-1 2321后又从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,保留

    • 保留以后使用。
    • 必须是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,窗口

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

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

    • 校验和也包括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位边界。
    • 填充由零组成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值