源端口和目的端口:
各占16位 ,服务相对应的源端口和目的端口。
序列号:
占32位,它的范围在[0~2^32-1],序号随着通信的进行不断的递增,当达到最大值的时候重新回到0在开始递增。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号。整个要传送的字节流的起始号必须在连接建立时设置。下个序列号(发送)等于上个序列号(接受)加上报文长度。
确认号:
占32位,用于确认对上个数据包接收成功。确认号(发送)等于上个序列号(接受)加一
数据偏移:
占4位,指出TCP报头从起始端到数据端的距离,该字段描述了TCP报头的长度。由于option字段的存在,所以TCP报头的长度往往是不确定的,因此该字段很有存在的必要了。需要注意的是“数据偏移”计算的单位是32位字(即4个字节为一个计算单位)。因此“数据偏移”有4个位所以能够表达的最大的十进制为15,也就说TCP报头的最大长度为60字节。
保留位:
占6位,保留为今后使用,目前该字段为全0.
标志位:
占6位,用于标志数据包
URG: 该字段为1时紧急发送数据。相当于提高数据发送的优先级,不按照原来队列顺序来进行发送,同时启用紧急指针。
ACK: 该字段为1时表示确认号有效,当该位为0是表示确认号无效。TCP规定,建立链接后所有数据报文段ACK都设为1。
PSH: 该字段为1时紧急接收数据。该字段允许数据包不需要等到接收端的缓存(窗口)满了后才上交数据,而是直接上交数据。
RST: 该字段为1时表示该连接出现严重的错误,必须释放该连接再重新建立连接进行数据传输。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。
SYN: 该字段位1时表示发送连接请求,用来在建立连接时进行同步序号。
FIN: 该字段为1时表示发送释放请求,用于释放当前的连接。
窗口:
占16位。窗口指的是接收窗口。用于限制发送方当前允许发送的数据量。这是因为接收方的数据缓存空间是有限的。
检验和:
占16位。检验和字段检验的范围包括首部和数据两部分。
紧急指针:
占16位。当URG=1的时候才生效,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出了紧急数据的末尾报文段中的位置。当所有的紧急数据都处理完毕时,TCP就告诉应用程序恢复正常的操作。
选项:
长度可变,最长可达40字节(320位)。当没有使用option字段的时候TCP报文首部长度为20字节。
流量控制:
发送端发送的流量不可以无限大,因为接收端的缓存区是有限的,因此需要在TCP报文当中添加windows字段
windows字段可以表示当前发送的流量大小,如果发送的流量大于接收端处理流量的缓存,接收端会在回复TCP报文
时置窗口大小为自身所能处理的大小。这样下次发送端会依照此窗口大小来调整所发的数据流量大小,避免重复丢包。
另外当发送端刚好发完一次窗口大小的流量,那么他会等待接收端的确认包后才继续下次发送。