TCP協議詳解
小到基於應用層做網路開發,大到生活中無處不在的網路。我們在享受這個便利的時候,沒有人會關心它如此牢固的底層基石是如何搭建的。而這些基石中很重要的一環就是tcp協議。翻看一下“三次握手”和“四次揮手”,本以為這就是tcp了,其實不然。它僅僅解決了連線和關閉的問題,傳輸的問題才是tcp協議更重要,更難,更復雜的問題。回頭看tcp協議的原理,會發現它為了承諾上層資料傳輸的“可靠”,不知要應對多少網路中複雜多變的情況。簡單直白列舉一下:
- 怎麼保證資料都是可靠呢?---連線確認!關閉確認!收到資料確認!各種確認!!
- 因為網路或其他原因,對方收不到資料怎麼辦?--超時重試
- 網路情況千變萬化,超時時間怎麼確定?--根據RTT動態計算
- 反反覆覆,不厭其煩的重試,導致網路擁塞怎麼辦?---慢啟動,擁塞避免,快速重傳,快速恢復
- 傳送速度和接收速度不匹配怎麼辦?--滑動視窗
- 滑動視窗滑的過程中,他一直告訴我處理不過來了,不讓傳資料了怎麼辦?--ZWP
- 滑動視窗滑的過程中,他處理得慢,就理所當然的每次讓我發很少的資料,導致網路利用率很低怎麼辦?---Nagle
其中任何一個小環節,都凝聚了無數的演算法,我們沒有能力理解各個演算法的實現,但是需要了解下tcp實現者的思路歷程。
梳理完所有內容,大概可以知道:
tcp提供哪些機制保證了資料傳輸的可靠性?
tcp連線的“三次握手”和關閉的“四次揮手”流程是怎麼樣的?
tcp連線和關閉過程中,狀態是如何變化的?
tcp頭部有哪些欄位,分別用來做什麼的?
tcp的滑動視窗協議是什麼?
超時重傳的機制是什麼?
如何避免傳輸擁塞?
一. 概述
1. tcp連線的特點
- 提供面向連線的,可靠的位元組流服務
- 為上層應用層提供服務,不關心具體傳輸的內容是什麼,也不知道是二進位制流,還是ascii字元。
2. tcp的可靠性如何保證
- 分塊傳送:資料被分割成 最合適的 資料塊(UDP的資料報長度不變)
- 等待確認:通過定時器等待接收端傳送確認請求,收不到確認則重發
- 確認回覆:收到確認後傳送確認回覆(不是立即傳送,通常推遲幾分之一秒)
- 資料校驗:保持首部和資料的校驗和,檢測資料傳輸過程有無變化
- 亂序排序:接收端能重排序資料,以正確的順序交給應用端
- 重複丟棄:接收端能丟棄重複的資料包
- 流量緩衝:兩端有固定大小的緩衝區(滑動視窗),防止速度不匹配丟資料
3. tcp的首部格式
3.1 巨集觀位置

- 從應用層->傳輸層->網路層->鏈路層,每經過一次都會在報文中增加相應的首部。 ofollow,noindex">參考之前的文章http協議
- TCP資料被封裝在IP資料報中