TCP 中没有表示包长度和数据长度的字段,可以通过IP层获得TCP的包长,由TCP的包长可以知道数据的长度
TCP协议头最少20个字节,包括以下的区域:
1、源端口号(Source Port)
表示发送端端口号,字段长16位。源端口和源IP地址的作用是标示报文的返回地址
2、目标端口号(Destination Port)
表示接收端端口号,字段长度16位
3、序列号(Sequence Number)
字段长32位。序列号是指发送数据的位置。每发送一次数据,就累加一次数据字节数的大小。
序列号不会从0或1开始,而是在建立连接时,由初始序列号( initial sequence number ISN)生成器会生成一个32位的 ISN作为初始值,通过SYN包传给接收端主机。
在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加到对应的序列号。
4、确认应答号(Acknowledgement Number)
字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已经收到确认应答号减一为止的数据。发送端收到这个确认应答以后就会认为这个序号之前的数据都已经被正常接收。
5、数据偏移(Data Offset)
该字段表示TCP所传输的数据部分应该从TCP包的哪个位置开始计算,当然也可以把它看做TCP首部的长度。
6、保留(Reserved)
该字段为了以后扩展使用,长度为4位。一般设置为0,即使收到的包在该字段不为0,此包也不会被丢弃
7、控制位(Control Flag)
字段长为8位,每一位从左到右分别为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫做控制位。当他们对应位上的值为1时,具体含义如下:
(1)CWR(Congestion Window Reduced)
CWR标志与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。
(2)ECE(ECE-Echo)
ECE 标志表示 ECE-Echo 。置为1时会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1.
(3)URG(Urgent Flag)
该位为1时,表示包中有需要紧急处理的数据。
(4)ACK(Acknowledgement Flag)
该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1.
(5)PSH(Push Flag)
该位为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。
(6)RST(Reset Flag)
该位为1时,表示TCP连接中出现异常必须强制断开连接。
(7)SYN(Synchronize Flag)
用于建立连接。SYN 为1时,表示希望建立连接,并为序列号设置初始值
(8)FIN(Fin Flag)
该位为1时,表示今后不会再有数据发送,希望断开连接。
当通信结束,希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机向对方的FIN包进行确认应答以后就可以断开连接。
主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,可以等到缓冲区中的所有数据都已成功发送而被自动删除之后再发。
8、窗口大小(Window Size)
该字段长为16位。用于通知从相同TCP首部的确认应答号(ack)所指定位置开始能够接收的数据大小(8位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以获知最新的窗口大小。但这个数据必须是1字节。
9、校验和(Checksum)
源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。
10、紧急指针(Urgent Pointer)
是一个正偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式
11、选项(Options)
最常见的可选字段的最长报文大小MSS(Maximum Segment Size),每个连接方通常都在一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
该选项如果不设置,默认为536(20+20+536=576字节的IP数据报)