三次握手:
1.客戶端會發送一個SYN同步標志和seq序列號為x的請求報文段給服務端(狀態處于SYN_SENT);
2.服務端接收到客戶端的SYN請求報文段之后會發送給客戶端一個(SYN = 1, ACK = 1, Seq = y, Ack = x+1)請求加上確認數據報段(狀態處于SYN_RECD);
3.客戶端接收到服務端返回過來的請求數據報文段之后,會回復一個(ACK = 1, seq = x+1, ack = y+1)(狀態處于已連接狀態);
4.服務端接收到客戶端發送過來的確認報文段后(狀態變為已連接狀態),雙方連接成功;
疑問:
1.三次握手變成兩次握手可以嗎?
影響就是:服務器會處于忙等狀態,浪費資源。
客戶端發送SYN包A1,由于網絡鏈路的問題,導致A1到達的時間滯后,因為客戶端遲遲收不到服務端發送過來的響應就會重新發送一個B1,并且清理掉A1,結果B1的請求連接成功,之后A1的請求成功送達到了服務端,此時服務就會以為是另外的一個請求連接,然后成功的返回,并變成連接成功的狀態,但是客戶端已經建立了一個連接的請求,就會把A1的響應丟棄掉,這樣的話,就會維護一個服務端的僵尸連接。(簡單點說就是防止已經失效的連接請求報文段發送到服務器,導致服務器維持一個僵尸連接)
2.三次握手變成四次握手可以嗎
主要的為了提高傳輸的效率,合并了(客戶端同步請求的確認以及服務端同步請求);
3.三次握手過程中還有其他的作用嗎?
(1)在雙方的請求報文段中的頭部都會加入各自隨機的隨機序列號
(2)接收窗口的窗口縮放系數;
(3)MSS(最大報文段長度);
(4)是否支持SACK(選擇性確認);
4.第三次握手失敗了,會怎么處理?
此時服務端的狀態為SYN-RCVD,如果等不到客戶端發過來的ACK確認,服務端就會重新發送一個SYN和ACK給客戶端,如果服務端發重發了好幾個SYN+ACK給客戶端,都沒接收到客戶端返回過來的ACK,就會發送RST包,強制關閉連接。
四次揮手:
1.客戶端會發送一個FIN斷開連接標志的請求報文段給服務端(客戶端處于終止等待1);
2.服務端收到了客服端發過來的FIN之后,發送一個ACK報文給客戶端(服務端處于關閉等待),客戶端接收到服務端的ACk之后(客戶端處于終止等待2);
3.服務端發送一個FIN斷開連接標志的請求報文段給客戶端(服務端處于最后確認);
4.客戶端接收到服務端的FIN報文段之后,發送ACK報文段給服務端(客戶端處于時間等待);
5.服務端接收到ACK報文段之后(服務端處于關閉);
6.客戶端在進過2MSL(Maximum Segment Lifetime)之后(客戶端處于關閉);
疑問
1.為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
網絡是不可靠的,當服務端發送給客戶端的FIN之后一直得不到ACK的返回,就會重新發送一個FIN報文段,這個時間差最大值就是2MSL,這樣的確保服務端能接收到客戶端發送給服務端的ACK報文段,然后客戶端和服務端就會處于關閉狀態。
2.為什么釋放連接需要四次揮手?
tcp是全雙工模式,前兩次揮手表示的是一方沒有數據發送和另外一方的確認, 后兩次揮手就是另外一方沒有數據發送和一方的確認。這是一個雙方的斷開行為。