源端口号(Source Port):表示发送端端口号,字段长16位
目标端口号(Destination Port):表示接收端端口号,字段长16位
序列号(Sequence Number):字段长32位,序列号是指发送数据的位置,没发送一次数据,就累加一次该数据的大小。
它不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。
然后再将每转发过去的字节数累加到初始值上表示数据位置,
此外,在建立连接和断开连接时发送的SYN包和FIN包虽然都不携带数据,但也会作为一个字节增加对应的序列号。
确认应答号(Acknowledgement Number):字段长32位,指下一次应该收到的序列号,实际上,它是指已经收到确认应答号减一为止的数据。
发送端收到这个确认应答后可以认为在这个序号以前的数据已经被正常接收。
数据偏移(Data Offset):该字段表示TCP传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看做是TCP首部的长度。
该字段长4位,单位为4字节(32位)。如上图的TCP首部为20字节(5*4),因此数据偏移字段可以设置为5。
反之,偏移字段为5,则TCP从一开始到20字节处都是TCP首部。
保留(Reserved):主要为了以后拓展用,4位,常设为0。
控制位(Control Flag):字段长位8位,从左往右依次是:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫控制位。具体含义如下图:
窗口大小(Window Size):字段长16位,用于通知从相同TCP首部的确认应答号所指位置开始能接收的数据大小(8位字节)。
TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。
但这个数据必须是1个字节。
校验和(Checksum):TCP和UDP的校验和相似,但是TCP的校验和无法关闭。
TCP和UDP一样在计算时使用TCP伪首部,伪首部如下图,
在数据最后补零以令其全长为16的整数倍,首先将TCP校验和字段设为0,然后以16位为单位进行1的补码和计算,再将它们总和的1的补码和放入校验和字段。
接收端在接收到TCP数据后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。
由于校验和字段里保存着除本字段以外其他部分的和的补码值,
因此如果计算校验和字段在内的所有数据的16位和之后,得出的结果是“16位全部为1”说明所收到的数据是正确的。
紧急指针(Urgent Pointer):16位,只有在URG位为1时有效。该字段的数值表示本报文中紧急数据的指针。
正确来讲,从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数据的末尾在报文段中的数据。
选项(Options):该字段用于提高TCP传输性能,因为根据数据偏移(首部长度)进行控制,所以其最大长度为40字节。