TCP相關面試題總結

FreeeLinux發表於2017-01-31

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

相關文章