1. 程式人生 > 實用技巧 >面試中常問的關於TCP協議的問題

面試中常問的關於TCP協議的問題

1.如何理解TCP的三個特點:面向連線、位元組流、可靠傳輸?

面向連線:使用TCP協議通訊的雙方必須先建立連線,然後才能開始資料的讀寫。雙方都必須為該連線分配必要的核心資源,以管理連線的狀態和連線上資料的傳輸。TCP連線是全雙工的,即雙方的資料讀寫可以通過一個連線進行,完成資料交換不再使用該連線之後,通訊雙方都必須斷開連線,以釋放資源。並且TCP協議的這種連線是一對一的,所以基於廣播和多播(目標是多個主機)的應用程式不能使用TCP服務。而無連線的UDP協議則非常適用於廣播和多播

位元組流:被髮送的TCP報文先被放入TCP傳送緩衝區,在真正傳送時,在緩衝區內的資料被封裝成一個或多個TCP報文,接收端也是如此,所以TCP傳送端的寫操作次數和接收端的讀操作次數是沒有數量關係的,也就是說應用程式對資料的傳送和接收是沒有邊界限制

的。

可靠傳輸:首先是,TCP協議採用傳送應答機制,即傳送端傳送的每個TCP報文段都必須得到接收方的應答,才認為TCP報文段傳輸成功。其次,TCP協議採用超時重傳機制,傳送端在傳送出一個TCP報文段之後啟動定時器,如果在定時時間內未收到應答,它將重發該報文段。最後,因為TCP報文段最終是以IP資料報傳送的,而IP資料報達到接收端可能亂序、重複,所以TCP協議還會對收到的TCP報文進行重排、整理,再交付給應用層。

2.為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?

這是因為服務端在LISTEN狀態下,收到建立連線請求的SYN報文後,把ACK和SYN放在一個報文裡傳送給客戶端。而關閉連線時,當收到對方的FIN報文時,僅僅表示對方不再發送資料了但是還能接收資料

,己方也未必全部資料都發送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再發送FIN報文給對方來表示同意現在關閉連線,因此,己方ACK和FIN一般都會分開發送。

3.為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

  • 可靠地終止TCP連線:若確認關閉報文段丟失,則客戶端需要在這段時間內等待接收伺服器重發的結束報文段。
  • 保證讓遲來的TCP報文段有足夠的時間被識別並丟棄:2MSL可確保在網路上兩個傳輸方向上尚未被接收到的、遲到的TCP報文段都已經消失。確保一個新的TCP連線可以安全的建立而不會接收到上一個TCP連線的資料。(這也是為什麼當有些和TCP相關的程式退出後,我們無法立即啟動它的原因)

4.什麼是SYN攻擊?

在三次握手過程中,伺服器傳送在SYN-ACK之後,收到客戶端的ACK之前的TCP連線稱為半連線(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。

SYN攻擊就是客戶端在短時間內偽造大量不存在的IP地址,並向伺服器不斷地傳送SYN包,伺服器回覆確認包,併為該請求分配一個任務控制塊TCB(Transmission Control Block),然後等待客戶端的確認,由於源地址是不存在的(或者源地址不知曉),因此,伺服器需要不斷重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列和伺服器資源,導致正常的SYN請求因為佇列滿而被丟棄,從而引起網路堵塞甚至系統癱瘓。

5.如何避免SYN攻擊?

比較蠢的辦法:增大佇列SYN最大半連線數、減小超時值

1.延時分配TCB。當正常連線建立起來後再分配TCB則可以有效地減輕伺服器資源的消耗。
常見的方法是使用SYN CacheSYN Cookie技術。

2.使用SYN Proxy防火牆。防火牆中都提供一種 SYN代理的功能,其主要原理是對試圖穿越的SYN請求進行驗證後才放行。

6.TCP協議如何保證可靠傳輸?

校驗和
確認應答和序列號
超時重傳
連線管理
流量控制
擁塞控制

7.TCP滑動視窗?

8.TCP與UDP的特點比較?

連線機制:
TCP 是面向連線的傳輸層協議,需要佔用核心資源多
UDP 是不需要連線的,資源佔用少
服務物件:
TCP 是一對一的兩點服務
UDP 支援一對一、一對多、多對多
可靠性:
TCP 保證資料不丟失、不重複、按需到達
UDP 是盡最大努力交付,不保證交付資料
速度:
UDP速度快於TCP
資料流:
TCP是位元組流,沒有邊界限制
UDP是資料報流,需要以個體為單位傳送和讀取
擁塞控制、流量控制:
TCP 有擁塞控制和流量控制機制
UDP 則沒有擁塞控制和流量控制機制

9.TCP和UDP應用場景?

TCP可靠穩定,可以使得整個資料準確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等檔案傳輸協議,POP、SMTP等郵件傳輸的協議。

要求網路通訊速度能儘量的快,這時就可以使用UDP。實時語音視訊通話、實時遊戲、TFTP等。

10.簡述三次握手和四次揮手?

三次握手:

  • 伺服器與客戶端均處於CLOSE狀態
  • 伺服器先主動監聽某埠,處理LISTEN狀態
  • 客戶端主動連線,傳送SYN報文,seq=x,進入SYN_SEND狀態。
  • 伺服器回覆SYN+ACK報文,seq=y,ack=x+1,並且進入SYN_RCVD狀態。
  • 客戶端回覆ACK報文,ack=y+1,進入連線狀態
  • 伺服器收到ACK報文,進入連線狀態。

四次揮手:

  • 伺服器與客戶端均處於ESTABLISHED狀態
  • 客戶端打算關閉連線,傳送一個 FIN 報文,進入 FIN_WAIT_1 狀態。
  • 服務端回覆 ACK報文,進入 CLOSED_WAIT 狀態。
  • 客戶端收到 ACK 應答報文後,進入 FIN_WAIT_2 狀態。
  • 服務端處理完資料後,向客戶端傳送 FIN 報文(也含有ACK),進入 LAST_ACK 狀態。
  • 客戶端回覆一個 ACK 應答報文,之後進入 TIME_WAIT 狀態
  • 伺服器收到 ACK 應答報文後,進入了 CLOSE 狀態,服務端完成連線的關閉。
  • 客戶端在經過 2MSL 一段時間後,自動進入 CLOSE 狀態,客戶端也完成連線的關閉。

11. 什麼是TCP的保活機制?

定義一個時間段,在這個時間段內,如果沒有任何連線相關的活動,TCP保活機制會開始作用,每隔一個時間間隔,傳送一個探測報文,該探測報文包含的資料非常少,如果連續幾個探測報文都沒有得到響應,則認為當前的TCP 連線已經死亡,系統核心將錯誤資訊通知給上層應用程式。

TCP的保活機制詳解

12.已經建立連線,客戶端故障怎麼辦?

這種情況就會觸發TCP的保活機制,對應的引數包括保活時間、保活探測的次數、保活探測的時間間隔,其中保活時間預設為7200秒,保活探測次數為9,保活探測時間間隔為75秒。

也就意味著,如果客戶端突然故障,會經過7200+75*9=7875秒即2小時11分15後,伺服器才會判斷該連線失效,以上引數可以手動設定。

13.三種產生復位報文段的3種情況?

  • 訪問不存在的埠:當客戶端程式訪問一個不存在的埠時(或者處於TIME_WAIT狀態),目標主機將給它傳送一個復位報文段。
  • 異常終止一個連線的辦法:通過給對方傳送一個復位報文段,使傳送端所有排隊等待的資料都被丟棄,實現終止。
  • 處理半開啟連線:如果客戶端(或伺服器)處於半開啟狀態的連線寫入資料,則對方將回應一個復位報文段。
    (半開啟狀態的連線:一端關閉或異常終止,另一端沒有收到其結束報文段,導致另一端還保持著原連線)