建立與釋放TCP連線的過程
首先給出標準的書上的概念,摘自 謝希仁著《計算機網路第6版》:
三次握手的全過程:
四次揮手的全過程:
以下是經過總結、提取後在筆試題和麵試題的回答:
三次握手:
1.客戶端傳送SYN請求,進入SYN-SEND(同步傳送狀態)
2.服務端收到請求,回覆ACK報文併發送SYN請求,進入SYN-RECV(同步接收狀態)
--為什麼說建立連線至少三次握手,是因為這裡傳送ACK報文和SYN請求可以分開兩次傳送,只是我們一般簡化為一步完成--
3.客戶端收到回覆和SYN請求,然後向服務端傳送ACK報文,接著進入ESTABLISH(連線建立狀態),服務端收到客戶端的ACK後也進入了ESTABLISH(連線建立狀態)
至此,兩端的通訊連線建立完畢。
四次揮手:
1.客戶端向服務端傳送FIN請求,然後進入FIN-WAIT1(終止等待1狀態)
2.服務端收到FIN請求後,回覆ACK報文並通知高層應用程序,然後進入CLOSE-WAIT(關閉等待狀態);客戶端收到應答後隨即進入FIN-WAIT2(終止等待2狀態)
至此,從客戶端到服務端單方向的連線已釋放,但服務端仍然可以向客戶端傳送資料。此時的TCP連線處於半關閉狀態,並且這種狀態可能會保持一段時間。
3.服務端在傳送完最後一部分資料後,向客戶端傳送FIN請求,然後進入LAST-ACK(最後確認狀態)
4.客戶端收到FIN請求後,向服務端回覆ACK報文,然後進入TIME-WAIT(時間等待狀態);服務端正常接收到客戶端的應答後,進入CLOSED(關閉狀態);當過了2倍的最長報文壽命後,若沒有出現異常(即服務端已接收到ACK應答),則客戶端也進入CLOSED(關閉狀態)
至此,兩端的通訊連線釋放完畢。
補充:
ps1:不管是建立連線還是釋放連線的過程,都是C-S模式,並且都是由客戶端主動發起請求。
ps2:如果沒有收到應答,資料包都會根據TCP的重傳機制進行重傳。
ps3:釋放連線時,客戶端需等待2MSL才進入關閉狀態,這樣做除了能夠防止服務端收不到最後一次ACK的應答,還有一個原因:“已失效的連線請求報文段”——A在傳送完最後一個ACK報文段後,再經過2MSL時間,就可以使本連線持續的時間內所產生的所有報文段都從網路消失。這樣就可以使下一次新的連線不會出現這種舊的連線請求報文段。