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 232-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,保留
- 保留以后使用。
- 必须是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位边界。
- 填充由零组成。