TCP用于端到端的通信(一对一),无法用于通信的广播和多播(一对多)。
T C P通过下列方式来提供可靠性:
•应用数据被分割成 T C P认为最适合发送的数据块。这和 U D P完全不同,应用程序产生的数据报长度将保持不变。由 T C P传递给I P的信息单位称为报文段或段(s e g m e n t)
•当T C P发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能
及时(在定时器超时之前)收到一个确认,将重发这个报文段。(超时重传机制)
•当T C P收到发自 T C P连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
• T C P将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,T C P将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
•既然T C P报文段作为 I P数据报来传输,而 I P数据报的到达可能会失序,因此 T C P报文段的到达也可能会失序。如果必要, T C P将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。(失序重组是通过不断回复未收到数据的ACK来实现的)
•既然I P数据报会发生重复, T C P的接收端必须丢弃重复的数据。
• T C P还能提供流量控制。
TCP头部固定长度20字节,有可选项,最大长度60字节(同IP头一样)。
注意:IP头中包含 IP头长度 和 IP数据报部总长度字段。TCP头部中,仅含有TCP头部长度字段。UDP头部中包含有UDP头部和UDP数据包总长度字段。
各16位的源目端口号,用于标志发送端和接收端的应用程序。用于唯一确定一个连接的是五元组(源IP、源端口、目的IP、目的端口、协议)。
32位序号(SEQ)用来标识从T C P发端向T C P收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 T C P用序号对每个字节进行计数。序号是32 bit的无符号数,序号到达 2^32-1后又从0开始。
新建连接(SYN)时需要消耗一个SEQ号,且仅消耗一个。通常说的三次握手中的最后一次握手不消耗SEQ号,接下来发送数据的SEQ号将和第三次握手的SEQ号相同。
32位的确认号(ACK)表示期望接收到对方下一报文段中数据的起始字节,只有当标志字段ACK为1时,该确认号才有效。连接一旦建立,ACK标志即为1。这是因为,发送A C K无需任何代价,因为 32 bit的确认序号字段和 A C K标志一样,总是T C P首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置, A C K标志也总是被设置为1。
4位首部长度,以4字节为单位,因此最大值为60字节。
6个标志:
U R G 紧急指针( u rgent pointer)有效(见2 0 . 8节)。
A C K 确认序号有效。
P S H 接收方应该尽快将这个报文段交给应用层。
R S T 重建连接。
S Y N 同步序号用来发起一个连接。这个标志和下一个标志将在第1 8章介绍。
F I N 发端完成发送任务。
16位窗口大小(通告窗口)为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16 bit字段,因而窗口大小最大为 6 5 5 3 5字节。指从确认号所指的字节开始,还可接收多少字节。
16位检验和覆盖了整个的 T C P报文段: T C P首部和T C P数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。 T C P检验和的计算和 U D P检验和的计算相似,使用如11 . 3节所述的一个伪首部。
TCP头部中的校验和,由发送端TCP协议填入,接收端TCP协议验证其的正确性。注意:当数据包通过PAT、NAT设备时,TCP头部的校验和将被改变,这是因为通过这些设备时,数据包中的IP和端口号将发生变化(进行了映射),因此需要重新计算。
只有当U R G标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。
紧急指针字段,只有当URG标志为1的时候才有效。URG和紧急指针用于发送端和接收端传送紧急数据。紧急数据的边界是:该报文段的开始(即SEQ指示的位置),到SEQ+紧急指针值所指的位置。其中,序号SEQ+紧急指针值表示紧急数据的最后一个字节。
可选字段。最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 S Y N标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
发起连接的图示(第一次握手)。
发起端发送SYN报文段。这里使用了3个可选项,最大报文段,扩展窗口,以及本机支持SACK。其中,新建连接时,前两次握手只起协商作用,因此,这里是说以后要使用扩展窗口的放大因子,但该SYN包并不使用扩展窗口放大因子。从第三次握手开始,就会使用扩展窗口。
接收端对连接请求的应答(第二次握手)。
第三次握手
通常情况下,TCP建立连接时,使用可选字段进行协商,因此建立连接时前两次握手,通常TCP头部的长度会大于20字节。待连接建立完成后,正常通信过程中,TCP就不再使用可选字段了,而只是使用建立连接过程中的协商结果,因此,正常通信过程中,TCP头部的长度仍为20字节。