上位機面試必備——TCP通訊靈魂二十問【下】

常哥說程式設計發表於2020-06-24

 

上篇文章跟大家介紹了TCP通訊常見的前10個面試題,沒看過的小夥伴可以點選下方連結進行檢視:

上位機面試必備——TCP通訊靈魂二十問【上】

今天就後面的10個面試題接著做下說明:歡迎關注【dotNet工控上位機】公眾號:thinger_swj

11、四次揮手中的TIME_WAIT狀態?

首先要明確一點:主動關閉連線的一方,才會有TIME_WAIT狀態。

之所以需要TIME_WAIT狀態,主要是兩個原因:

  • 防止相同的埠重新連線時,伺服器收到的是停留在網路間的資料包

  • 保證被動關閉連線的一方能被正確的關閉,即保證最後的 ACK 能讓被動關閉方接收,從而幫助其正常關閉

12、為什麼TIME_WAIT時間為2MSL?

   

 

 

       MSL 是 Maximum Segment Lifetime,報文最大生存時間,它是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。比如如果被動關閉方沒有收到斷開連線的最後的 ACK 報文,就會觸發超時重發 FIN 報文,另一方接收到 FIN 後,會重發 ACK 給被動關閉方,一來一去正好 2 個 MSL。
     2MSL 的時間是從客戶端接收到 FIN 後傳送 ACK 開始計時的。如果在 TIME-WAIT 時間內,因為客戶端的 ACK 沒有傳輸到服務端,客戶端又接收到了服務端重發的 FIN 報文,那麼 2MSL 時間將重新計時。在Linux系統中,2MSL預設值是60秒。

13、什麼是TCP的保活機制?

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

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

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

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

15、TCP/IP協議與Socket之間是什麼關係?

網路有一段關於Socket和TCP/IP協議關係的說法比較容易理解:

TCP/IP只是一個協議棧,就像作業系統的執行機制一樣,必須要具體實現,同時還要提供對外的操作介面。這個就像作業系統會提供標準的程式設計介面,比如Win32程式設計介面一樣,TCP/IP也要提供可供程式設計師做網路開發所用的介面,這就是Socket程式設計介面。

所以,Socket跟TCP/IP並沒有必然的聯絡,Socket程式設計介面在設計的時候,就希望能適應其他的網路協議。Socket的出現只是可以更方便的使用TCP/IP協議棧而已,其對TCP/IP進行了抽象,形成了一些最基本的函式介面,比如Send,Listen等。

16、什麼是SYN攻擊?

我們都知道 TCP 連線建立是需要三次握手,假設攻擊者短時間偽造不同 IP 地址的 SYN 報文,服務端每接收到一個SVN 報文,就進入SYN_RCVD 狀態,但服務端傳送出去的 ACK + SYN 報文,無法得到未知IP 主機的 ACK 應答,久而久之就會佔滿服務端的 SYN 接收佇列(未連線佇列),使得伺服器不能為正常使用者服務。

17、如何避免SYN攻擊?

避免SYN攻擊的兩個方案:

  • 通過修改核心引數,控制佇列大小,並確定好當佇列滿之後應該如何處理,比如佇列滿之後,對新的SYN直接回復RST,丟棄連線。

  • 當SYN佇列滿了之後,後續收到的SYN,不直接進入SYN佇列,而是先計算Cookie值,再傳送,後續可以驗證ACK包的合法性

 

18、TCP伺服器Socket程式設計流程

 

 

  • 服務端初始化 Socket,得到檔案描述符

  • 服務端呼叫 Bind,將繫結在 IP 地址和埠

  • 服務端呼叫 Listen,進行監聽

  • 服務端呼叫 Accept,建立客戶端連線

  • 通過Send向客戶端傳送訊息

  • 通過Receive接收客戶端訊息

 

19、TCP客戶端Socket程式設計?

  • 客戶端初始化 Socket,得到檔案描述符
  • 客戶端呼叫Connect,連線伺服器

  • 連線成功呼叫Send向客戶端傳送訊息

  • 通過Receive接收客戶端訊息

20、Listen中的backlog引數什麼意義?

Linux核心中會維護兩個佇列:

    未完成連線佇列(SYN 佇列):接收到一個 SYN 建立連線請求,處於 SYN_RCVD 狀態;    已完成連線佇列(Accpet 佇列):已完成 TCP 三次握手過程,處於 ESTABLISHED 狀態;

    在核心 2.2 之後,backlog 變成 Accept 佇列,也就是已完成連線建立的佇列長度,所以現在通常認為 backlog 是 Accept 佇列。

     以上即為TCP通訊常見的二十問,希望對大家面試及TCP理解有所幫助。

 

今日直播

    為了讓大家對TCP通訊原理有更好的認識,今晚直播課主題《西門子S7協議抓包分析及應用》,掃描下方二維碼或檢視原文,進入後點選下方免費訂閱即可。

 

 

相關文章