適合初學者的TCP講解

2021-09-11 12:52:27 字數 1735 閱讀 1354

介紹tcp之前,應該先要讓大家了解一下tcp存在**並且有什麼作用。

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

首先,可以看到,tcp是乙太網協議和ip協議的上層協議,也是應用層的下層協議。

(簡單介紹一下乙太網協議和ip協議)

乙太網協議:

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

ip協議:

ip協議解決的就是多個區域網互相通訊,比如路由器就是基於ip協議的。

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

那麼弄清楚了這倆個協議之後好像還是不知道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來知道丟了哪個包,以及如何重新傳送這個包。

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

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

可以看到乙個包的負載時1400位元組,那麼如果現在要傳輸的是大量的資料,那這時候就得分成很多個包。

(比如,乙個 10mb 的檔案,需要傳送7100多個包。)

在進行傳送的時候,tcp協議就起作用了,它為每個包編號(sequence number,簡稱 seq),

這樣每個包都有了自己的編號後,接受的一方就可以按順序還原,就算包丟失之後也能知道是哪個包丟失了。

編號規則:

第乙個包的編號是乙個隨機的數字,比如第乙個包的編號為1,負載長度為100位元組,那麼第二個包的編號就是101,依次類推。

此時我們就可以將tcp協議的作用再補充一條:

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

當tcp協議為每個包編號完成之後,就將tcp資料報傳送出去。

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

可以看到,過程大概就是:

編寫好的資料報 -->  傳遞給作業系統 -->  作業系統按照順序組裝 -->

判斷tcp資料報中的埠號 --> 繼續傳遞給監聽埠號的那個應用程式複製**

Linux入門 適合初學者

學習linux也有一陣子了,這過程中磕磕撞撞的,遇到了問題,也解決了一些問題,學習的路子是曲折的,想總結點啥的,讓剛剛學習linux的不會望而生畏。技術的價值不在於這個技術有多麼高超,而在於技術本身給我們帶來什麼價值,所以很多時候我們學習乙個技術,不能盲目學,是為了使用這個技術,知道這個技術的使用場...

Linux入門 適合初學者

學習linux也有一陣子了,這過程中磕磕撞撞的,遇到了問題,也解決了一些問題,學習的路子是曲折的,想總結點啥的,讓剛剛學習linux的不會望而生畏。技術的價值不在於這個技術有多麼高超,而在於技術本身給我們帶來什麼價值,所以很多時候我們學習乙個技術,不能盲目學,是為了使用這個技術,知道這個技術的使用場...

Linux入門 適合初學者

linux入門 適合初學者 學習linux也有一陣子了,這過程中磕磕撞撞的,遇到了問題,也解決了一些問題,學習的路子是曲折的,想總結點啥的,讓剛剛學習linux的不會望而生畏。技術的價值不在於這個技術有多麼高超,而在於技術本身給我們帶來什麼價值,所以很多時候我們學習乙個技術,不能盲目學,是為了使用這...