TCP協議的常見面試題

1. 爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?服務器

由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。網絡

2. 爲何不能用兩次握手進行鏈接?

這主要是爲了防止已失效的鏈接請求報文段忽然又傳到了B,於是產生錯誤。資源

現假定一種異常狀況,即A發出的第一個鏈接請求報文段並無丟失,而是在某些網絡節點長時間滯留了,以至延誤到鏈接釋放後的某個時間纔到達B。原本這是一個早已失效的報文段。但B受到此失效的鏈接請求報文段後,就誤覺得是A又發出一次新的鏈接請求,因而就向A發出確認報文段,贊成創建鏈接。假定不採用第三次報文握手,那麼只要B發出確認,新的鏈接就創建了。同步

因爲如今A並無發出創建鏈接的請求,所以不會理睬B的確認,也不會向B發送數據,但B卻覺得新的運輸鏈接已經創建了,並一直等待A發來的數據。B的許多資源就這樣白白浪費了。請求

採用三次握手鍊接,能夠防止上述現象的發生。例如在剛纔的異常狀況下,A不會向B的確認發出確認,B因爲收不到確認,就知道A並無要求創建鏈接,因而B就不會再創建鏈接。im

3. 爲何TIME_WAIT狀態須要通過2MSL才能返回到CLOSE狀態?
  • 第一,爲了保證A發送的最後一個ACK報文段可以到達B。假設網絡是不可靠的,有能夠最後一個ACK丟失。因此TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最後的ACK回覆,但該ACK可能丟失。Server若是沒有收到ACK,將不斷重複發送FIN片斷。因此Client不能當即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK以後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。若是在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片斷在網絡中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。若是直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被Server成功接收,則結束TCP鏈接。
  • 第二,防止「已失效的鏈接請求報文段」出如今本鏈接中。A在發送完最後一個ACK報文段後,再通過時間2MSL,就可使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。這樣就可使下一個新的鏈接中不會出現這種舊的鏈接請求報文段。
4. 若是已經創建了鏈接,可是客戶端忽然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,客戶端若是出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會從新復位這個計時器,時間一般是設置爲2小時,若兩小時尚未收到客戶端的任何數據,服務器就會發送一個探測報文段,之後每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉鏈接。數據

相關文章
相關標籤/搜索