一、首部
-
16 位源端口号
-
16 位目标端口号
-
32 位序列号/序号:指发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小,用来解决乱序问题
- 序列号不会从 0 或 1 开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,然后再将每转发过去的字节数累加到初始值上表示数据的位置,此外,在建立连接和断开连接时发送的 SYN 包和 FIN 包虽然并不携带数据,但是也会作为一个字节增加对应的序列号
-
32 位确认应答号:指下一次应该收到的数据的序列号,用来解决丢包问题
- 实际上,它是指已收到确认应答号减一为止的数据,发送端收到这个确认应答以后可以认为这个序号以前的数据都已经被正常接收
-
4 位数据偏移:表示 TCP 所传输的数据部分应该从 TCP 包的哪个位置开始计算,当然也可以把它看作 TCP 首部的长度
- 单位为 4 字节,如果该字段的值为 5,那说明从 TCP 包的最一开始到 20 字节为止都是 TCP 首部,余下的部分为 TCP 数据
-
4 位保留
- 该字段主要是为了以后扩展时使用,一般设置为 0
-
8 位控制位:
- CWR
- ECE
- URG:该位为 1 时,表示包中有需要紧急处理的数据,对于需要紧急处理的数据,会在后面的紧急指针中再进行解释
- ACK:该位为 1 时,确认应答的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
- PSH
- 该位为 1 时,表示需要将收到的数据立刻传给上层应用协议
- 该位为 0 时,则不需要立即传而是先进行缓存
- RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接
- SYN:该位为 1 时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定
- FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接
- TCP 必须保证报文是有序发送的,FIN 报文也不例外,当发送缓冲区还有数据没有发送时,FIN 报文也不能提前发送
-
16 位窗口大小:
-
16 位校验和
-
16 位紧急指针:只有在 URG 控制位为 1 时有效
- 从数据部分的首位到紧急指针所指示的位置为止为紧急数据
-
选项:用于提高 TCP 的传输性能
- 具有代表性的选项见下表:
- 具有代表性的选项见下表: