TCP的数据被封装在一个IP数据报中:
TCP首部如下图所示:
下面以此讲解这些字段的含义。
16位源端口号、16位目的端口号。用于寻找发送端和接收端应用进程。一个IP地址(IP首部)加一个端口号(TCP首部)称为一个套接字,一对套接字可唯一确定一个TCP连接。
32位序号。用来标识数据字节流中的字节,它的值表示该报文段中第一个数据字节的序号。当建立TCP连接时,发送主机选择一个初始序号ISN作为该字段的基准值,假设该值为x,那么发送SYN标识时的序号字段就为x。当建立连接后,发送数据的第一个字节的序号为x+1。也就是说发送SYN标识消耗了一个序号。
32位确认序号。表示接收端希望下一次接受到的序号。该字段必须在ACK标志为1时(连接建立后,ACK标识总是为1)才有效。
TCP可以表述为一个没有选择确认或否认的滑动窗口协议,什么意思呢,下面逐一解释:
- 没有选择确认:当接收端成功收到序号为1-1024字节的数据后,发送一个确认序号为1025的ACK,期待下一次收到1025开始的数据。但如果下一次实际收到的却是2049-3072,那么接收端不对这个报文段进行确认,而是继续发送确认序号为1025的ACK。也就是说,接收端必须按序确认,无法跳跃式的确认。
- 无法对一个报文段否认:还是上述例子,假设接收端收到了1025-2048字节的报文段,但校验出错,那么接收端只能继续发送确认序号为1025的ACK,而不能告诉发送方其它出错信息。
4位首部长度。表示首部中32bit字的数目,如果首部为20字节(选项字段为空的情况下),该字段的值就为5。看了这么多的协议,可以得出规律:凡是长度可变的数据包中一般都包含长度字段。
6位标志比特:
- URG:紧急指针有效
- ACK:确认序号有效
- PSH:接收方应该尽快将这个报文段交给应用层
- RST:重建连接
- SYN:用来发起一个连接
- FIN:完成发送任务
16位窗口大小。它的值表示用于TCP流量控制的窗口大小。以后会详细说明。
16位检验和。强制性字段。
16位紧急指针。只有URG标志置1时才有效,暂不讨论。
选项字段。最常见的选项字段是最长报文大小MSS,通常在建立连接时的SYN中设置这个选项,指明本端所能接收的最大长度的报文段。
最后的TCP数据部分是可选的。例如,在建立和断开连接的时候双方只传送了TCP首部。
参考:
《TCP/IP详解》 P170-P173.