互聯網中一個基礎的面試問題

在學網絡的這篇區域,面試中TCP/IP 基本都是必問一個環節,最長見的當屬三次握手四次揮手了,絕大多數學習網絡的同學可能早已熟記於心了,尤其是學習過CCNA、CCNP的同學,理解更甚,但是有沒有逆向的想過,爲什麼要三次握手,又爲什麼要四次揮手呢?我猜可能還是有相當一部分同學看到這個問題有點愣住了,因爲從來沒想過。我就來說一下哈。

TCP爲什麼需要3次握手,4次斷開?

“三次握手”的目的是“爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤”。 client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以後的某個時間纔到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認爲是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用“三次握手”,那麼只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以爲新的運輸連接已經建立,並一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛纔那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。”。主要目的防止server端一直等待,浪費資源。

1 TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送

(2) 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。

(3) 服務器關閉客戶端的連接,發送一個FIN給客戶端。

4 客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1

最後一次的握手,客戶端會向服務器回發最後的ACK,但是客戶端無法知道這個ACK有沒有到達服務器,所以會等待2MSL=2 * 255s。如果這個ACK沒有到達服務端,服務端會發現並且會爲FIN這個消息超時重傳,客戶端就會再次發一個ACK,直到服務端真正收到。如果客戶端沒有收到服務端的FIN,說明服務端已經收到了最後的ACK,正常的關閉連接。

爲什麼4次斷開?

因爲TCP有個半關閉狀態,假設A.B要釋放連接,那麼A發送一個釋放連接報文給B,B收到後發送確認,這個時候A不發數據,但是B如果發數據A還是要接受,這叫半關閉。然後B還要發給A連接釋放報文,然後A發確認,所以是4次。

在tcp連接握手時爲何ACK是和SYN一起發送,這裏ACK卻沒有和FIN一起發送呢。原因是因爲tcp是全雙工模式接收到FIN時意味將沒有數據再發來,但是還是可以繼續發送數據。

其實道理也很簡單,仔細的想想,確實是那麼回事,也就那樣吧,謎團解開後是不是覺得也沒啥,第一次看的就當學習,第二次+看的同學就當複習了吧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章