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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章