一.三次握手
流程
- client發送syn
- server發送syn,ack
- client發送ack
問題
- 爲什麼需要三次握手,兩次不行嗎?
需要三次握手的目的是爲了減少服務端資源浪費,開啓無用的連接,假設只有1,2兩步,則會出現如下問題
- 如果2丟失,那麼server會建立無用的連接,其實client根本沒有收到ack
- 由於網絡原因,client發送的syn,server沒有收到,client以爲超時了,會重新連接,過了一會後,之前發送的syn又被server收到了,server會建立無用的連接
總之,如果是兩次握手,會出現server認爲已經建立連接了,但是client卻不知道,也不會使用;如果是三次,則上面的問題都不會出現
二.四次揮手
流程
- client發送fin
- server發送ack
- server發送fin,ack
- client發送ack
問題
1. 爲什麼握手是三次,揮手是四次?
握手的第二次,發生了syn和ack,二揮手的第二次只發送了ack,爲什麼?連接建立建立時,server不需要做什麼準備,可以直接返回syn和ack,而釋放連接時,server收到fin後,有可能還有數據要處理,所以先發送ack,等處理完數據了,再發送fin,ack
2. 爲什麼客戶端在TIME-WAIT階段要等2MSL?
爲的是確認服務器端是否收到客戶端發出的ACK確認報文;
當客戶端發出最後的ACK確認報文時,並不能確定服務器端能夠收到該段報文。所以客戶端在發送完ACK確認報文之後,會設置一個時長爲2MSL的計時器。MSL指的是Maximum Segment Lifetime:一段TCP報文在傳輸過程中的最大生命週期。2MSL即是服務器端發出爲FIN報文和客戶端發出的ACK確認報文所能保持有效的最大時長。
服務器端在1MSL內沒有收到客戶端發出的ACK確認報文,就會再次向客戶端發出FIN報文;
如果客戶端在2MSL內,再次收到了來自服務器端的FIN報文,說明服務器端由於各種原因沒有接收到客戶端發出的ACK確認報文。客戶端再次向服務器端發出ACK確認報文,計時器重置,重新開始2MSL的計時;
否則客戶端在2MSL內沒有再次收到來自服務器端的FIN報文,說明服務器端正常接收了ACK確認報文,客戶端可以進入CLOSED階段,完成“四次揮手”。
所以,客戶端要經歷時長爲2SML的TIME-WAIT階段;這也是爲什麼客戶端比服務器端晚進入CLOSED階段的原因
三.參考網址
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc