tcp的三次握手與四次揮手-------屌絲與女神的戀愛記


  • 前言
    記得以前學習tcp的三次握手跟4次揮手的時候,就一直有疑惑,今天就又看了一遍書上的內容,結果突然一下豁然開朗,陽關明媚,碧海藍天,哈哈。在這里想安利一波,學習計算機網絡必讀經典—-《計算機網絡》–謝希仁編著。目前已經出版到第7版。最好多讀幾遍,絕對獲益匪淺。

  • 申明
    好了,我們進入今天的正題—tcp的三次握手與四次揮手。在這里我先做一下約定:
    我:客戶端
    女神:服務器

    剛開始是我和女神都沒連接,兩端的tcp進程都處於關閉狀態。在這里我主動給女神發消息,約她去看電影。

  • tcp的三次握手建立連接
    這里寫圖片描述
    (第一次握手)我:你好,今天晚上可以一起去看電影嗎,
    (向服務器主動發起連接)

    (第二次握手)女神:嗯,收到了你的消息,在電影院等你,
    (服務器收到了客戶端的連接報文,同意連接,就向客戶端發送確認,告訴客戶端,服務器這邊已經收到了連接請求)

    (第三次握手)我:嗯,沒問題,不見不散。
    (客戶端收到服務器的確認后,向服務器發送確認,告訴服務器,客戶端這邊確實收到了你那邊發來的確認)

好了,到這里,tcp的三次握手已經建立啦,現在我可以和女神正常聊天啦,,,,


  • 問題:為什么我在最后還要發送一次確認呢???

答:為了防止已經失效了的連接請求報文突然又傳送到了服務器端,因而產生錯誤。
那么什么是已經失效的連接請求報文呢,
我們知道,客戶端發出去的連接請求會出現三種情況:
1.正常情況下,數據流暢到達;
2.第一次連接請求報文丟失,未收到確認。於是重傳,收到確認,連接建立;
3.出現一種異常情況,客戶端發出去的連接請求報文沒有丟失,而是在某些網絡節點長時間滯留了,以致延誤到連接釋放以后的某個時間才到達。本來這是一個早已經失效的報文段,,但是服務器此失效的連接請求報文斷后,就誤以為是客戶端又發出一次新的連接請求,於是發出確認,同意連接。這時候女神收到了這條失效的連接請求,於是就在某個地方等我,由於我現在並沒有發出連接請求,就不知道女神在等我,於是女神就等了我好久也沒等到。所以第二天女神就不理我啦,,,,,(哭,,,,,)。
這就是兩次握手的缺點,會造成服務器資源的浪費。

  • tcp的四次揮手釋放連接
    先上一張原理圖
    這里寫圖片描述
    tcp的四次揮手釋放連接其實沒有那么難,這里我用很通俗的語言來說明。
    接下來,就是我與女神的故事第二彈了。這時候,我已經與女神看完電影從電影院出來了,我們相處的很開心,這時候已經不早了,我打算跟女神道別了,於是,
  • (第一次揮手)我:已經不早了,我們回去吧,
    (客戶端向服務器發送連接釋放報文段,並停止再發送數據,主動關閉tcp連接,這是客戶端進入FIN-WAIT1狀態)
  • (第二次揮手)女神:什么,這就要回去了?
    (服務器向客戶端發出確認,告訴客戶端已經收到了連接釋放報文段,這時候服務器進入CLOSED-WAIT狀態)
    這時tcp連接處於半關閉狀態,這是什么意思呢?就是在說,我覺得已經不早了,該回去了,於是詢問女神,結果女神玩的很開心,現在還不想回去。即客戶端沒有數據要發送了,但服務器若發送數據,客戶端仍要接受。也就是說,從服務器到客戶端的連接並沒有關閉,這個狀態可能會持續一段時間。
    我收到了女神的確認,好吧,女神還不想回去呢,沒辦法啊,只能等待女神的下一步指示嘍,,,,,客戶端進入FIN-WAIT2狀態,等待服務器發出的連接釋放報文段。
  • (第三次揮手)女神:好吧,今天先饒過你,明天記得來接我。
    (這時候服務器進程就通知tcp釋放連接,於是發出連接釋放報文段,這時服務器進入LAST-ACK狀態,等待客戶端的確認消息)

  • (第四次揮手)我:嗯,知道了,那我送你回家吧。
    (客戶端收到服務器端的連接釋放報文段之后,必須發出確認,告訴服務器確實收到了你那邊的連接釋放報文,注意:這時候連接還沒有釋放掉,必須經過時間等待計時器(TIME-WAIT timer)設置的時間2MSL后,客戶端才進入CLOSED狀態)
    MSL(maximum Segment Lifetime):最長報文段壽命


問題:為什么客戶端在TIME-WAIT狀態必須等待2MSL的時間呢?
答:原因有兩點:

  1. 為了保證客戶端發出的最后一個ACK報文段能夠到達服務器。這個ACK報文段有可能丟失,因而使處在LAST-ACK狀態的服務器收不到客戶端已經發送的FIN和ACK報文段的確認,連接無法正常關閉。
  2. 為了防止上面提到過的“已失效的連接請求報文段”出現在本鏈接中。客戶端在發送完最后一個ACK報文段后,再經過時間2MSL,就可以使本鏈接次持續的時間內所產生的所有版文段都從網絡中消失。這樣就可以使下一個新的連接中不會出現這種舊的連接請求報文段。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com