TCP报文是TCP层传输的数据单元,也称为报文段(segment)。报文的结构如下图所示:
报文结构说明如下:
1、源端口和目的端口:分别表示发送方和接收方的TCP端口号。
2、序号:表示该报文数据在发送方的数据流中的位置。初始序号不是从1开始,而是根据本机的当前时间值计算出一个数值作为起始序号。这样做的目的是避免出现重复的序号。
3、首部长度:表示TCP报文首部信息的长度。由于首部可能含有选项内容,因此TCP首部的长度是不确定的。首部长度的单位是32比特或4个八位组。首部长度实际上也指示了数据区在报文段中的起始偏移值。
4、码元比特:共6比特,从左至右分别是URG、ACK、PSH、RST、SYN、FIN。其中URG置位表示紧急指针字段有效;ACK置位表示确认号字段有效;PSH表示当前报文需要请求推(push)操作;RST置位表示复位TCP连接;SYN用于建立TCP连接时同步序号;FIN用于释放TCP连接时标识发送方比特流结束。
5、窗口:窗口通告值。发送方根据接收的窗口通告值调整窗口大小。
6、紧急指针:如果TCP通信中,一方有紧急的数据(例如中断或退出命令)需要尽快发送给接收方,并且让接收方的TCP协议尽快通知相应的应用程序,可以将URG置位,并通过紧急指针指示紧急数据在报文段中的结束位置。
7、校验和:与UDP校验和计算方法相同,同样需要包含伪首部。伪首部中的协议类型值为6。
8、选项:用于TCP连接双方在建立连接时协商最大的报文段长度MSS(Maximum Segment Size)。
9、填充:为了使选项字段对齐32比特,可能采用若干位0作为填充数据。
10、确认号:占4个字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。也就是期望收到的下一个报文段首部的序号字段的值。由于序号字段有32bit长,可对4GB的数据进行编码。这样就可以保证当序号重复使用时,旧版本的数据早已在网络中消失了。
11、确认比特ACK:只有当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。