思维导图:
5.9 TCP的运输连接管理
TCP (Transmission Control Protocol) 是一个面向连接的协议。运输连接的管理保证了连接的可靠性,它包括三个主要阶段:
- 连接建立
- 数据传送
- 连接释放
每个阶段都有其特定的任务和管理要求,以确保数据能够可靠、高效地传输。
5.9.1 TCP的连接建立
连接建立过程被称为“三报文握手”(Three-way Handshake),它包括以下步骤:
- 第一步: 客户端发送一个SYN包(SYN=1, seq=x)到服务器,并进入SYN-SENT状态。
- 第二步: 服务器响应客户端的SYN包,发送一个SYN-ACK包(SYN=1, ACK=1, seq=y, ack=x+1),服务器进入SYN-RCVD状态。
- 第三步: 客户端接收到SYN-ACK包后,发送一个ACK包(ACK=1, seq=x+1, ack=y+1)到服务器。此时,客户端进入ESTABLISHED状态。
关键点:
- SYN标志:用于建立连接,且SYN包不能携带数据,但要消耗一个序列号。
- ACK标志:用于确认接收,ACK包可以携带数据,如果不携带数据则不消耗序列号。
为何需要三报文握手?
三报文握手防止已失效的连接请求报文段导致的资源浪费。如果客户端发出的旧的连接请求在网络中延迟,并在连接释放后到达服务器,服务器可能会错误地响应并等待客户端发送数据,导致资源的不必要占用。
注意事项:
- TCP状态:了解每个状态(如LISTEN, SYN-SENT, SYN-RCVD, ESTABLISHED)的含义和功能。
- TCB(传输控制块):TCP使用TCB来存储每个连接的重要信息,比如序列号、指针等。
我的理解:
类比:预约制服务
假想你想去一个非常受欢迎的餐厅用餐,但这家餐厅要求客人先预约才能入座。
-
连接建立 - 预约餐位
- SYN: 就像是你打电话给餐厅说,“我想预约一个餐位。”
- SYN-ACK: 餐厅回应说,“好的,我有空位,预约成功了,请确认。”
- ACK: 你回复说,“确认,我会按时到的。”
-
数据传送 - 享受服务
- 你按照预约的时间到达餐厅,坐下后开始点菜,享受服务。
-
连接释放 - 用餐结束,离开餐厅
- 吃完饭后,你通知服务员可以清理餐桌,然后离开。
三报文握手的深入理解
-
为什么需要“预约确认”(三报文握手)?
- 如果没有一个良好的预约确认过程,可能会有人占用了餐厅的空位而不真正到来,类似于网络中一个失效的连接请求可能会导致服务器无谓地等待。
-
预防错误“预约”
- 在预约制度中,如果有一个旧的预约因为某些原因延迟了,而你已经不再需要这个预约了,餐厅如果没有确认就直接为你保留餐位,那么就会造成资源浪费。同样地,三报文握手可以防止服务器因为一个延误的连接请求而错误地保持连接状态。
通过这个类比,我们可以更容易地理解TCP运输连接管理中的三报文握手:客户端(你)请求建立连接(预约),服务器(餐厅)响应请求并要求确认,客户端发送最终确认,这样两边都清楚地知道连接(预约)是有效的,可以开始数据传输(用餐)了。
5.9.2 TCP的连接释放
连接释放概述
TCP的连接释放涉及到复杂的状态转换。当数据传输完成,任一方都可以初始化连接释放。
连接释放过程
-
初始状态:
- A和B双方均处于
ESTABLISHED
状态。
- A和B双方均处于
-
A发起连接释放:
- A发送
FIN
报文段(FIN=1
, 序号seq=u
),主动关闭连接并进入FIN-WAIT-1
状态,等待B的确认。 - TCP规定,即便
FIN
报文段不含数据,也会消耗一个序号。
- A发送
-
B确认收到:
- B收到后,回复确认报文(
ACK=1
, 确认号ack=u+1
),自身序号为v
,进入CLOSE-WAIT
状态。 - B通知应用程序,这时A到B方向的连接被释放,进入半关闭状态,但B到A的连接仍然开放。
- B收到后,回复确认报文(
-
A等待B的释放信号:
- A收到确认后,进入
FIN-WAIT-2
状态,等待B的连接释放报文段。
- A收到确认后,进入
-
B完成数据传输并发起释放:
- B应用进程完成传输,发起连接释放报文(
FIN=1
,ACK=1
, 序号w
, 确认号ack=u+1
),进入LAST-ACK
状态。
- B应用进程完成传输,发起连接释放报文(
-
A确认B的释放并进入时间等待:
- A收到B的
FIN
报文段后,回复确认(ACK=1
, 确认号ack=w+1
),进入TIME-WAIT
状态,等待2MSL
后转入CLOSED
状态。
- A收到B的
时间等待(TIME-WAIT)
-
目的:
- 确保A发送的最后一个ACK能够到达B,防止B无法正常进入
CLOSED
状态。 - 防止“已失效的连接请求报文段”影响新连接。
- 确保A发送的最后一个ACK能够到达B,防止B无法正常进入
-
时间:A在
TIME-WAIT
状态必须等待2MSL
(Maximum Segment Lifetime),以确保网络中所有报文段消失。
连接释放结果
- A的结束:
- A必须等待
2MSL
时间后,才能从TIME-WAIT
进入CLOSED
状态,然后撤销TCB,结束连接。
- A必须等待
- B的结束:
- B在收到A的确认后即进入
CLOSED
状态,先于A结束连接。
- B在收到A的确认后即进入
特殊机制:保活计时器(Keepalive Timer)
- 目的:在客户端故障时允许服务器关闭连接。
- 机制:
- 服务器每收到一次客户端数据,重置保活计时器(通常2小时)。
- 超时未收到数据,则发送探测报文。
- 经过一系列探测后(如10次/75秒一次),无响应则认为客户端故障,关闭连接。
我的理解:
-
连接释放的意义:TCP是一种可靠的、面向连接的协议,每个TCP连接在数据传输结束后必须经过一个正式的释放过程。这不仅确保了双方都清楚地知道数据传输已结束,还可以正确地回收资源,并使得双方能够平滑地开始新的连接。
-
半关闭状态:TCP允许一个方向的数据流被关闭,而另一个方向继续传输数据。当一方完成它的数据发送任务后,它会发送一个带
FIN
标志的报文段,表明它已经没有数据发送,但它仍可以接收来自对方的数据。 -
四次挥手:整个释放过程需要四个步骤,被称为“四次挥手”。这包括:(1)A发送
FIN
给B;(2)B确认A的FIN
;(3)B发送FIN
给A;(4)A确认B的FIN
。这个过程比建立连接的“三次握手”多一步,因为通信的双方都需要单独结束它们发送数据的能力。 -
状态变迁:
FIN-WAIT-1
和FIN-WAIT-2
:发起关闭连接的一方(A)会经过这两个状态。在FIN-WAIT-1
状态中,A等待B的确认。在收到确认后,A进入FIN-WAIT-2
状态,等待B的FIN
报文。CLOSE-WAIT
:接收到FIN
的一方(B)会进入此状态,表示它已经知道对方想关闭连接,但可能还有数据要发送。LAST-ACK
:当B完成数据发送并准备好关闭连接时,它会发送FIN
并进入此状态,等待A的最后确认。TIME-WAIT
:A在发送最后的确认后,进入此状态。这个状态的持续时间是2MSL
,确保足够的时间让最后一个确认报文到达对方,以及网络中可能存在的重复报文段消失。CLOSED
:最终,双方都会达到CLOSED
状态,此时TCP连接正式结束。
-
时间等待(
TIME-WAIT
):这个状态的存在有两个主要原因:- 确保对方收到最后的ACK报文,如果B未收到,则会重新发送
FIN
,而A必须能够响应这个重传。 - 防止之前连接的报文段影响新的连接。网络中的旧报文段会因为超过生存时间
MSL
而消失,从而不会干扰新的连接。
- 确保对方收到最后的ACK报文,如果B未收到,则会重新发送
-
计时器:
2MSL
计时器:在TIME-WAIT
状态中使用,以确保旧连接的报文段都从网络中消失。- 保活计时器:用于检测对方是否已崩溃或不可达,如果一定时间(如2小时)内没有收到对方的任何数据,会开始发送探测报文。
更加形象的理解:
可以将TCP连接的释放过程比喻成两个老朋友(A和B)的告别方式,它既有礼貌也要确保彼此都清楚告别的意图和时刻。
想象一下,A和B在一家咖啡馆(网络)中度过了愉快的下午时光,现在他们需要告别了。
-
开始告别(FIN-WAIT-1):
- A决定要离开了(发送FIN),他告诉B:“我得走了,今天很高兴。”这就像是他站起身来,穿上外套的动作(A发送带有FIN标志的报文段)。
- A此时还不能马上离开,因为他需要等待B的回应,确认B也知道他要走了。这就好比A站在门口等待B的回答。
-
B的确认(CLOSE-WAIT):
- B回答:“好的,我知道了,你先走吧。”(B发送ACK响应A的FIN)B现在也准备告别,但他可能还想在咖啡馆多待一会儿,也许他还有点咖啡没喝完。
-
A确认收到(FIN-WAIT-2):
- A听到B的回答后,知道B得到了自己想离开的信息,于是A就在门口稍作等待(FIN-WAIT-2),以防B有什么最后的话要说。
-
B准备离开(LAST-ACK):
- 过了一会儿,B也喝完了他的咖啡,决定是时候离开了。他向A挥手道别(B发送带有FIN标志的报文段)。
-
最终告别(TIME-WAIT 和 CLOSED):
- A收到B的挥手(ACK B的FIN),回应说:“再见,确保安全回家。”(A发送最后一个ACK),然后A留在门口站了一会儿(TIME-WAIT),以确保B看到了他的回应。
- 这个等待就像是A确保B没有忘记任何东西,如果B再次挥手(重传的FIN),A仍然在门口,能够再次回应。
- 经过足够的时间(2MSL),A信心满满地认为B已经安全地开始他的归途,于是转身离开,结束了这次会面(CLOSED)。
-
保活计时器(Keepalive Timer):
- 如果在离开咖啡馆后,A很长时间没有听到B的消息,他可能会担心B是否安全。所以,他偶尔会发一个消息问候B,确认B是否安全到家。这就像是TCP的保活计时器功能,确保另一方没有出现问题。
这个过程中,A和 B 之间的告别是有顺序、有礼貌,并且确认彼此都明白对方的意图。这样,他们就可以确保在下次想见面时,没有遗留的问题或误解。同样,TCP连接的释放过程确保数据传输的完整性和连接资源的正确回收。
标题:5.9.3 TCP的有限状态机
**目标:**理解TCP连接的各个状态以及它们之间的转换关系。
**核心概念:**TCP的有限状态机展示了一个TCP连接从建立到断开的整个生命周期内可能处于的各种状态,以及状态间的转换条件。
笔记:
-
状态机结构:
- 状态(方框):每个方框代表TCP连接可能的一个状态。
- 变迁(箭头):箭头显示了从一个状态到另一个状态的转换。
- 变迁条件/动作(箭头旁边的文字):变迁发生的原因或结果。
-
状态机箭头:
- 粗实线箭头:客户端进程的正常状态变迁。
- 粗虚线箭头:服务器端进程的正常状态变迁。
- 细线箭头:异常状态变迁。
-
主要状态和转换:
- CLOSED:无活动连接。
- LISTEN:等待连接请求。
- SYN-SENT:已发送同步请求。
- SYN-RCVD:收到同步请求,等待确认。
- ESTABLISHED:连接建立,数据传输状态。
- FIN-WAIT-1/2:主动关闭连接的阶段。
- CLOSE-WAIT:收到关闭请求,准备关闭连接。
- CLOSING:同时关闭。
- LAST-ACK:等待所有挂起的确认。
- TIME-WAIT:等待足够时间以确保对方收到最终的ACK。
-
特殊变迁案例:
- 被动打开(Listen -> SYN-RCVD):当服务器准备接受连接时的状态变迁。
- 主动打开(CLOSED -> SYN-SENT):当客户端开始建立连接的状态变迁。
- 同时打开/关闭:当两端几乎同时请求打开或关闭连接。
-
配对图示分析:
- 图5-28、5-29和5-30的比较:这些图表展示了客户端和服务器端的状态变迁路径,可以帮助理解实际的TCP连接建立和终止过程。
-
异常情况:
- 收到RST:连接重置。
- 超时:重试或关闭连接。
**小贴士:**记住状态之间的转换往往是由于网络中的事件(例如接收到特定类型的TCP段)或者是由于应用程序的行为(比如调用connect()或close()函数)。
重点题目:
- 习题5-40:分析特定情况下的状态变迁,如从LISTEN到SYN-SENT和从SYN-SENT到SYN-RCVD的过程。
**结论:**掌握TCP的有限状态机对于理解和调试网络程序是至关重要的。
总结:
5.9 TCP的运输连接管理的重点:
-
TCP三次握手(Three-way Handshake):
- 用于建立一个TCP连接,包括SYN(同步序号),SYN+ACK(同步确认应答),ACK(确认应答)的交换。
- 确保双方都有发送和接收数据的初始序列号。
-
连接状态(Connection States):
- 理解TCP状态机中的各个状态,如LISTEN, SYN-SENT, SYN-RCVD, ESTABLISHED, FIN-WAIT-1, CLOSE-WAIT等。
-
TCP四次挥手(Four-way Handshake):
- 用于连接的终止,了解FIN(结束连接请求)和ACK(确认应答)的交换过程。
-
TCP状态转换:
- 明白各种触发事件导致的状态转换,如客户端和服务端的正常和异常流程。
-
序列号和确认应答(Sequence and Acknowledgement Numbers):
- 理解这些数字如何用于保持数据传输的可靠性和顺序性。
难点:
-
状态机的理解:
- TCP状态机包含多个状态和过渡,对于初学者来说理解它们之间的关系可能比较复杂。
-
异常情况处理:
- 理解在数据传输过程中,如何处理超时、重传、紊乱等异常情况。
-
状态机中的同步:
- 理解在同步过程中的各种复杂场景,如同时打开、同时关闭。
易错点:
-
混淆状态转换:
- 由于状态多而复杂,很容易混淆在什么情况下会从一个状态转移到另一个状态。
-
误解三次握手和四次挥手:
- 容易将三次握手中的步骤混淆,或者忘记四次挥手中的某一步。
-
不正确处理TIME-WAIT状态:
- TIME-WAIT状态的作用和持续时间(2MSL)经常被误解,导致不正确的实现。
-
忽视异常和边界条件:
- 在编程时,可能忽视网络延迟、重传以及异常断开等边界条件的处理。
总结建议:
- 多画图示来辅助理解各种状态和状态转换。
- 制作状态转换表格,列出触发事件和期望的行为。
- 经常复习三次握手和四次挥手的步骤,确保理解其背后的原理。
- 在实验或模拟环境中观察TCP连接的建立和终止过程,以加深理解。