TCP連接延伸7小問

1.TCP三次握手和四次揮手

三次握手(Three-way Handshake)主要作用就是爲了確認雙方的接收能力和發送能力正常。其實就是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號,交換TCP窗口大小信息,爲後面的可靠性傳送做準備。
剛開始客戶端處於 Closed 的狀態,服務端處於 Listen 狀態。
在這裏插入圖片描述
在這裏插入圖片描述

Q1:爲什麼兩次握手不可以?(A客戶端,B服務器)

爲了防止已經失效的連接請求報文段突然又傳送到了 B,因而產生錯誤。比如:A 發出的第一個連接請求報文段在網路結點上延誤到之後的連接釋放以後的某個時間段纔到達 B。 B 收到此失效的請求報文段後,就誤認爲 A 又發出一次新的連接請求。如果不進行第三次握手,B 發出確認後就進入了新的運輸連接狀態,一直等待 A 發來數據。

Q2:接收端收到 客戶端的 SYN 後,爲什麼還要傳回 SYN?

接收端傳回發送端所發送的 SYN 是告訴客戶端接收到的信息確實是客戶端所發送的信號了。
SYN 是 TCP / IP 建立連接時使用的握手信號。在客戶機和服務器之間建立正常的 TCP 網絡連接時,客戶機首先發出一個

Q3:傳了 SYN,爲什麼還要傳 ACK?

傳了 SYN,證明發送方到接收方的通道沒有問題,但是接收方到發送方的通道還需要 ACK 信號來進行驗證。

Q4:爲什麼 TIME-WAIT 狀態必須等待 2MSL 的時間呢?(MSL:最長報文段壽命)

TCP釋放連接時爲什麼time_wait狀態必須等待2MSL時間
1.如果 接收端A 在 TIME-WAIT 狀態不等待一段時間,那麼就無法收到 B 重傳的 FIN + ACK 報文段,因而也不會再發送一次確認報文段,這樣,B 就無法按照正常步驟進入 CLOSED 狀態。
2. 防止已失效的連接請求報文段出現在本連接中。A 在發送完最後一個 ACK 報文段後,再經過時間 2MSL,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。下一個連接中不會出現舊的連接請求報文段。

Q5:爲什麼第二次跟第三次不能合併, 第二次和第三次之間的等待是什麼?

當服務器執行第二次揮手之後, 客戶端不會再向服務端請求任何數據, 但是服務端可能還正在給客戶端發送數上一次請求的資源,所以服務端會等到把之前未傳輸完的數據傳輸完畢之後再發送關閉請求。

Q6:TCP 協議是如何保證可靠傳輸的?

  1. 數據包校驗:檢測數據在傳輸過程中若出錯,則丟棄報文段並且不給響應, TCP 發送數據端超時後會重發數據;
  2. 對失序數據包重排序:既然 IP 數據報的到達可能會失序,TCP 報文段作爲 IP 數據報來傳輸,到達也可能會失序。TCP 將失序重排,然後才交給應用層;
  3. 能夠丟棄重複數據;
  4. 應答機制:收到發自 TCP 連接另一端的數據,將發送一個確認標誌ACK。
  5. 超時重發:當 TCP 發出一個段後,就會啓動一個定時器,設定時間內沒有收到ACK將重發這個報文段;
  6. 流量控制:TCP 連接的雙方都有固定大小的緩衝空間。不允許對方發送超過自己緩衝區容量的數據,以防較快主機致使較慢主機的緩衝區溢出。TCP 使用的流量控制協議是可變大小的滑動窗口協議。

Q7:Tcp握手成功後,如果一方宕機,沒有主動請求關閉,連接會一直保存麼?

當TCP連接發生一些物理上的意外情況時,例如網線斷開,linux上的TCP實現會依然認爲該連接有效,而windows則會在一定時間後返回錯誤信息。可以通過設置SO_KEEPALIVE選項來解決,不過不知道這個選項是否對於所有平臺都有效。
連接斷開過程-----四次揮手

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章