TCP 可靠性 = 確保快遞
不丟、不亂、不過載
機制 | 作用(快遞類比) | 防止的問題 |
---|---|---|
檢驗和 | 檢查包裹是否損壞,損壞就重新發 | 數據出錯 |
序列號 | 給每個包裹編號,按順序整理 | 亂序、重復 |
確認應答 | 每送到一件,就讓收件人簽收 | 丟失 |
滑動窗口 | 控制一次寄幾件,避免堆積 | 過載 |
超時重傳 | 快遞超時未送達,自動補發 | 丟失 |
擁塞控制 | 高峰期限流,減少派送壓力 | 網絡堵塞 |
流量控制 | 收件人快遞放不下了,暫停派送 | 過載 |
- 滑動窗口和流量控制的個人理解:
- 滑動窗口是限制某一刻的發送大小,而流量控制更像所需發送的全部流量的限制大小
- 即
- 滑動窗口 就像一條限流高速公路,最多同時允許 5 輛車行駛(窗口大小 = 5)。
- 流量控制 相當于整個高速的容量,如果總流量太大(接收端處理不過來),就會限速或關閉部分入口(縮小窗口)。
TCP 如何保證可靠性?
1?? 檢驗和:接收端檢測數據是否出錯,若有錯誤則丟棄并請求重傳。
2?? 序列號 & 確認應答:
- 序列號:保證數據按序傳輸,去重重復數據。
- 確認應答(ACK):接收方收到數據后,發送 ACK 確認,告知發送方已接收的數據范圍及下次應發送的位置。
3?? 滑動窗口:動態調整發送數據量,提高傳輸效率,防止接收端超載。
4?? 超時重傳:若發送數據超時未收到 ACK,認為丟失并重新發送,超時時間動態計算。
5?? 擁塞控制:監測網絡狀態,避免因發送速率過高導致網絡擁堵,保證數據高效傳輸。
6?? 流量控制:接收端通過窗口大小告知發送方自身處理能力,避免數據過載和丟包。
TCP 滑動窗口詳解
1. 滑動窗口是什么?
TCP 滑動窗口(Sliding Window)是一種流量控制機制,用于管理發送端和接收端的數據傳輸速率,確保高效傳輸的同時,防止接收端超載。
窗口大小指的是不需要等待確認應答包而可以繼續發送數據包的最大值。
核心作用:
- 提高傳輸效率:無需等待每個數據包的 ACK 確認才能繼續發送,而是允許發送多個數據包,提高帶寬利用率。
- 避免接收方過載:根據接收方的處理能力調整發送速率,防止數據溢出。
2. 滑動窗口的工作過程
假設發送端一次最多發送 5 個數據包,窗口大小 = 5(每個數據包用 ①②③④⑤ 表示):
1?? 初始狀態(發送窗口 = 5)
[①②③④⑤] ⑥⑦⑧⑨🔟 ... (窗口大小 = 5,最多可發送 5 個)
- 發送方先發送 ①②③④⑤,等待 ACK 確認。
2?? 收到部分 ACK(窗口右移)
?① ?② [③④⑤⑥⑦] ⑧⑨🔟 ...
- ①② 已收到 ACK,窗口向前滑動 2 位,允許發送 ⑥⑦。
3?? 持續滑動(高效傳輸)
?① ?② ?③ ?④ ?⑤ [⑥⑦⑧⑨🔟] ...
- 每次收到 ACK,窗口繼續滑動,提高傳輸效率。
3. 窗口大小如何調整?
1?? 流量控制(Flow Control)
-
接收端
調整窗口大小(rwnd
),防止緩存溢出。例如:-
緩存充足 → 窗口大 → 發送方可發送更多數據。
-
緩存快滿了 → 窗口縮小 → 發送方減少數據發送。
-
緩存滿了 → 窗口變 0 → 發送方暫停發送,等待窗口恢復。
-
2?? 擁塞控制(Congestion Control)
-
發送端
根據網絡情況調整窗口大小(cwnd
),防止網絡擁堵。例如:-
網絡暢通 →
cwnd
增加,提高發送速率。 -
檢測到丟包 →
cwnd
減小,降低發送速率。
-
TCP 擁塞控制詳細解析
四大算法:
-
慢開始(Slow Start)
-
擁塞避免(Congestion Avoidance)
-
快速重傳(Fast Retransmit)
-
快速恢復(Fast Recovery)
明確擁塞產生的基礎過程:A發送報文,B回一個ACK表示收到,循環操作
慢開始
初始階段指數增長,避免一開始就占滿帶寬,即每收到一次ACK就指數增長下一次發送報文的大小,但由此帶來的問題是,從1開始的指數增長會不會也變得很大,導致擁塞,于是引出擁塞避免
擁塞避免
為慢開始的指數增長設定一個閾值,一旦超過后,不再指數增長,而是每次+1
快速重傳
TCP 規定:當發送方連續收到 3 個重復 ACK,說明某個數據包丟失了。發送方立即重傳丟失的數據包,而不等待超時。
-
例:發送方發送 pkt1, pkt2, pkt3, pkt4。
pkt2 丟失,接收方收到 pkt3 后,發送 重復 (在很短的時間內)ACK(pkt2)。 -
發送方收到 3 個 ACK(pkt2),立即重傳 pkt2,無需等待超時。(如果沒有快速重傳機制,正常是接收方每收到pkt2,所以一直不發送pkt2的ACK導致發送方沒接到這個ACK最終超時,才進行重新發送)
快速恢復
避免慢開始,從丟包前的一半窗口大小開始,隨后采用擁塞避免算法逐步增加窗口
- 設想一下當前鏈路每次傳輸100,突然丟包,如果沒有快速恢復,則根據慢開始算法從1開始,重新增長速度,太低效,因此規定,減少窗口大小到1/2而不從1開始,即,從50開始,同時停止指數增長,每次+1,復用擁塞避免的邏輯而不使用慢開始,這就是快速恢復。
什么是 SYN洪泛攻擊?如何防范?
SYN洪泛攻擊屬于 DOS 攻擊的一種,它利用 TCP 協議缺陷,通過發送大量的半連接請求,耗費 CPU 和內存資源。
1. 什么是半連接(Half-Open Connect)
在 TCP 三次握手過程中,服務器發送 [SYN/ACK]
后(第二次握手后),進入 SYN_RECV 狀態,等待客戶端的 [ACK]
。
- 若收到
[ACK]
,連接建立。 - 若未收到,服務器會 重發
[SYN/ACK]
直至超時,占用資源。
2. SYN 攻擊原理
攻擊者偽造 大量不存在的 IP 地址,向服務器發送 [SYN]
,服務器回復 [SYN/ACK]
并等待 ACK
,但客戶端 不會響應。
- 影響:大量半連接占滿隊列,導致正常請求無法處理,甚至服務器癱瘓。
- 檢測:若服務器出現 大量 SYN_RECV 連接,且來源 IP 隨機,基本可判定為 SYN 攻擊。
3. SYN 攻擊防范
- 網絡層防護:
- 通過 防火墻/路由器 過濾異常流量。
- 限制 每個 IP 的 SYN 速率。
- TCP/IP 協議棧優化:
- 增加最大半連接數,提高抗攻擊能力。
- 縮短 SYN 超時時間,減少資源占用。
- SYN Cookies 技術:
- 在
SYN/ACK
中嵌入 特殊編碼(Cookie),不分配資源,只有客戶端回復正確的ACK
才真正建立連接。 - 特點:無需維護半連接隊列,可有效抵御 SYN 攻擊。
- 在
https://github.com/0voice