一 預備知識-兩將軍問題
? ? 兩將軍問題:紅藍兩軍作戰(zhàn),藍軍戰(zhàn)斗力強大榕堰,紅1軍或紅2軍與其單獨作戰(zhàn)都打不過藍軍竖慧,所以需要紅一軍與紅二軍聯(lián)合對藍軍發(fā)起進攻,紅軍1首先通知紅軍2明早10點發(fā)起總攻逆屡,如圖1-1圾旨,紅軍2接到消息需要回復“好的紅軍1,我已經收到你得消息魏蔗,確認明早10點發(fā)動總攻”砍的。因為消息傳遞路線必須經過藍軍營地,所以雙方傳遞消息的信使很有可能被藍軍俘獲莺治。為了確保消息的可靠性廓鞠,紅1、紅2雙方在發(fā)出一個消息之后都想得到對方的消息回執(zhí)谣旁。但是這會導致消息無線循環(huán)下去床佳,如圖1-2。那么如何解決這個可靠性的問題呢榄审,其實沒有辦法解決砌们,只要保證雙方各自都有一次成功的發(fā)送、回執(zhí)就可以了瘟判。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
二 TCP連接的三次握手
? ? ?兩將軍問題也存在網絡世界里怨绣,客戶端、服務器建立連接不可能無限的確認下去拷获,只要保證客戶端和服務器分別對自己的收篮撑、發(fā)能力做一次確認即可,如下圖匆瓜。 客戶端和服務器分別對自己的收赢笨、發(fā)能力做一次確認至少需要3次握手未蝌。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?3次握手的具體過程、狀態(tài)如下:
(1)首先客戶端和服務器都處于CLOSED狀態(tài)茧妒。
(2)服務器處于LISTEN狀態(tài)萧吠,具體為服務器調用Socket、bind桐筏、listen函數(shù)纸型,進入阻塞狀態(tài)。
(3)客戶端發(fā)送SYN(同步序列編號)梅忌,發(fā)送完畢客戶端進入SYN_SENT狀態(tài)狰腌。
(4)服務端收到SYN,發(fā)送SYN+ASK牧氮,發(fā)送完畢進入SYN_RCVD狀態(tài)琼腔。
(5)客戶端收到服務端發(fā)來的SYN+ASK,發(fā)送服務端等待的ASK踱葛,發(fā)送完畢客戶端進入ESTABLISHED狀態(tài)丹莲,準備數(shù)據(jù)傳輸,到此客戶端已經滿足了對自己收發(fā)能力的一次驗證。
(6)服務端收到客戶端發(fā)來的ASK尸诽,與客戶端一樣甥材,到此服務端也已經滿足了對自己收發(fā)能力的一次驗證,所以也進入ESTABLISHED狀態(tài)性含,準備數(shù)據(jù)傳輸替废。
(7)準備開始傳輸數(shù)據(jù)
三 TCP斷開四次揮手
TCP斷開連接有兩種情況或者說是場景慌申,1 客戶端先斷開連接丢早,當然也可能是服務器先斷開連接皆的,總之是一前一后。 2 雙方同時發(fā)起斷開連接操作究恤。下面分別介紹兩種場景:
? 場景一
(1)客戶端先發(fā)起斷開連接操作俭令,客戶端向服務端發(fā)送FIN,發(fā)送完畢客戶端進入FIN_WAIT_1狀態(tài)部宿。
(2)服務端收到客戶端發(fā)來的FIN抄腔,服務端發(fā)送ACK,發(fā)送完畢進入CLOSED_WAIT狀態(tài)理张。
(3)客戶端收到服務端的ACK回復赫蛇,客戶端進入FIN_WAIT_2狀態(tài),如果后面服務端沒有回應客戶端雾叭,在TCP協(xié)議層面來講悟耘,客戶端將永遠停留在這個狀態(tài)了,不過還好织狐,操作系統(tǒng)著這塊做了處理暂幼,有一個超時時間筏勒。
(4)此時TCP連接進入半關閉狀態(tài),即客戶端主旺嬉,服務端從的這條線路已經關閉管行,不過服務端主,客戶端從的這條線路還處于打開狀態(tài)邪媳。
(5)服務端向客戶端發(fā)送FIN捐顷,發(fā)送完畢,服務端進入LAST_ASK狀態(tài)雨效。
(6)客戶端收到服務端的FIN后回復服務端ACK套菜,回復完畢進入TIME_WAIT狀態(tài),為什么要進入這個狀態(tài)设易?因為第6步是客戶端的最后一條回復,服務端很有可能收不到蛹头,收不到服務端就會重發(fā)顿肺,所以客戶端還要等待一會。
(7)服務端收到客戶端的ACK回復之后渣蜗,不再做響應屠尊,回到初始的CLOSED狀態(tài),在連接池中等待下一次的復用耕拷。
(8)客戶端保持TIME_WAIT狀態(tài)讼昆,超時之后同樣進入CLOSED狀態(tài)。
?場景二
(1)客戶端骚烧、服務器雙方同時發(fā)送FIN浸赫,雙方同時進入FIN_WAIT_1狀態(tài)
(2)雙方都接到了對方的ACK,此時雙方都會進入CLOSING狀態(tài)赃绊。
(3)雙方同時進入TIME_WAIT狀態(tài)既峡,為什么要進入這個狀態(tài)而不是直接進入CLOSED狀態(tài)呢?假設客戶端和服務端本次是第X次建立連接碧查、關閉連接运敢。如果立即關閉,隨后建立第X+1次連接忠售,建立連接成功之后传惠,第X次的丟包的數(shù)據(jù)有可能繞了一大圈又回來了,那就會出現(xiàn)數(shù)據(jù)錯誤稻扬,為了避免這種情況所以要進入TIME_WAIT狀態(tài)卦方,以保證舊連接的數(shù)據(jù)不會再回來。
(4)TIME_WAIT超時之后泰佳,雙雙進入CLOSED狀態(tài)愿汰。
四 TCP狀態(tài)圖
有了上面對TCP連接3次握手4次揮手的介紹困后,再來理解TCP的狀態(tài)圖就不困難了,無非就是對TCP連接3次握手4次揮手過程的打包概述而已衬廷。