TCP的数据被封装在一个IP数据报中:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="font-family:新宋体; font-size:14px; orphans:2; widows:2">
TCP首部例如以下图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
以下以此解说这些字段的含义。
16位源port号、16位目的port号。用于寻找发送端和接收端应用进程。一个IP地址(IP首部)加一个port号(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.