文章目錄
- 1.確認應答機制
- 2.超時重傳機制:超時不一定是真超時了
- 3.連接管理機制
1.確認應答機制
TCP協議中的確認應答機制是確保數據可靠傳輸的關鍵部分。以下是該機制的主要步驟和特點的詳細解釋:
數據分段與發送:
發送方將要發送的數據分成一個個數據段(或稱為TCP報文段)進行發送。
接收方確認:
接收方在成功收到數據段后,會向發送方發送一個確認(ACK)報文。這個ACK報文包含了確認序號,通常是接收到的數據段的下一個字節的序列號,表示接收方已經成功接收到了該序列號之前的數據。
發送方繼續發送:
發送方在收到接收方的ACK確認后,會繼續發送下一個數據段。
超時重傳:
如果發送方在發送數據段后的一定時間內(稱為超時時間,RTO)沒有收到接收方的ACK確認,它會認為該數據段可能丟失或出錯,并會重新發送該數據段。這個時間是根據往返時間(RTT)和網絡條件來動態調整的。
重復確認:
如果接收方檢測到有數據段重復(即接收到了先前已確認的數據),它會向發送方發送一個重復確認(Duplicate ACK)。這有助于發送方更快地識別出數據丟失,并觸發快速重傳。
快速重傳:
當發送方收到連續的3個或更多的重復ACK時,它會認為有數據段丟失,并立即重新發送該數據段,而不是等待超時時間到達。這有助于減少傳輸延遲并提高網絡效率。
擁塞控制:
如果發送方的數據段在一段時間內未收到確認(即發生了超時),發送方會認為網絡發生了擁塞,并會減慢發送速率,以減輕網絡負載。這通常是通過調整擁塞窗口大小來實現的。
序列號與確認號:
TCP協議使用32位的序列號和確認號來對數據進行編號和確認。這有助于發送方和接收方精確地跟蹤數據傳輸的進度,并確保數據的完整性和順序性。
通過這些機制,TCP協議能夠確保數據的可靠傳輸,即使在復雜的網絡環境中也能保持較高的傳輸效率和準確性。
2.超時重傳機制:超時不一定是真超時了
TCP協議中的超時重傳機制是確保數據可靠傳輸的關鍵部分之一。當TCP發送一個數據段(或稱為報文段)后,它會等待接收方的確認應答(ACK)。如果在規定的時間內沒有收到確認應答,發送方會認為該數據段已經丟失或者出現了錯誤,并會啟動超時重傳機制。
以下是超時重傳機制的基本步驟:
設置定時器:
當TCP發送一個數據段后,它會為該數據段設置一個定時器(或稱為重傳定時器)。這個定時器的超時時間(RTO, Retransmission TimeOut)是根據網絡條件動態計算的,通常基于之前的往返時間(RTT, Round-Trip Time)的樣本值進行估計。
等待確認:
發送方在發送數據段后會等待接收方的確認應答(ACK)。確認應答中包含了一個確認序號,表示接收方已經成功接收到了該序號之前(不包括該序號)的所有數據。
檢查超時:
如果在定時器超時之前收到了確認應答,發送方會停止該定時器并繼續發送后續的數據段。
如果在定時器超時之前沒有收到確認應答,發送方會認定該數據段已經丟失或出錯,并會重傳該數據段。
重傳數據段:
當發送方決定重傳數據段時,它會再次發送該數據段,并重置相應的定時器。
調整超時時間:
TCP使用一種稱為指數退避(Exponential Backoff)的算法來動態調整RTO值。每次發生超時重傳時,RTO值會按照指數增長,以應對網絡條件的變化。這種調整有助于避免在網絡擁塞時頻繁地發送無用的重傳數據。
快速重傳:
除了基于定時器的超時重傳外,TCP還使用了一種稱為快速重傳的機制。當接收方檢測到有數據段丟失時(通過收到重復的ACK),它會立即向發送方發送重復ACK。如果發送方收到足夠多的重復ACK(通常是3個或更多),它會認為有數據段丟失,并會立即重傳該數據段,而不需要等待定時器超時。
通過超時重傳和快速重傳機制,TCP能夠確保在網絡出現丟包或錯誤時,數據仍然能夠可靠地傳輸到接收方。這些機制是TCP協議中可靠性保證的重要組成部分。
參考優質博文
發送方發生了一個數據沒有收到ack,他不知道這個數據:丟包?在網絡中未到達?有應答但是應答丟了?
丟包或 數據包/應答 因速度原因在網絡里傳輸很慢
應答丟了:發送重復數據 – 重復數據是不可靠的一種情況 --需要去重 – 通過序號!
如何確定超時?
最理想的情況下, 找到一個最小的時間, 保證 “確認應答一定能在這個時間內返回”.
但是這個時間的長短, 隨著網絡環境的不同, 是有差異的.
如果超時時間設的太長, 會影響整體的重傳效率;
如果超時時間設的太短, 有可能會頻繁發送重復的包;
如何設置?
TCP為了保證無論在任何環境下都能比較高性能的通信, 因此會動態計算這個最大超時時間.
Linux中(BSD Unix和Windows也是如此), 超時以500ms為一個單位進行控制, 每次判定超時重發的超時時間都是500ms的整數倍.
如果重發一次之后, 仍然得不到應答, 等待 2500ms 后再進行重傳.
如果仍然得不到應答, 等待 4500ms 進行重傳. 依次類推, 以指數形式遞增.
累計到一定的重傳次數, TCP認為網絡或者對端主機出現異常, 強制關閉連接
3.連接管理機制
連接管理機制,特別是在TCP協議中,是確保數據在客戶端和服務器之間可靠傳輸的關鍵過程。以下是TCP連接管理機制的主要步驟和特點的詳細解釋:
三次握手建立連接:
第一次握手:客戶端發送一個SYN(同步)報文段到服務器,請求建立連接。客戶端進入SYN_SENT狀態。
第二次握手:服務器收到SYN報文段后,如果同意建立連接,則回復一個SYN+ACK(同步/確認)報文段,表示接受請求。服務器進入SYN_RECV狀態。
第三次握手:客戶端收到服務器的SYN+ACK報文段后,發送一個ACK(確認)報文段給服務器,表示連接已經建立。客戶端進入ESTABLISHED狀態,服務器也進入ESTABLISHED狀態,此時連接正式建立。
這個過程就像是兩個人在建立關系,互相確認對方的意圖和意愿。
狀態轉換:
客戶端狀態轉換:從CLOSED(關閉)到SYN_SENT,再到ESTABLISHED,以及后續的FIN_WAIT1、FIN_WAIT2、TIME_WAIT,最后回到CLOSED。
服務器狀態轉換:從CLOSED(關閉)到LISTEN(監聽),再到SYN_RECV,然后進入ESTABLISHED,以及后續的CLOSE_WAIT、LAST_ACK,最后回到CLOSED。
四次揮手斷開連接:
客戶端或服務器中的一方(假設為客戶端)首先發起斷開連接的請求,發送一個FIN(結束)報文段。
另一方(服務器)收到FIN報文段后,回復一個ACK報文段,表示收到斷開連接的請求。
隨后,服務器也發送一個FIN報文段給客戶端,表示自己也準備斷開連接。
客戶端收到服務器的FIN報文段后,回復一個ACK報文段,表示連接已經關閉。
這個過程就像是兩個人在結束關系,互相確認并道別。
超時重傳:如果在規定的時間內沒有收到對方的確認報文段(ACK),發送方會啟動超時重傳機制,重新發送之前的報文段。這是為了確保在網絡不穩定或丟包的情況下,數據仍然能夠可靠地傳輸。
連接管理機制的作用:連接管理機制是TCP保證可靠性的一個核心機制。通過三次握手建立連接和四次揮手斷開連接,TCP能夠在客戶端和服務器之間建立一個可靠的、全雙工的、面向連接的通信管道。同時,通過狀態轉換和超時重傳機制,TCP能夠確保數據在傳輸過程中的完整性和準確性。
- 客戶端connect發起連接請求,客戶端tcp會發一個帶有syn的報文,收到ack后一旦客戶端發起ack connect返回。accpet只會把建立好的連接拿上來用。即應用層的接口只會開始和結束某一動作,動作怎么完成的不關心,有OS完成。即他們并不關心三次握手的具體過程,只把握手前和后的結果拿來用。
- tcp通信是基于連接的,需要建立和斷開連接 — 三次握手四次揮手
為什么要進行三次握手四次揮手?
- 實際上三次還是四次并不重要,三次握手也可以是四次握手,只不過捎帶應答讓握手次數三次就可以;揮手三次也可以,稍帶應答即可。即進行握手揮手的主要目的是通過雙方分別一個發送一個響應來保證我們要開始建立或結束連接的可靠性!
- 為什么大多數情況下握手壓縮成三次,揮手不壓縮?握手時,客戶端發來連接請求,服務端都是無條件答應即服務端一定會發送ack和syn,所以這里壓縮。而揮手時,即便服務端發了ack,也不一定就會給客戶端說我們斷開連接吧,所以如果揮手想要變成三次,需要一種場景:服務端一定會斷開鏈接。
- 另外,三次握手可以驗證全雙工是否通暢:三次握手使得cs雙方至少都經歷了一次發收。即三次握手的目的是保證雙方都能進行收發 — 可靠的驗證全雙工。
- 三次握手確保一般情況下握手失敗的管理連接成本讓客戶端承擔:首先達成共識:這里我們講握手揮手并沒講這樣安不安全而是在講邏輯上這樣能不能為通信建立前提,至于安全問題這里暫且不討論,只考慮邏輯正確性。一次握手:c向s只發起一次syn,這是服務端和客戶端都認為建立好連接了,于是服務端會創建連接結構體對象,如果客戶端惡意發起很多個syn,那么服務端就會建立很多連接 ---- 成本增加且沒用 — 浪費資源降低效率;二次握手:c發syn到s,s發ack給c,s一經發出ack就認為握手成功,那么s就會創建連接結構體對象,同樣的,c惡意發起多個syn或發起syn后崩掉,服務端都會建立原來的連接對象,只有在很久之后沒有收到消息認為客戶端關閉后才會關閉連接 — 成本/資源/效率問題;三次握手:c在收到ack后就建立連接,而s只有在收到第三次ack才會建立連接,所以即便第三次ack丟失,s不會建立連接。而c會===》把成本壓在客戶端而非服務端上了。— 從設計減少服務端的成本。
- 是不是次數越多越好?不!且不說浪費資源,三次已經可以了沒必要。其次,次數越多帶來試錯次數多也同樣帶來犯錯的次數多==》本來建立好了,但有一次ack丟了認為建立好的連接是不成功的連接。其次,一般都是奇數次的握手,這樣使得發起連接請求的一方在第一次和最后一次都是它,使得即便最后一次丟失了成本在它不在客戶端。(x是奇數,前x-1次都是可靠的因為都有ack只有最后一次沒有ack也就不知道對方是否收到)
- 三次握手也有可能受syn洪水攻擊,具體見下面syn洪水介紹。黑客用肉機某一時間段統一向某服務端發起連接請求消耗服務端半連接資源。這屬于安全范疇。我們上面談的是功能邏輯范疇。
- 為什么四次揮手?保證雙方都能得知對方不再發送數據的意愿。一個fin–我不想跟你發送數據了但是我還可以收數據,也可以發報頭即回應服務端分的ack;一個ack–我知道了。然后對方發了一個fin:我也不想跟你發送數據了;一個ack–知道了;
- 三次握手不僅僅是握手!即不僅僅是syn/ack等。由于只是傳輸報頭,所以此時他們還進行了協商緩沖區大小等事情。有一個字段是16位窗口大小,并不意味著窗口大小一定是65535,因為還有一個字段:窗口擴展因子,在握手階段,雙方通過該字段來協商緩沖區大小!
gpt回答
面試中經常被問到為什么TCP協議需要三次握手來建立連接以及四次揮手來斷開連接,以下是這兩個問題的詳細解釋:
為什么需要三次握手來建立連接?
TCP協議使用三次握手來建立連接,主要是為了確保通信雙方的連接狀態是可靠的,并且能夠處理網絡中的異常情況。以下是三次握手的主要目的:
確認雙方的通信能力:通過三次握手,雙方可以確認彼此都能夠發送和接收數據,從而確保連接的可靠性。
同步雙方的初始序列號:TCP是一個字節流協議,沒有報文邊界。因此,需要雙方協商一個初始序列號,以便后續的數據傳輸能夠按照正確的順序進行。三次握手中的SYN和ACK報文段就用于協商和確認雙方的初始序列號。
避免失效的連接請求報文段:如果客戶端發送的連接請求報文段在網絡中滯留(例如,由于網絡擁堵),客戶端可能會超時并重發連接請求。如果此時舊的連接請求報文段到達了服務器,服務器會發送一個確認報文段給客戶端。但是,由于客戶端已經關閉了連接,這個確認報文段對于客戶端來說是無效的。使用三次握手可以避免這種情況,因為服務器只有在收到客戶端的確認報文段后才會認為連接已經建立。
為什么需要四次揮手來斷開連接?
TCP協議使用四次揮手來斷開連接,主要是為了確保通信雙方都能夠可靠地關閉連接,并且處理數據發送的完成情況。以下是四次揮手的主要目的:
確保數據發送完成:在斷開連接之前,通信雙方需要確保所有數據都已經成功發送和接收。四次揮手中的第二次和第三次揮手就是用于處理這個問題的。客戶端發送一個FIN報文段告訴服務器它已經完成了數據的發送,但是服務器可能還有數據要發送給客戶端。因此,服務器需要發送一個ACK報文段告訴客戶端它已經收到了FIN報文段,并且等待自己的數據發送完成后再發送一個FIN報文段給客戶端。
釋放連接資源:在斷開連接后,通信雙方需要釋放與連接相關的資源(如緩沖區、連接狀態等)。四次揮手中的最后一次揮手就是用于通知對方連接已經關閉,并且可以釋放相關資源。
處理半關閉狀態:TCP連接是一個全雙工的連接,即通信雙方都可以同時發送和接收數據。四次揮手可以處理連接處于半關閉狀態的情況,即一方已經關閉了發送通道(或接收通道),但另一方仍然可以發送(或接收)數據。
綜上所述,三次握手和四次揮手是TCP協議中非常重要的機制,它們確保了TCP連接的可靠性和數據的完整性。
SYN洪水(又名SYN洪水攻擊或SYN洪泛)
SYN洪水(又名SYN洪水攻擊或SYN洪泛)是一種分布式拒絕服務(DDoS)攻擊,其目標是耗盡目標服務器上的資源,使其無法響應合法流量。以下是關于SYN洪水攻擊的詳細解釋:
定義
SYN洪水攻擊是一種利用TCP協議缺陷進行的攻擊,攻擊者向被攻擊的主機發送大量偽造的TCP連接請求(SYN數據包),導致目標主機上的資源耗盡(如CPU滿負荷或內存不足),從而無法處理正常的TCP連接請求。
工作原理
TCP三次握手:在正常的TCP連接建立過程中,客戶端和服務器會進行三次握手。首先,客戶端向服務器發送一個SYN(同步)數據包請求建立連接;然后,服務器響應一個SYN-ACK(同步-確認)數據包;最后,客戶端發送一個ACK(確認)數據包完成連接建立。
攻擊過程:在SYN洪水攻擊中,攻擊者會向目標服務器上的每個端口重復發送SYN數據包,通常使用偽造的IP地址。服務器收到這些看似合法的連接請求后,會向每個請求分配資源并發送SYN-ACK數據包。然而,由于攻擊者使用了偽造的IP地址或者選擇不發送ACK數據包,服務器將無法完成三次握手并一直保持這些連接處于半開狀態。
資源耗盡:隨著半開連接的數量不斷增加,服務器上的資源(如內存和CPU)將逐漸被耗盡。當服務器的連接溢出表填滿時,它將無法再處理新的連接請求,從而導致對合法用戶的服務被拒絕。
特點
分布式:SYN洪水攻擊通常是由多個攻擊源同時發起的,使得攻擊更加難以檢測和防御。
偽裝性:攻擊者通常使用偽造的IP地址發起攻擊,使得追蹤和定位攻擊源變得困難。
資源消耗:SYN洪水攻擊會大量消耗目標服務器的資源,導致服務不可用。
緩解方法
微塊:管理員可以在服務器內存中為每個傳入的SYN請求分配一個微記錄(少至16字節),而不是一個完整的連接對象,以減少資源消耗。
SYN Cookie:使用SYN Cookie技術,服務器可以在收到SYN數據包時生成一個唯一的Cookie值,并將其與SYN-ACK數據包一起發送。當客戶端發送ACK數據包時,服務器將驗證Cookie值以確認連接的有效性。這可以防止攻擊者利用偽造的IP地址發起攻擊。
防火墻和入侵檢測系統:配置防火墻和入侵檢測系統以檢測和過濾異常的SYN數據包流量,從而減少SYN洪水攻擊的影響。
通過了解SYN洪水攻擊的工作原理和緩解方法,網絡管理員可以采取相應的措施來保護他們的服務器和網絡免受此類攻擊的影響。
連接管理機制中在四次揮手時客戶端狀態從TIME_WAIT到CLOSE為什么隔一段時間
在TCP連接管理機制的四次揮手過程中,客戶端狀態從TIME_WAIT到CLOSE需要隔一段時間,這是為了保證網絡傳輸的可靠性和避免因為網絡丟包或者網絡延遲而造成的問題。以下是對此過程的詳細解釋:
TIME_WAIT狀態的作用:
在TCP四次揮手中,當客戶端接收到來自服務器的FIN包并發送ACK確認后,客戶端進入TIME_WAIT狀態。
這個狀態存在的目的是確保客戶端發送的最后一個ACK包能夠到達服務器,因為TCP協議是可靠的,需要確保雙方的連接都已經被關閉。
如果客戶端發送的ACK包在網絡中丟失,服務器會因為沒有收到ACK而重傳FIN包,這時客戶端需要再次發送ACK包。
TIME_WAIT狀態的持續時間:
這個狀態通常持續的時間是2MSL(Maximum Segment Lifetime,報文最大生存時間)。在RFC 793協議中,建議的MSL時間是兩分鐘,但在實際操作系統(如Linux)中,這個時間通常被設置為30秒,因此2MSL就是60秒。
設置這樣的時間間隔是為了確保在網絡中的殘留數據包都已經過期,從而避免因為網絡延遲或丟包而引發的問題。
從TIME_WAIT到CLOSE的轉換:
當客戶端在TIME_WAIT狀態持續了2MSL時間后,如果沒有再次收到來自服務器的數據包,那么客戶端就可以安全地關閉連接,從TIME_WAIT狀態轉變為CLOSED狀態。
這個過程確保了客戶端和服務器之間的連接已經完全關閉,并且網絡中的殘留數據包不會對下一次連接造成影響。
綜上所述,客戶端在TCP四次揮手過程中從TIME_WAIT狀態到CLOSE狀態需要隔一段時間,這是為了確保網絡傳輸的可靠性,避免因為網絡丟包或延遲而引發的問題。這個時間間隔通常是2MSL,也就是60秒(在Linux系統中)。