TCP相關面試題(轉)


1、TCP三次握手過程

  wireshark抓包為:(wireshark會將seq序號和ACK自動顯示為相對值)    
  這里寫圖片描述 
   
  1)主機A發送標志syn=1,隨機產生seq =1234567的數據包到服務器,主機B由syn=1知道,A要求建立連接; 此時狀態A為SYN_SENT,B為LISTEN 
  這里寫圖片描述 
   
  2)主機B收到請求后要確認連接信息,向A發送ack =(主機A的seq+1),標志syn=1,ack=1,隨機產生seq=7654321的包, 此時狀態A為ESTABLISHED,B為SYN_RCVD  
  這里寫圖片描述 
   
  3)主機A收到后檢查ack 是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack =(主機B的seq+1),標志ack=1,主機B收到后確認seq值與ack=1則連接建立成功。 此時A、B狀態都變為ESTABLISHED    
  這里寫圖片描述 

2、TCP四次揮手過程

  斷開連接過程與建立連接類似 
1)主機A發送位碼為FIN=1,用來關閉客戶A到服務器B的數據傳送。此時A的狀態為FIN_WAIT_1 
2)服務器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。此時A為FIN_WAIT_2,B為CLOSE_WAIT 
3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A。此時A為TIME_WAIT,B為LAST_ACK 
4)客戶端A發回ACK報文確認,並將確認序號設置為收到序號加1。此時A、B都關閉了,狀態變為CLOSED。 
當(2)、(3)步中的ACK和FIN在一個包中發送時,A的狀態會直接從FIN_WAIT_1變為TIME_WAIT 

3、為什么建立連接需要三次握手,而斷開連接需要四次握手

  因為每個方向都需要一個FIN和ACK,當一端發送了FIN包之后,處於半關閉狀態,此時仍然可以接收數據包。 
  在建立連接時,服務器可以把SYN和ACK放在一個包中發送。 
  但是在斷開連接時,如果一端收到FIN包,但此時仍有數據未發送完,此時就需要先向對端回復FIN包的ACK。等到將剩下的數據都發送完之后,再向對端發送FIN,斷開這個方向的連接。 
  因此很多時候FIN和ACK需要在兩個數據包中發送,因此需要四次握手 

4、TIME_WAIT狀態持續時間及原因

  持續時間未2MSL,一個數據包在網絡中的最長生存時間為MSL。 
  假設最后客戶端回復的ACK丟失,服務器端會在超時時間到來時,重傳最后一個FIN包。 
  ACK和FIN在網絡中的最長生存時間就為2MSL,這樣就可以可靠的斷開TCP的雙向連接。 

5、超時重傳和快速重傳   

  • 超時重傳:當超時時間到達時,發送方還未收到對端的ACK確認,就重傳該數據包
  • 快速重傳:當后面的序號先到達,如接收方接收到了1、 3、 4,而2沒有收到,就會立即向發送方重復發送三次ACK=2的確認請求重傳。如果發送方連續收到3個相同序號的ACK,就重傳該數據包。而不用等待超時 

6、TCP首部長度,有哪些字段

這里寫圖片描述 

7、TCP選項有哪些

  TCP首部選項字段多達40B,一些常用的字段有: 
  1)選項結束字段(EOP,0x00),占1B,一個報文段僅用一次。放在末尾用於填充,用途是說明:首部已經沒有更多的消息,應用數據在下一個32位字開始處 
  2)無操作字段(NOP, 0x01),占1B,也用於填充,放在選項的開頭 
  3)MSS(最大報文段長度),格式如下:種類(1B,值為2),長度(1B,值為4),數值(2B) 
  用於在連接開始時確定MSS的大小,如果沒有確定,就用默認的(一般實現是536B) 
  4)窗口擴大因子,格式如下:種類(1B,值為3),長度(1B,值為3),數值(1B) 
  新窗口值 = 首部窗口值 * 2的(擴大因子)次方 
  當通信雙方認為首部的窗口值還不夠大的時候,在連接開始時用這個來定義更大的窗口。僅在連接開始時有效。一經定義,通信過程中無法更改。 
  5)時間戳(應用測試RTT和防止序號繞回) 
  6)允許SACK和SACK選項 

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

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

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

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

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

  1)偽裝的IP向服務器發送一個SYN請求建立連接,然后服務器向該IP回復SYN和ACK,但是找不到該IP對應的主機,當超時時服務器收不到ACK會重復發送。當大量的攻擊者請求建立連接時,服務器就會存在大量未完成三次握手的連接,服務器主機backlog被耗盡而不能響應其它連接。即SYN泛洪攻擊 
  防范措施: 
  1、降低SYN timeout時間,使得主機盡快釋放半連接的占用 
  2、采用SYN cookie設置,如果短時間內連續收到某個IP的重復SYN請求,則認為受到了該IP的攻擊,丟棄來自該IP的后續請求報文 
  3、在網關處設置過濾,拒絕將一個源IP地址不屬於其來源子網的包進行更遠的路由 
  2)當一個主機向服務器發送SYN請求連接,服務器回復ACK和SYN后,攻擊者截獲ACK和SYN。然后偽裝成原始主機繼續與服務器進行通信。 
  

11、TCP和UDP的區別

  • TCP是有連接的,兩台主機在進行數據交互之前必須先通過三次握手建立連接;而UDP是無連接的,沒有建立連接這個過程
  • TCP是可靠的傳輸,TCP協議通過確認和重傳機制來保證數據傳輸的可靠性;而UDP是不可靠的傳輸
  • TCP還提供了擁塞控制、滑動窗口等機制來保證傳輸的質量,而UDP都沒有
  • TCP是基於字節流的,將數據看做無結構的字節流進行傳輸,當應用程序交給TCP的數據長度太長,超過MSS時,TCP就會對數據進行分段,因此TCP的數據是無邊界的;而UDP是面向報文的,無論應用程序交給UDP層多長的報文,UDP都不會對數據報進行任何拆分等處理,因此UDP保留了應用層數據的邊界 

12、有哪些應用層協議是基於TCP的,哪些是基於UDP的

    • TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS
    • UDP:DNS、SNMP、NFS


免責聲明!

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



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