適合初學者的TCP講解

前言

首先在編寫這篇文章以前呢,我想先澄清一些事情。
這篇文章是我參考阮一峯老師的《TCP協議簡介》,僅僅是把它用我本身的話闡述一遍,以便本身以及一些想了解TCP協議的讀者來理解。
有寫的很差的或者表述不清楚的地方,請各位讀者能指正出來,謝謝。緩存

1、TCP存在哪裏

介紹TCP以前,應該先要讓你們瞭解一下TCP存在哪裏而且有什麼做用。bash

用一張圖來表述可能更加實在學習

首先,能夠看到,TCP是以太網協議和IP協議的上層協議,也是應用層的下層協議。spa

(簡單介紹一下以太網協議和IP協議)操作系統

以太網協議:code

最底層的以太網協議(Ethernet)規定了電子信號如何組成數據包(packet),解決了子網內部的點對點通訊。cdn

IP協議:blog

IP協議解決的就是多個局域網互相通訊,好比路由器就是基於IP協議的。路由

(通俗一點理解就是以太網協議解決了局域網的點對點通訊,但不能解決多個局域網互相通訊,這時候就得靠IP協議來解決多個局域網互相通訊的問題)it

那麼弄清楚了這倆個協議以後好像仍是不知道TCP到底在哪裏。
別急,下面這張圖更加實在。

能夠看到,無論是IP數據包仍是TCP數據包仍是應用層數據包都包裹在以太網數據包中的。

這個最大的以太網數據包最初只有1518字節,後來增長到了1522字節。

其中有1500字節是以太網數據包的負載,而另外的22字節是頭信息。


(CRC是利用除法及餘數的原理來做錯誤偵測)

那麼因此另外的那些包數據都是存在於以太網的負載中的。

IP數據包又分爲IP標頭和IP負載,存在於以太網的負載中。
IP標頭(也就是頭信息)最少須要20字節,因此它的負載最多就是1500-20=1480字節。

TCP數據包又分爲TCP標頭和TCP負載,存在於IP數據包中。
TCP標頭(也就是頭信息)最少須要20字節,因此它的負載最多就是1480-20=1460字節。

但因爲IP和TCP協議中每每有額外的頭信息,因此最終TCP負載實際就是1400字節左右。

所以,一條1500字節的信息須要兩個 TCP 數據包。HTTP/2 協議的一大改進, 就是壓縮 HTTP 協議的頭信息,使得一個 HTTP 請求能夠放在一個 TCP 數據包裏面,而不是分紅多個,這樣就提升了速度。(原話)

經過上面的學習,咱們瞭解到了IP協議它其實只是一個地址協議,並不能保證包的完整性(也就是若是緩存滿了,新進來的包就可能會丟失等等問題)。這時候就須要TCP來知道丟了哪一個包,以及如何從新發送這個包。

總結:

  1. TCP 協議的做用是:保證數據通訊的完整性和可靠性,防止丟包。

  2. 以太網數據包的負載是1500字節,TCP 數據包的負載在1400字節左右。

2、TCP數據包的編號

能夠看到一個包的負載時1400字節,那麼若是如今要傳輸的是大量的數據,那這時候就得分紅不少個包。
(好比,一個 10MB 的文件,須要發送7100多個包。)

在進行發送的時候,TCP協議就起做用了,它爲每一個包編號(sequence number,簡稱 SEQ),
這樣每一個包都有了本身的編號後,接受的一方就能夠按順序還原,就算包丟失以後也能知道是哪一個包丟失了。

編號規則:

第一個包的編號是一個隨機的數字,好比第一個包的編號爲1,負載長度爲100字節,那麼第二個包的編號就是101,依次類推。

這就是說,每一個數據包均可以獲得兩個編號:自身的編號,以及下一個包的編號。接收方由此知道,應該按照什麼順序將它們還原成原始文件。

此時咱們就能夠將TCP協議的做用再補充一條:

將每一個要傳輸的包進行編號,保證數據通訊的完整性和可靠性,防止丟包。

3、TCP數據包的組裝

當TCP協議爲每一個包編號完成以後,就將TCP數據包發送出去。

在接收到數據包後,組裝還原是操做系統完成的。應用程序不會直接處理 TCP 數據包。


能夠看到,過程大概就是:

編寫好的數據包 -->  傳遞給操做系統 -->  操做系統按照順序組裝 -->
判斷TCP數據包中的端口號  --> 繼續傳遞給監聽端口號的那個應用程序複製代碼
相關文章
相關標籤/搜索