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
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