??你以為你瞭解TCP協議?這些你可能不知道的細節才是關鍵!

努力的小雨發表於2023-11-03

引言

在之前的內容中,我們已經詳細講解了TCP面試中最常見的問題,如三次握手和四次揮手等。而今天,我們將繼續深入探討TCP協議的其他方面,比如序列號和TCP Fast Open(TFO)等重要細節問題。這些內容將為你在面試中提供更全面的知識儲備。

為什麼 SYN/FIN 不包含資料卻要消耗⼀個序列號?

SYN/FIN 是 TCP 協議中的標誌位,用於建立和關閉連線。它們不包含資料,但需要消耗一個序列號的原因是為了保持 TCP 連線的可靠性。

在 TCP 連線建立時,客戶端傳送 SYN 包給伺服器端,伺服器端接收到後傳送 SYN+ACK 包給客戶端,最後客戶端傳送 ACK 包確認連線建立。這個過程中,每個包都需要有一個序列號來標識資料的順序和確認接收。

類似地,在 TCP 連線關閉時,FIN 包被用來表示一端希望關閉連線。傳送 FIN 包的一端會等待對方傳送 ACK 包來確認關閉,然後再傳送 ACK 包進行最終確認。同樣,這個過程中的每個包都需要有一個序列號。

透過使用序列號,TCP 協議可以保證資料的可靠傳輸,確保資料按照正確的順序到達目標。因此,即使 SYN/FIN 包本身不攜帶資料,它們仍然需要消耗一個序列號來維護連線的可靠性。

image

如果在建立或關閉TCP連線時不傳送序列號,將會導致連線的可靠性和資料的順序無法保證。

在建立連線時,傳送方的SYN包沒有序列號,接收方無法準確地判斷資料包的順序。這可能導致接收方無法正確地響應SYN+ACK包,從而導致連線無法建立。

在關閉連線時,如果不傳送序列號,接收方無法準確地確認關閉請求,並且無法確定關閉順序。這可能導致連線無法成功關閉,或者導致資料丟失或混亂。

什麼是半連線佇列?什麼是SYN Flood攻擊?

半連線佇列(Half-open connection queue)是指TCP伺服器在處理連線請求時,當收到客戶端傳送的SYN包(同步包)時,會將該連線請求新增到半連線佇列中。半連線佇列中儲存了已收到SYN包但還未完成三次握手的連線請求。

SYN Flood攻擊是一種網路攻擊方式,它利用TCP協議的漏洞,大量地向目標伺服器傳送偽造的SYN包,使伺服器的半連線佇列被耗盡。當伺服器的半連線佇列被耗盡後,正常的連線請求無法得到處理,導致服務不可用。

image

在SYN Flood攻擊中,攻擊者傳送大量的偽造源IP地址的SYN包給目標伺服器,但攻擊者並不真正完成三次握手建立連線,而是讓伺服器一直等待,從而消耗伺服器的資源。由於伺服器需要為每個未完成的連線請求分配一些資源,當半連線佇列被耗盡時,伺服器將無法處理正常的連線請求,導致服務崩潰或變得不可用。

為了防止SYN Flood攻擊,伺服器可以採取一些防禦措施,例如使用防火牆過濾掉偽造源IP的SYN包、增加半連線佇列的大小、限制每個IP地址的連線請求數量等。這些措施可以幫助伺服器抵禦SYN Flood攻擊並保持正常的服務執行。

說說TCP快速開啟(TFO)的原理

在TCP快速開啟(TFO)中,伺服器端在收到客戶端的初始連線請求(SYN包)時,會生成一個cookie,並將該cookie攜帶在返回給客戶端的SYN-ACK包中。客戶端收到SYN-ACK包後,會將伺服器返回的cookie快取在本地。

以下是第一次請求獲取cookie值的全過程圖:

image

在後續的連線請求中,客戶端可以利用快取的cookie直接傳送給伺服器,從而減少握手次數。以下是使用快取的cookie值開始快速傳輸資料的流程圖示例:

image

TCP Fast Open的優勢

image

快速開啟(TFO)在TCP協議中的一個最顯著的優點是可以利用握手去除一個往返 RTT。當伺服器收到帶有TFO cookie的連線請求時,可以直接使用該cookie進行驗證,而無需進行完整的三次握手過程。這樣可以極大地減少了連線建立的時間,提高了網路效能和響應速度。

此外,TFO還可以有效地防止SYN-Flood攻擊等惡意行為。透過使用TFO技術,伺服器可以在接收到帶有TFO cookie的連線請求時,直接驗證cookie,並將請求放入半連線佇列,而不會消耗伺服器資源進行完整的三次握手。這樣可以有效地減輕伺服器的負載,並且只有合法的連線請求才能透過驗證,從而防止了SYN-Flood攻擊等惡意攻擊。

TCP報文中的時間戳有什麼作用?

image

TCP Timestamps Option是由四個主要部分構成的。這四個部分分別是類別(kind)、長度(Length)、傳送方時間戳(TS value)和回顯時間戳(TS Echo Reply)。其中,傳送方時間戳和回顯時間戳被認為是該選項中最重要的兩個欄位。

image

TCP 的時間戳主要解決兩大問題

計算往返時延 RTT(Round-Trip Time)

image

在啟用Timestamps選項之後,由於ACK包中包含了TSval和TSecr,因此無論是正常的確認包還是重傳的確認包,都可以透過這兩個值來計算出往返時間(RTT)。這樣一來,我們可以更準確地估算網路的延遲情況。

防止序列號的迴繞問題

TCP的序列號使用32位來表示,因此在傳輸了232位元組的資料之後,序列號會發生溢位並重新開始計數。為了解決這個問題,TCP引入了視窗縮放選項,可以將視窗大小最大擴充套件到1GB(230),這樣在高速網路中,序列號可以在很短的時間內被重複使用,從而更好地支援高速資料傳輸。

image

假設我們傳送了6個資料包,每個資料包的大小為1GB。在這個過程中,由於序列號的迴繞,第5個包的序列號與前面要傳送的包序列號完全相同。同時,第2個包由於某些原因延遲導致需要進行重傳,直到時間t7才到達。如果沒有一些措施進行區分,這個阻塞資料包會導致資料的紊亂。

然而,由於存在Timestamps,我們可以透過TSval和TSecr來區分阻塞資料包與第6個包。透過比較這兩個值,我們可以確定資料包的先後順序,從而避免資料的混亂。因此,Timestamps的存在對於解決這種情況非常重要。

總結

透過本文的討論,我們對TCP協議的一些重要細節有了更深入的瞭解。首先,我們瞭解到為什麼SYN/FIN包需要消耗一個序列號,這是為了保證TCP連線的可靠性和資料的順序。其次,我們探討了半連線佇列和SYN Flood攻擊,瞭解了它們在TCP連線建立和安全性方面的作用。然後,我們學習了TCP快速開啟(TFO)的原理和優勢,它可以減少連線建立時間,並有效防止惡意攻擊。最後,我們瞭解了TCP報文中的時間戳的作用,它可以幫助計算往返時延和解決序列號迴繞問題。透過對這些細節的瞭解,我們可以更好地理解和應用TCP協議,提高網路效能和安全性。

以上只是一篇關於TCP協議的面試文章的一小部分內容。後續將會提供更多有針對性的面試題,以深入探討TCP協議的相關細節。

相關文章