tcp 是網際網路核心協議之一,本文介紹它的基礎知識。
網際網路由一整套協議構成。tcp 只是其中的一層,有著自己的分工。
最底層的乙太網協議(ethernet)規定了電子訊號如何組成資料報(packet),解決了子網內部的點對點通訊。
但是,乙太網協議不能解決多個區域網如何互通,這由 ip 協議解決。
ip 協議定義了一套自己的位址規則,稱為 ip 位址。它實現了路由功能,允許某個區域網的 a 主機,向另乙個區域網的 b 主機傳送訊息。
路由的原理很簡單。市場上所有的路由器,背後都有很多網口,要接入多根網線。路由器內部有一張路由表,規定了 a 段 ip 位址走出口一,b 段位址走出口二,......通過這套"指路牌",實現了資料報的**。
ip 協議只是乙個位址協議,並不保證資料報的完整。如果路由器丟包(比如快取滿了,新進來的資料報就會丟失),就需要發現丟了哪乙個包,以及如何重新傳送這個包。這就要依靠 tcp 協議。
簡單說,tcp 協議的作用是,保證資料通訊的完整性和可靠性,防止丟包。
乙太網資料報(packet)的大小是固定的,最初是1518位元組,後來增加到1522位元組。其中, 1500 位元組是負載(payload),22位元組是頭資訊(head)。
ip 資料報在乙太網資料報的負載裡面,它也有自己的頭資訊,最少需要20位元組,所以 ip 資料報的負載最多為1480位元組。
tcp 資料報在 ip 資料報的負載裡面。它的頭資訊最少也需要20位元組,因此 tcp 資料報的最大負載是 1480 - 20 = 1460 位元組。由於 ip 和 tcp 協議往往有額外的頭資訊,所以 tcp 負載實際為1400位元組左右。
因此,一條1500位元組的資訊需要兩個 tcp 資料報。http/2 協議的一大改進, 就是壓縮 http 協議的頭資訊,使得乙個 http 請求可以放在乙個 tcp 資料報裡面,而不是分成多個,這樣就提高了速度。
乙個包1400位元組,那麼一次性傳送大量資料,就必須分成多個包。比如,乙個 10mb 的檔案,需要傳送7100多個包。
傳送的時候,tcp 協議為每個包編號(sequence number,簡稱 seq),以便接收的一方按照順序還原。萬一發生丟包,也可以知道丟失的是哪乙個包。
第乙個包的編號是乙個隨機數。為了便於理解,這裡就把它稱為1號包。假定這個包的負載長度是100位元組,那麼可以推算出下乙個包的編號應該是101。這就是說,每個資料報都可以得到兩個編號:自身的編號,以及下乙個包的編號。接收方由此知道,應該按照什麼順序將它們還原成原始檔案。
收到 tcp 資料報以後,組裝還原是作業系統完成的。應用程式不會直接處理 tcp 資料報。
對於應用程式來說,不用關心資料通訊的細節。除非線路異常,收到的總是完整的資料。應用程式需要的資料放在 tcp 資料報裡面,有自己的格式(比如 http 協議)。
tcp 並沒有提供任何機制,表示原始檔案的大小,這由應用層的協議來規定。比如,http 協議就有乙個頭資訊content-length
,表示資訊體的大小。對於作業系統來說,就是持續地接收 tcp 資料報,將它們按照順序組裝好,乙個包都不少。
作業系統不會去處理 tcp 資料報裡面的資料。一旦組裝好 tcp 資料報,就把它們轉交給應用程式。tcp 資料報裡面有乙個埠(port)引數,就是用來指定轉交給監聽該埠的應用程式。
應用程式收到組裝好的原始資料,以瀏覽器為例,就會根據 http 協議的content-length
字段正確讀出一段段的資料。這也意味著,一次 tcp 通訊可以包括多個 http 通訊。
伺服器傳送資料報,當然越快越好,最好一次性全發出去。但是,發得太快,就有可能丟包。頻寬小、路由器過熱、快取溢位等許多因素都會導致丟包。線路不好的話,發得越快,丟得越多。
tcp 協議為了做到效率與可靠性的統一,設計了乙個慢啟動(slow start)機制。開始的時候,傳送得較慢,然後根據丟包的情況,調整速率:如果不丟包,就加快傳送速度;如果丟包,就降低傳送速度。
linux 核心裡面設定了(常量tcp_init_cwnd
),剛開始通訊的時候,傳送方一次性傳送10個資料報,即"傳送視窗"的大小為10。然後停下來,等待接收方的確認,再繼續傳送。
預設情況下,接收方每收到兩個 tcp 資料報,就要傳送乙個確認訊息。"確認"的英語是 acknowledgement,所以這個確認訊息就簡稱 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 保證了不會有資料報丟失。
(1)瀏覽器解析url,生成http請求(post,get等),建立套接字。
(2)dns通過網域名稱查詢ip,aer通過ip查詢mac位址
(3)路由器和交換機的區別
a.路由器是基於ip設計,交換機是基於乙太網設計。
b.交換機埠的 mac 模組不具有 mac 位址。交換機根據 mac 位址表查詢 mac 位址,然後將訊號傳送到相應的埠。 交換機收到包時, 將傳送方 mac 位址以及其輸入埠的號碼寫入mac 位址表中。 由於收到包的那個埠就連線著傳送這個包的裝置, 所以只要將這個包的傳送方 mac 位址寫入位址表, 以後當收到發往這個位址的包時, 交換機就可以將它**到正確的埠了。 交換機每次收到包時都會執行這個操作, 因此只要某個裝置傳送過網路包, 它的 mac 位址就會被記錄到位址表中。為了防止終端裝置移動到另外乙個埠產生問題, 只需要將一段時間不使用的過時記錄從位址表中刪除就可以了
c.路由器的各個埠都具有 mac 位址和 ip 位址,可作為接收方和傳送方。路由器根據「ip 位址」判斷**目標。交換機是根據mac位址判斷
(4)tcp需要響應,udp比較簡短的控制,不需要響應
TCP協議簡介
面向位元組流的含義是 雖然應用程式和tcp的互動是乙個乙個的資料塊,但是tcp把應用程式交下的資料看成僅僅是一串的無結構的位元組流。tcp並不知道所傳送的位元組流的含義。tcp不保證接收方應用程式所收到的資料塊和傳送方應用程式所發出的資料塊具有對用關係。tcp根據對方給出的視窗值和當前網路擁塞的程度...
TCP協議簡介
tcp簡介 tcp全稱為 傳輸控制協議 transmission control protocol 它為兩台主機提供可靠的資料通訊,所做的工作時把應用層交給它的資料分成合適的小塊交給下面的網路層,確認接受到的分組,設定傳送最後確認分組的超時時鐘等 1 tcp協議段格式 2 報頭資料意義 源 目的埠號...
網路基礎 TCP協議簡介
tcp協議全稱 傳輸控制協議 顧名思義,要對資料的傳輸有乙個詳細的控制。tcp協議段格式 1.16位埠號 port number 源埠號和目的埠號 2.32位序號 sequence number 第乙個 序號值被初始化為某個隨機值isn initial sequence number tcp報文是位...