TCP協議的常見面試題
因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都傳送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。
這主要是為了防止已失效的連線請求報文段突然又傳到了B,因而產生錯誤。
現假定一種異常情況,即A發出的第一個連線請求報文段並沒有丟失,而是在某些網路節點長時間滯留了,以致延誤到連線釋放後的某個時間才到達B。本來這是一個早已失效的報文段。但B受到此失效的連線請求報文段後,就誤以為是A又發出一次新的連線請求,於是就向A發出確認報文段,同意建立連線。假定不採用第三次報文握手,那麼只要B發出確認,新的連線就建立了。
由於現在A並沒有發出建立連線的請求,因此不會理睬B的確認,也不會向B傳送資料,但B卻以為新的運輸連線已經建立了,並一直等待A發來的資料。B的許多資源就這樣白白浪費了。
採用三次握手連線,可以防止上述現象的發生。例如在剛才的異常情況下,A不會向B的確認發出確認,B由於收不到確認,就知道A並沒有要求建立連線,於是B就不會再建立連線。
- 第一,為了保證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,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣就可以使下一個新的連線中不會出現這種舊的連線請求報文段。
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,伺服器就會傳送一個探測報文段,以後每隔75分鐘傳送一次。若一連傳送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連線。
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2655925/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TCP/IP協議常見漏洞型別TCP協議型別
- 淺談TCP、UDP、ICMP三種常見協議TCPUDP協議
- Vue常見的面試題Vue面試題
- 集合常見的面試題面試題
- Java常見的面試題Java面試題
- 常見的JVM 面試題JVM面試題
- 常見 React 面試題React面試題
- mybatis常見面試題MyBatis面試題
- spring常見面試題Spring面試題
- SpringMVC常見面試題SpringMVC面試題
- Docker常見面試題Docker面試題
- vue 常見面試題Vue面試題
- Spring常見面試題!Spring面試題
- Dubbo常見面試題面試題
- 前端常見面試題前端面試題
- ajax常見面試題面試題
- String常見面試題面試題
- Hadoop常見面試題Hadoop面試題
- Golang常見面試題Golang面試題
- Mysql 常見面試題MySql面試題
- Redis 常見面試題Redis面試題
- Redis常見面試題Redis面試題
- 【面試】面試常見問題整理面試
- 【Java面試】JSP常見面試題!JavaJS面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- 前端常見的部分面試題前端面試題
- 常見的Java面試問題Java面試
- 那些常見的面試題整理面試題
- 效能測試常見面試題面試題
- 常見的網路協議協議
- 求職面試常見問題:Python常見面試題全解析附答案求職Python面試題
- 【Java面試】Java常見IO面試題!Java面試題
- 常見面試題 - URL 解析面試題
- Vue常見面試題整理Vue面試題
- mysql面試常見題目MySql面試
- Redis面試常見問題Redis面試
- HashMap常見面試題整理HashMap面試題