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


 

上篇文章跟大家介紹了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協議抓包分析及應用》,掃描下方二維碼或查看原文,進入后點擊下方免費訂閱即可。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM