分手比確定戀愛關係更麻煩?計算機之間也這樣!

 

                                                                             

 

很久很久以前,還沒有互聯網,大家通信主要靠寫信。小扎和小美是高中同學,互相有好感,大學兩個人去了不同的城市上學。小紮在大學感到了空虛寂寞冷,鼓起勇氣寫信向小美表白。

 

小扎寄出去信後,心裏一直很緊張,又怕萬一地址不對,信寄不到怎麼辦呢?

 

小美收到小扎的信後,按耐不住心中的驚喜,這個小扎終於開竅了啊。於是馬上回了一封信,小美也擔心小扎收不到信,提醒小扎收到信後馬上回信。

 

小扎收到小美的信後,知道自己給小美的地址是對的,小美的地址也是對的,雙方的信都能收到。小美一定擔心她的信我沒收到吧?

 

於是小扎又馬上給小美回了一封信。

 

小美收到信後,知道雙方的地址沒有錯,雙方的信都能收到,就放心了。他們兩個人就不停的來來回回寄了很多很多信,熱戀中的情侶最費紙了。。。

 

 

很多年以後計算機出現了,有一種叫做TCP的協議負責計算機之間的網絡連接,客戶端和服務器就想當年的小扎和小美一樣開始通信了。

 

1.客戶端發送 SYN數據包,並設置seq序列號爲j,客戶端進入 SYNC_SENT 狀態

(小扎給小美寫信表白)

 

2.服務器端收到數據包後,返回一個SYN包設置seq=k,同時返回一個ACK的包設置seq=j+1,進入SYN_RCVD狀態。

(小美給小扎回信同意建立戀愛關係,小扎收到信後,確認他們之間的通信沒有問題)

 

3.客戶端收到ACK包後,表示客戶端到服務器端的單向連接成功,客戶端的狀態變成ESTABLISED,同時客戶端會對服務器端的SYN包進行應答,返回一個ACK包,seq爲k+1。

 

服務器端收到客戶端的ACK包後,進入ESTABLISED狀態,表示服務端到客戶端的連接成功。

(小扎給小美回信表示收到小美的信了,小美收到信後,確認他們之間的通信沒有問題)

 

自此,它們就連接上了,可以放心的互相發送數據了。

 

下面來一張正經點的圖:

 

也許你會有疑問,爲什麼一定要三次握手?兩次行不行?

 

答案是不行。

 

按上面的故事舉例,第一次握手:小扎寫信向小美表白;第二次握手:小美向小扎回信;注意,這時候小扎(客戶端)的連接建立成功了,因爲小扎(客戶端)已經可以確定自己的發送和接收都沒有問題。

 

但是小美(服務器)只是收到了小扎(客戶端)的來信,確定了自己接收數據沒問題,但是自己寄出去的信小扎(客戶端)能不能收到還不確定。

 

於是有了第三次握手:小扎向小美寄出了確認回信。小美(服務器)收到信後,就是知道自己發送數據的功能沒問題,小扎確實收到信了,確認連接建立成功了。

 

 

 

小扎和小美熱戀了幾年後,他們之間的感覺越來越微妙,慢慢的小美髮現小扎對自己的關心越來越少了。終於小扎抵不住異地戀的痛苦,移情別戀了,看上了新來的學妹,小扎決定分手了,給小美寄了封分手信。

 

分手就算了,居然還有臉要回送我的東西!渣男!小美,收到信後,氣得跳腳,立馬回了封信,讓他滾蛋。

 

第二天,小美就去郵局,把渣男送給她的東西都打包寄還了給他。小美還不忘在信中提醒,收到東西之後給我回封信,不要到時候耍賴說沒收到,我再也不想看見你了!渣男!

 

小扎收到小美寄的包裹之後,立馬回了封信,說東西收到了,我們以後也別聯繫了。

 

一段戀情就這麼結束了。。。

 

 

情侶之間分分合合,當然計算機之間的連接也經常需要斷開連接,斷開的方式竟然和情侶之間很相似。

 

1.客戶端發送一個FIN包,表示要斷開連接,並設置seq序列號爲m到服務器端,客戶端進入FIN_WAIT_1狀態。

(小扎寫分手信給小美,進入等待回信的狀態)

 

2.服務器端收到客戶端的FIN包後,就知道客戶端想要斷開連接了,於是返回一個ACK包,設置seq爲m+1,服務器端進入CLOSE_WAIT狀態。服務器端對客戶端說,我知道你想要斷開連接了,不過先等等,我這還有些數據沒發完,你等我發完再關閉。

 

客戶端收到服務器端的確認後,進入FIN_WAIT_2狀態,客戶端現在只接收服務器端的數據,不再發送數據。

(小美回信給小扎,同意分手,但是東西要整理下再寄給小扎,小扎進入等待包裹狀態)

 

3.服務器端發送完所有數據之後,發送一個FIN報文,設置seq序列號爲n,進入LAST_ACK狀態,表示我的數據都已經發送完了,你可以斷開連接了。

(小美給小扎寄回包裹,表示我們已經兩清了,你收到之後給我回個信,就可以滾蛋了)

 

4.客戶端收到服務器端的FIN包後,返回一個ACK包,設置seq序列號爲n+1,客戶端就進入了TIME-WAIT(時間等待)狀態。服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態,關閉的連接。

(小扎回信給小美說,你的包裹我收到了,我們以後不用再聯繫了)

 

6.注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間後,才進入CLOSED狀態。

(小扎。。。編不下去了。。。)

 

自此,客戶端和服務器端就斷開了連接。

 

下面來一張正經點的圖:

 

爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

 

講道理,四個報文都發送完畢,我們應該可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的。如果客戶端發送出最後的ACK回覆,服務器沒有收到,服務器將不斷重複發送FIN報文。所以客戶端不能立即關閉,它必須確認服務器端接收到了該ACK。

 

客戶端會在發送出ACK之後進入到TIME_WAIT狀態,同時設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼客戶端會重發ACK並再次等待2MSL。

 

所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。如果直到2MSL,客戶端都沒有再次收到FIN,那麼客戶端推斷ACK已經被成功接收,則結束TCP連接。

 

 

TCP斷開連接爲什麼比建立連接多一個步驟呢?其實很簡單,因爲談戀愛的時候還沒有共同財產,但是分手的時候還需要分東西呀!

 

 

 

 

 

 

發佈了14 篇原創文章 · 獲贊 170 · 訪問量 8334
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章