面試官問你 TCP

TCP/IP 協議族

通常我說 TCP/IP 是指 TCP/IP 協議族。它是基於 TCP 和 IP 這兩個最初的協議之上的不同的通信協議的大集合。例如:http、https、ftp、icmp、arp、rarp、smtp(簡單郵件傳輸協議)


面試官問你 TCP/IP 協議了嗎?

一個網絡請求是怎麼傳輸的?

我們拿訪問瀏覽器舉個栗子,如圖所示:


面試官問你 TCP/IP 協議了嗎?

TCP、UDP有什麼區別?各有什麼優劣?

TCP 面向連接,提供可靠交付。通過 TCP 連接傳輸的數據,無差錯、不丟失、不重複、並且按序到達。相對 UDP 開銷大UDP 面向無連接,不保證可靠交付。無擁塞控制,支持一對一、一對多、多對多,開銷小。

關於 TCP 協議

面試官問你 TCP/IP 協議了嗎?

  • 確認 ACK - ACKnowledgement 僅當ACK = 1 時,確認才有效。簡單來說,就是確認收到數據。
  • 復位 RST - ReSet 標明 TCP 出現嚴重差錯時,必須釋放連接,重新建立連接。
  • 同步 SYN - SYNchronization 在建立連接時,用來同步序號。當 SYN = 1,ACK = 0 時,表名這是一個連接請求報文。 SYN = 1,ACK = 1 表示這是一個同意請求報文。
  • 終止 FNI - FINis(表示終、完)用來釋放連接。當 FNI = 1 表示此段報文發送方已發送完畢。

關於 UDP 協議

面試官問你 TCP/IP 協議了嗎?

解釋三次握手

  • 確認號 ack 期望收到對方下一個報文的序列號
  • 序列號 seq
  1. SYN = 1 請求同步序列號,A 的序列號為:x
  2. SYN = 1 ACK = 1,表示確認請求。B 發送的數據的序列號為:y,期望收到 下一個 A 的數據的序列號為:x + 1
  3. ACK = 1 ,表示確認請求。A 發送的數據的序列號為:x + 1,期望收到下一個 B 的數據的序列號為:y + 1

說說TCP三次握手?為什麼不兩次?

如果發送兩次就可以建立連接話,那麼只要客戶端發送一個連接請求,服務端接收到併發送了確認,就會建立一個連接。

可能出現的問題:如果一個連接請求在網絡中跑的慢,超時了,這時客戶端會從發請求,但是這個跑的慢的請求最後還是跑到了,然後服務端就接收了兩個連接請求,然後全部回應就會創建兩個連接,浪費資源!

如果加了第三次客戶端確認,客戶端在接受到一個服務端連接確認請求後,後面再接收到的連接確認請求就可以拋棄不管了。

說說TCP四次揮手?為什麼不是三次?

據傳輸結束後,通信的雙方都可以釋放連接。現在 A 和 B 都處於 ESTABLISHED 狀態。

面試官問你 TCP/IP 協議了嗎?

第一次揮手:A 的應用進程先向其 TCP 發出連接釋放報文段,並停止再發送數據,主動關閉 TCP 連接。A 把連接釋放報文段首部的終止控制位 FIN 置 1,其序號 seq = u(等於前面已傳送過的數據的最後一個字節的序號加 1),這時 A 進入 FIN-WAIT-1(終止等待1)狀態,等待 B 的確認。請注意:TCP 規定,FIN 報文段即使不攜帶數據,也將消耗掉一個序號。

第二次揮手:B 收到連接釋放報文段後立即發出確認,確認號是 ack = u + 1,而這個報文段自己的序號是 v(等於 B 前面已經傳送過的數據的最後一個字節的序號加1),然後 B 就進入 CLOSE-WAIT(關閉等待)狀態。TCP 服務端進程這時應通知高層應用進程,因而從 A 到 B 這個方向的連接就釋放了,這時的 TCP 連接處於半關閉(half-close)狀態,即 A 已經沒有數據要發送了,但 B 若發送數據,A 仍要接收。也就是說,從 B 到 A 這個方向的連接並未關閉,這個狀態可能會持續一段時間。A 收到來自 B 的確認後,就進入 FIN-WAIT-2(終止等待2)狀態,等待 B 發出的連接釋放報文段。

第三次揮手:若 B 已經沒有要向 A 發送的數據,其應用進程就通知 TCP 釋放連接。這時 B 發出的連接釋放報文段必須使 FIN = 1。假定 B 的序號為 w(在半關閉狀態,B 可能又發送了一些數據)。B 還必須重複上次已發送過的確認號 ack = u + 1。這時 B 就進入 LAST-ACK(最後確認)狀態,等待 A 的確認。

第四次揮手:A 在收到 B 的連接釋放報文後,必須對此發出確認。在確認報文段中把 ACK 置 1,確認號 ack = w + 1,而自己的序號 seq = u + 1(前面發送的 FIN 報文段要消耗一個序號)。然後進入 TIME-WAIT(時間等待) 狀態。請注意,現在 TCP 連接還沒有釋放掉。必須經過時間等待計時器設置的時間 2MSL(MSL:最長報文段壽命)後,A 才能進入到 CLOSED 狀態,然後撤銷傳輸控制塊,結束這次 TCP 連接。當然如果 B 一收到 A 的確認就進入 CLOSED 狀態,然後撤銷傳輸控制塊。所以在釋放連接時,B 結束 TCP 連接的時間要早於 A。

什麼是擁塞控制?

簡單來說,就是通過網絡的擁塞情況來調整 TCP 發送端發送的數據量。發送量先由 1 指數級遞增,到一定量時(65535 個字節)開始慢下來,這個時候還是遞增的。等到開始丟包時,又開始降低發送速度。

什麼是流量控制?

簡單來說,就是 TCP 的接受端處理不過來,讓 TCP 的發送端發送慢一點。接收端會維護一個處理窗口,即是接收端所能處理數據的能力。接收端將這個處理能力不斷反饋給發送端,以此來讓發送端調整發送的數據量的多少。




分享到:


相關文章: