TCP常見面試題 


常見面試題  

1.為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?    

  這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在 一個報文里來發送。

  但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以 未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之后,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這里的ACK報 文和FIN報文多數情況下都是分開發送的.

2.為什么TIME_WAIT狀態還需要等2MSL后才能返回到CLOSED狀態?

  這是因為雖然雙方都同意關閉連接了,而且握手的4個報文也都協調和發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SEND狀態到ESTABLISH狀態那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發送的ACK報文會一定被對方收到,因此對方處於LAST_ACK狀態下的SOCKET可能會因為超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文。

3、大量TIME_WAIT產生的原因及解決辦法

  原因:對於基於TCP的HTTP協議,關閉TCP連接的是Server端,這樣,Server端回進入TIME_WAIT狀態,可想而知,對於訪問量大的Web Server,會存在大量的TIME_WAIT狀態。

  解決辦法:

    (1)開啟socket重用,允許TIME_WAIT的socket重新用於TCP連接

    (2)開啟快速回收

4、保活機制

  

5、TCP在listen時的參數backlog的意義

  linux內核中會維護兩個隊列:
    (1)未完成隊列:接收到一個SYN建立連接請求,處於SYN_RCVD狀態
    (2)已完成隊列:已完成TCP三次握手過程,處於ESTABLISHED狀態
    當有一個SYN到來請求建立連接時,就在未完成隊列中新建一項。當三次握手過程完成后,就將套接口從未完成隊列移動到已完成隊列。
    backlog曾被定義為兩個隊列的總和的最大值,也曾將backlog的1.5倍作為未完成隊列的最大長度
一般將backlog指定為5

6、accept發生在三次握手的哪一步

  accept會監聽已完成隊列是否非空,當隊列為空時,accept就會阻塞。當隊列非空時,就從已完成隊列中取出一項並返回。
  而已完成隊列中的都是三次握手過程已經完成的,因此accept發生在三次握手之后。

 

 

 7、三次握手過程中有哪些不安全性

  (1)SYN洪泛攻擊

    服務器處於SYN_Wait的狀態:

    

   偽裝的IP向服務器發送一個SYN請求建立連接,然后服務器向該IP回復SYN和ACK,但是找不到該IP對應的主機,當超時時服務器收不到ACK會重復發送。當大量的攻擊者請求建立連接時,服務器就會存在大量未完成三次握手的連接,服務器主機backlog被耗盡而不能響應其它連接。即SYN泛洪攻擊 (屬於DOS的一種,發送大量的半連接請求,耗費CPU和內存資源,引起網絡堵塞甚至系統癱瘓)
  當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊

    

  (2)防范措施

    1、降低SYN timeout時間,使得主機盡快釋放半連接的占用
    2、采用SYN cookie設置,如果短時間內連續收到某個IP的重復SYN請求,則認為受到了該IP的攻擊,丟棄來自該IP的后續請求報文
    3、在網關處設置過濾,拒絕將一個源IP地址不屬於其來源子網的包進行更遠的路由


免責聲明!

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



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