實際上是事務發展的一種抽象,更形象的比喻爲(主要是便於理解啊,網上是有神人的):服務器
三次握手流程網絡
- 客戶端發個請求「開門吶,我要進來」給服務器
- 服務器發個「進來吧,我去給你開門」給客戶端
- 客戶端有很客氣的發個「謝謝,我要進來了」給服務器
四次揮手流程事務
- 客戶端發個「時間不早了,我要走了」給服務器,等服務器起身送他
- 服務器聽到了,發個「我知道了,那我送你出門吧」給客戶端,等客戶端走
- 服務器把門關上後,發個「我關門了」給客戶端,而後等客戶端走(尼瑪~矯情啊)
- 客戶端發個「我知道了,我走了」,以後本身就走了
斷開鏈接服務器端
- 客戶端發送請求斷開的數據包,告訴服務器:「數據傳完了,我要斷開了」。發送一個FIN包,序列號x+2。客戶端轉移到FIN_WAIT_1狀態。
- 服務器端發送應答包,告訴客戶端:「行,我知道了,你斷開吧!」。應答號爲x+3,服務器進入CLOSE_WAIT狀態。客戶端收到應答後,轉移到FIN_WAIT_2狀態。
- 服務器發送一個斷開數據包,告訴客戶端:「既然傳完了,那我這邊的開關也準備關了」。序列號爲y+1,發送完後服務器進入LAST_ACK狀態。
- 客戶端發送一個應答包,告訴服務器:「好的,我知道你要斷開了。」應答號爲y+2。客戶端進入TIME_WAIT狀態。 TIME_WAIT又稱爲2MSL等待狀態,MSL是系統中定義的最大報文生存時間,任何TCP報文在網絡中生存時間超過這個值就必須被丟棄。 等待MSL的緣由是防止最後一個ACK丟失後能夠進行重發,若是ACK丟失後,服務器會重發FIN。