五分鐘讀懂TCP 協議 TCP協議簡介

2021-10-10 18:19:53 字數 2968 閱讀 1408

tcp 是網際網路核心協議之一,本文介紹它的基礎知識。

一、tcp 協議的作用

網際網路由一整套協議構成。tcp 只是其中的一層,有著自己的分工。

這裡寫描述

(說明:tcp 是乙太網協議和 ip 協議的上層協議,也是應用層協議的下層協議。)

最底層的乙太網協議(ethernet)規定了電子訊號如何組成資料報(packet),解決了子網內部的點對點通訊。

這裡寫描述

(說明:ip 協議可以連線多個區域網。)

ip 協議定義了一套自己的位址規則,稱為 ip 位址。它實現了路由功能,允許某個區域網的 a 主機,向另乙個區域網的 b 主機傳送訊息。

這裡寫描述

(說明:路由器就是基於 ip 協議。區域網之間要靠路由器連線。)

路由的原理很簡單。市場上所有的路由器,背後都有很多網口,要接入多根網線。路由器內部有一張路由表,規定了 a 段 ip 位址走出口一,b 段位址走出口二,……通過這套」指路牌」,實現了資料報的**。

這裡寫描述

說明:本機的路由表註明了不同 ip 目的地的資料報,要傳送到哪乙個網口(inte***ce)。)

ip 協議只是乙個位址協議,並不保證資料報的完整。如果路由器丟包(比如快取滿了,新進來的資料報就會丟失),就需要發現丟了哪乙個包,以及如何重新傳送這個包。這就要依靠 tcp 協議。

簡單說,tcp 協議的作用是,保證資料通訊的完整性和可靠性,防止丟包。

二、tcp 資料報的大小

乙太網資料報(packet)的大小是固定的,最初是1518位元組,後來增加到1522位元組。其中, 1500 位元組是負載(payload),22位元組是頭資訊(head)。

ip 資料報在乙太網資料報的負載裡面,它也有自己的頭資訊,最少需要20位元組,所以 ip 資料報的負載最多為1480位元組。

這裡寫描述

(說明:ip 資料報在乙太網資料報裡面,tcp 資料報在 ip 資料報裡面。)

tcp 資料報在 ip 資料報的負載裡面。它的頭資訊最少也需要20位元組,因此 tcp 資料報的最大負載是 1480 - 20 = 1460 位元組。由於 ip 和 tcp 協議往往有額外的頭資訊,所以 tcp 負載實際為1400位元組左右。

因此,一條1500位元組的資訊需要兩個 tcp 資料報。http/2 協議的一大改進, 就是壓縮 http 協議的頭資訊,使得乙個 http 請求可以放在乙個 tcp 資料報裡面,而不是分成多個,這樣就提高了速度。

這裡寫描述

(說明:乙太網資料報的負載是1500位元組,tcp 資料報的負載在1400位元組左右。)

三、tcp 資料報的編號(seq)

乙個包1400位元組,那麼一次性傳送大量資料,就必須分成多個包。比如,乙個 10mb 的檔案,需要傳送7100多個包。

傳送的時候,tcp 協議為每個包編號(sequence number,簡稱 seq),以便接收的一方按照順序還原。萬一發生丟包,也可以知道丟失的是哪乙個包。

第乙個包的編號是乙個隨機數。為了便於理解,這裡就把它稱為1號包。假定這個包的負載長度是100位元組,那麼可以推算出下乙個包的編號應該是101。這就是說,每個資料報都可以得到兩個編號:自身的編號,以及下乙個包的編號。接收方由此知道,應該按照什麼順序將它們還原成原始檔案。

這裡寫描述

(說明:當前包的編號是45943,下乙個資料報的編號是46183,由此可知,這個包的負載是240位元組。)

四、tcp 資料報的組裝

收到 tcp 資料報以後,組裝還原是作業系統完成的。應用程式不會直接處理 tcp 資料報。

對於應用程式來說,不用關心資料通訊的細節。除非線路異常,收到的總是完整的資料。應用程式需要的資料放在 tcp 資料報裡面,有自己的格式(比如 http 協議)。

tcp 並沒有提供任何機制,表示原始檔案的大小,這由應用層的協議來規定。比如,http 協議就有乙個頭資訊content-length,表示資訊體的大小。對於作業系統來說,就是持續地接收 tcp 資料報,將它們按照順序組裝好,乙個包都不少。

作業系統不會去處理 tcp 資料報裡面的資料。一旦組裝好 tcp 資料報,就把它們轉交給應用程式。tcp 資料報裡面有乙個埠(port)引數,就是用來指定轉交給監聽該埠的應用程式。

這裡寫描述

接收方的接收視窗的剩餘容量12

3傳送方有了這兩個資訊,再加上自己已經發出的資料報的最新編號,就會推測出接收方大概的接收速度,從而降低或增加傳送速率。這被稱為」傳送視窗」,這個視窗的大小是可變的。

這裡寫描述

(說明:每個 ack 都帶有下乙個資料報的編號,以及接收視窗的剩餘容量。雙方都會傳送 ack。)

注意,由於 tcp 通訊是雙向的,所以雙方都需要傳送 ack。兩方的視窗大小,很可能是不一樣的。而且 ack 只是很簡單的幾個字段,通常與資料合併在乙個資料報裡面傳送。

這裡寫描述

說明:上圖一共4次通訊。第一次通訊,a 主機發給b 主機的資料報編號是1,長度是100位元組,因此第二次通訊 b 主機的 ack 編號是 1 + 100 = 101,第三次通訊 a 主機的資料報編號也是 101。同理,第二次通訊 b 主機發給 a 主機的資料報編號是1,長度是200位元組,因此第三次通訊 a 主機的 ack 是201,第四次通訊 b 主機的資料報編號也是201。)

即使對於頻寬很大、線路很好的連線,tcp 也總是從10個資料報開始慢慢試,過了一段時間以後,才達到最高的傳輸速率。這就是 tcp 的慢啟動。

六、資料報的遺失處理

tcp 協議可以保證資料通訊的完整性,這是怎麼做到的?

前面說過,每乙個資料報都帶有下乙個資料報的編號。如果下乙個資料報沒有收到,那麼 ack 的編號就不會發生變化。

舉例來說,現在收到了4號包,但是沒有收到5號包。ack 就會記錄,期待收到5號包。過了一段時間,5號包收到了,那麼下一輪 ack 會更新編號。如果5號包還是沒收到,但是收到了6號包或7號包,那麼 ack 裡面的編號不會變化,總是顯示5號包。這會導致大量重複內容的 ack。

如果傳送方發現收到三個連續的重複 ack,或者超時了還沒有收到任何 ack,就會確認丟包,即5號包遺失了,從而再次傳送這個包。通過這種機制,tcp 保證了不會有資料報丟失。

這裡寫描述

一分鐘讀懂RPC協議

rpc是remote procedure call protoclo,稱為遠端過程呼叫協議,是一種通過網路從遠端電腦程式上請求服務,而不需要了解底層網路技術的協議。該協議允許執行於一台計算機的程式呼叫另一台計算機的程式。程式設計師無需編為網路互動功能編碼。主要功能是讓構建分布式計算 應用 更容易,在...

言簡意賅3分鐘看懂TCP三次握手協議

時隔半年多 再更一篇tcp三次握手協議的內容 經典面試題 為啥tcp是三次握手 three way handshake 而不是兩次 四次呢?2021 9 22 當然 3分鐘看懂還是有點困難 本來說的也不是很清楚qaq 我只是個標題黨而已 我只是希望大家能點進來康康嘿嘿 當然啦 我也會盡力地用言簡意賅...

五分鐘讀懂UML詳解

平時閱讀一些遠嗎分析類文章或是設計應用架構時沒少與uml類圖打交道。實際上,uml類圖中最常用到的元素五分鐘就能掌握,下面趕緊來一起認識一下它吧 一 類的屬性的表示方式 在uml類圖中,類使用包含類名 屬性 field 和方法 method 且帶有分割線的矩形來表示,比如下圖表示乙個employee...