TCP Header
- 16位端口号:源端口和目的端口各占16位,2的16次方等于65536,看端口的命令:netstat。
- 序列号:字段长32位,表示发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时生成的随机数作为其初始值,通过SYN包传给接收端。然后再将每次转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但也作为一个字节增加对应的序列号。
- 字长32位表示下一次应该收到的数据的序列号。在此保证确认号之前的数据都被确认。
- 4字长数据偏移:该字段表示TCP传输数据包的位置从哪个TCP包开始计算。
- 四字节保留字段:作为有扩展使用;
- 字长8位的控制位:依次为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN
CWR和ECE都用于IP首部的ECN字段,当ECE字段为1是,通知对方,拥塞窗口已缩小。
URG标志为1表示该部分为紧急事件,做进一步处理。
ACK标志位1表示确认应答的字段有效。
PSH位为1则将接收到的数据立即发送给上层协议,为0则先缓存,缓冲区满在发送给上层协议。
RST为1是表示连接异常必须强制中断。
SYN为1表示希望建立连接,进行序列号初始值设定;连接过程是一个确认应答号和序列号同步的过程。
FIN为1表示之后不会再有数据发送,发送端完成发送,希望断开连接;每个主机对对方的FIN包进行确认应答后就断开连接。
- 16位窗口大小;指的是从确认应答号所在报文位置开始能够接收的数据大小(8位);如果窗口大小为0,表示可以发送窗口探测。
- 校验和:TCP校验和计算的作用是判断协议首部和数据是否被破坏。TCP在计算校验和的时候使用TCP伪首部。为了使其全长为16位的整数倍,需要在数据部分的最后填充0。首