源端口
表示发送端端口,字段长度16位。
目标端口
表示接收端端口,字段长度16位。
序列号(Sequence Number)
字段长32位。指发送数据的位置。每发送一次数据,就会累加一次该数据字节的大小。
序列号不会从0或1开始,建立连接时计算机随机生成初始值,通过SYN包传给接收端主机。然后将每转发过去的字节数累加到初始值上表示数据位置。此外,在建立连接和断开连接时发送SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号
确认应答号(Ack)
长度32位,表示期望收到数据的开始序列号,也即已经收到的数据的字节长度加1,发送端收到这个确认应答后可以认为这个序号以前的数据已经被正常接收。
数据偏移(Data Offset)
长度4位,单位为4字节,计算出的数据段开始地址的偏移值。
保留(Reserved)
该字段为以后扩展时用,长度4为,一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃。
控制位、标识符(Control Flag)
长度8位,从左到右分别为 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN
- CWR 与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小
- ECE ECN-Echo有两种意思,取决于SYN标志的值。
- URG 为1表示高优先级数据包,紧急指针字段有效。
- ACK 为1表示确认号字段有效。TCP规定出了最初建立连接时的SYN包之外该位必须设置为1
- PSH 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
- RST 为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
- SYN 为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
- FIN 为1表示发送方没有数据要传输了,要求释放连接。
窗口大小(Window Size)
长度16位,表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。
校验和(Checksum)
长度16位,与UDP相似,区别在于无法关闭。TCP在计算校验和的时候使用TCP伪首部(如下图),对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。
紧急指针(Urgent Pointer)
长度16位.只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。
选项(Options)
改字段用于提高TCP的传输性能。因为根据数据偏移(首部长度)进行控制,所以其最大长度为40字节。
0:选项表结束(1字节)
1:无操作(1字节)用于选项字段之间的字边界对齐。
2:MSS选项用于建立连接时决定最大报文长度。
3:窗口扩大,用来改善TCP吞吐量的选项。TCP首部中窗口字符字段只有16位。因此在TCP包往返时间(RTT内),只能发送最大64K字节的数据。如果采用了该选项,窗口的最大值可以扩展到1G。由此在一个RTT较长的网络也可以达到高吞吐。
4:发送端支持并同意使用SACK选项
5:SACK实际工作的选项
8:时间戳字段选项,用于高速通信中对序列号的管理。若果要将几十G的数据高速转发到网络时,32位的序列号可能迅速用完。在传输不稳定的网络环境下,就有在比较晚的时点却收到散步在网络中的一个较早序列号的包。而如果接收端对新老序列号产生了混淆就无法实现可靠传输。为了避免这个问题,就引入了时间戳这个选项,用于区分新老序列