理論 | 三天兩夜,萬字長文,吃透TCP/IP

這是小小的本周第二篇,在本周的第二篇里,將會用長文講解TCP和IP的理論相關(guān)知識。用于進(jìn)行詳解。
這是小小本周的第二篇
思維導(dǎo)圖
思維導(dǎo)圖如下
計(jì)算機(jī)體系網(wǎng)絡(luò)結(jié)構(gòu)分層
概述
這里進(jìn)行概述如下
物理層
物理層上傳送的單位為比特,規(guī)定了網(wǎng)絡(luò)的一些電器特定,主要負(fù)責(zé)0,1比特流與電子信號之間的轉(zhuǎn)換,如果沒有物理層,0,1 構(gòu)成的比特流將會無法在物理介質(zhì)中傳播。
鏈路層
數(shù)據(jù)鏈路層,又稱作為鏈路層,單純的0和1是沒有任何意義的,必須規(guī)定其解讀方式,多少個(gè)電信號算一組,每個(gè)電信號又有什么意義,這就是數(shù)據(jù)鏈路層的作用,數(shù)據(jù)鏈路層,規(guī)定主要有三個(gè)功能,分別是封裝成幀、透明傳輸、差錯(cuò)控制。將會依次解釋這三個(gè)內(nèi)容。
封裝成幀
在一段數(shù)據(jù)的前后分別添加首部和尾部,來對幀與幀之間實(shí)現(xiàn)一個(gè)定界。定界如下
透明傳輸
由于不管什么數(shù)據(jù),所傳送的都應(yīng)該能在鏈路上傳送,因此透明傳輸會帶來一個(gè)問題,當(dāng)數(shù)據(jù)中的比特組合恰好一致的時(shí)候,如果采用不適當(dāng)?shù)拇胧?,將會造成?shù)據(jù)被切分。如下圖所示。
這里使用字節(jié)填充法實(shí)現(xiàn)透明傳輸?shù)膯栴},發(fā)送端的數(shù)據(jù)在鏈路層中出現(xiàn)控制字符SOH或者ETO的時(shí)候,在前面添加一個(gè)轉(zhuǎn)義字符ESC,如果ESC也出現(xiàn)的話,這里就在ESC之前繼續(xù)添加一個(gè)ESC實(shí)現(xiàn)轉(zhuǎn)義,如下所示。
差錯(cuò)控制
在數(shù)據(jù)傳輸?shù)倪^程中,如果出現(xiàn)丟失,或者幀損壞,這里就需要差錯(cuò)控制來進(jìn)行檢測和糾正,這個(gè)協(xié)議將會在網(wǎng)絡(luò)層中進(jìn)行說明。
MAC地址
數(shù)據(jù)幀準(zhǔn)備好了,這里還有一個(gè)問題,計(jì)算機(jī)A和計(jì)算機(jī)B之間數(shù)據(jù)相互發(fā)送,但是誰傳給誰,如何區(qū)分,這里MAC地址便出現(xiàn)了。MAC地址,連人網(wǎng)絡(luò)的每一個(gè)計(jì)算機(jī)都會有網(wǎng)卡接口,每一個(gè)網(wǎng)卡都會有一個(gè)唯一的地址,這個(gè)地址稱作為MAC地址,計(jì)算機(jī)網(wǎng)絡(luò)之間相互傳送的時(shí)候,都會使用MAC地址進(jìn)行相互的傳送。
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層的主要功能負(fù)責(zé)不同網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)數(shù)據(jù),實(shí)現(xiàn)這個(gè)功能的,為路由器。
如果你在杭州的計(jì)算機(jī)A要給紐約的計(jì)算機(jī)B通信,這里就會使用廣播方式發(fā)送數(shù)據(jù)包,然后對比MAC地址,相同的接收,不同的丟棄,很明顯,這樣相當(dāng)?shù)牟缓湍?,所以在網(wǎng)絡(luò)層中,劃分了子網(wǎng),協(xié)議規(guī)定,假如是在同一個(gè)子網(wǎng),就會使用廣播的形式把數(shù)據(jù)發(fā)送給對方,如果不是在同一個(gè)子網(wǎng),將會發(fā)送給網(wǎng)關(guān),然后進(jìn)行轉(zhuǎn)發(fā)。
傳輸層
通過網(wǎng)絡(luò)層,A已經(jīng)發(fā)送到了B,在這里就有了傳輸層,傳輸層的主要作用,為互相通信的應(yīng)用進(jìn)程,提供數(shù)據(jù)傳輸服務(wù),當(dāng)計(jì)算機(jī)A與計(jì)算機(jī)B通信時(shí),在傳輸層上,還需要指定一個(gè)端口,來給特定的應(yīng)用程序,即,傳輸層功能是建立端口到端口的通信,相比網(wǎng)絡(luò)層的功能是建立主機(jī)到主機(jī)的通信。
在傳輸層中,主要使用TCP/UDP協(xié)議。
TCP 傳輸控制協(xié)議,在數(shù)據(jù)傳輸?shù)臅r(shí)候,會建立會話,同時(shí)會把需要傳輸?shù)奈募M(jìn)行分段,提供可靠傳輸和流量控制,例如下載視頻,當(dāng)數(shù)據(jù)較大的時(shí),用的是TCP協(xié)議。
UDP 協(xié)議,一個(gè)數(shù)據(jù)包就能完成數(shù)據(jù)通信,也就是說不需要建立會話,不需要流量控制,同時(shí)也是不可靠傳輸,例如DNS域名解析,屏幕廣播,這里使用的就是UDP協(xié)議。
應(yīng)用層
當(dāng)數(shù)據(jù)傳輸?shù)搅藗鬏攲拥臄?shù)據(jù)之后,接下來需要解讀,因?yàn)榛ヂ?lián)網(wǎng)開放式的,應(yīng)用層作用規(guī)定應(yīng)用的數(shù)據(jù)格式,例如TCP協(xié)議可以傳輸Email,WWW,F(xiàn)TP等,這些協(xié)議的數(shù)據(jù)格式。例如域名的DNS,萬維網(wǎng)的HTTP協(xié)議,電子郵件的SMTP協(xié)議等等。這些數(shù)據(jù)單元稱之為報(bào)文。
TCP/IP基礎(chǔ)
具體含義
TCP/IP這里指的是一些協(xié)議群,具體來說,這里指的是IP或者ICMP,TCP,UDP,F(xiàn)TP等,這些協(xié)議,以及HTTP等的TCP/IP協(xié)議,等等這些協(xié)議都統(tǒng)統(tǒng)稱之為TCP/IP網(wǎng)際協(xié)議群。在互聯(lián)網(wǎng)進(jìn)行通信的時(shí)候,需要相應(yīng)的網(wǎng)絡(luò)協(xié)議,TCP/IP原本就是為互聯(lián)網(wǎng)開發(fā)定制的協(xié)議,這里互聯(lián)網(wǎng)協(xié)議就是TCP/IP,TCP/IP就是互聯(lián)網(wǎng)的一些協(xié)議。這里協(xié)議如下圖所示
基本工作原理
TCP/IP模型有四層,分別是應(yīng)用層,網(wǎng)際層,網(wǎng)絡(luò)接口層,這四層,每層分別具有不同的功能,TCP/IP協(xié)議協(xié)議是一組在不同層上的多個(gè)協(xié)議的組合,每層在實(shí)現(xiàn)自身的情況下直接提供服務(wù),同時(shí)也為上層提供服務(wù)其圖示如下
進(jìn)行封裝和拆解的過程如下圖
在這里,將會加入相關(guān)的數(shù)據(jù)報(bào),以及相關(guān)的數(shù)據(jù)信息,達(dá)到傳送數(shù)據(jù)的目的。
數(shù)據(jù)包
在這里,指的是TCP/IP協(xié)議數(shù)據(jù)通信中的數(shù)據(jù)單位,即,數(shù)據(jù)包, 即,從最上層,一層層的封裝,直到網(wǎng)絡(luò)層,最后借由數(shù)據(jù)鏈路層發(fā)送的數(shù)據(jù)單元。即。數(shù)據(jù)包為一個(gè)完整的數(shù)據(jù)單元,如果超過了MTU,這個(gè)時(shí)候,會和多個(gè)幀組合在一起,然后形成一個(gè)完整的數(shù)據(jù)包。
數(shù)據(jù)包的分層如下

在網(wǎng)絡(luò)傳輸中,數(shù)據(jù)包由兩個(gè)部分組成,一個(gè)是協(xié)議所需要用的首部,另一部分是上一層傳過啦的數(shù)據(jù),首部的結(jié)構(gòu)由協(xié)議的具體規(guī)范進(jìn)行定義,在數(shù)據(jù)包的首部,明確標(biāo)明了協(xié)議應(yīng)該如何讀取數(shù)據(jù),即,看到首部,就能明確的直到該協(xié)議所需要的信息和所需要處理的數(shù)據(jù)。
傳輸中和TCP和UDP
端口
端口,英語為port,稱之為連接端口,端口,協(xié)議端口, 位于傳輸層的通信協(xié)議通常需要指定端口號,例如在TCP/IP協(xié)議族之下的TCP與UDP協(xié)議。在應(yīng)用層中,使用主從式架構(gòu)的通信協(xié)議,在每個(gè)端口上提供多路復(fù)用服務(wù)(multiplexing service)。經(jīng)由公認(rèn)端口號(well-known port numbers),通??梢员嬲J(rèn)出這個(gè)連線使用的通信協(xié)議,其中具代表性的是最基礎(chǔ)的1024個(gè)公認(rèn)端口號(well-known port numbers),例如Telnet協(xié)議默認(rèn)使用23端口來連線,Secure Shell協(xié)議默認(rèn)使用22端口,HTTP協(xié)議默認(rèn)使用80端口,HTTPS協(xié)議默認(rèn)使用443端口。
源端口號
源端口號一般是由系統(tǒng)自己動態(tài)生成的一個(gè)從1024-65535的號碼,當(dāng)一臺計(jì)算機(jī)A通過網(wǎng)絡(luò)訪問計(jì)算機(jī)B時(shí),如果它需要對方返回?cái)?shù)據(jù)的話,它也會隨機(jī)創(chuàng)建一個(gè)大于1023的端口,告訴B返回?cái)?shù)據(jù)時(shí)把數(shù)據(jù)送到自己的哪個(gè)端口,然后軟件開始偵聽這個(gè)端口,等待數(shù)據(jù)返回。而B收到數(shù)據(jù)后會讀取數(shù)據(jù)包的源端口號和目的端口號,然后記錄下來,當(dāng)軟件創(chuàng)建了要返回的數(shù)據(jù)后就把原來數(shù)據(jù)包中的原端口號作為目的端口號,而把自己的端口號作為原端口號,也就是說把收到的數(shù)據(jù)包中的原和目的反過來,然后再送回A,A再重復(fù)這個(gè)過程如此反復(fù)直到數(shù)據(jù)傳輸完成。當(dāng)數(shù)據(jù)全部傳輸完A就把源端口釋放出來,所以同一個(gè)軟件每次傳輸數(shù)據(jù)時(shí)不一定是同一個(gè)源端口號。
UDP

UDP全稱為用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡單的面向數(shù)據(jù)報(bào)的通信協(xié)議,位于OSI模型的傳輸層,UDP為不可靠傳輸,
具有以下幾個(gè)特點(diǎn)
面向無連接 UDP不需要和TCP一樣在數(shù)據(jù)發(fā)送前進(jìn)行三次握手進(jìn)行連接,只是數(shù)據(jù)的搬運(yùn)工,不會對數(shù)據(jù)進(jìn)行相關(guān)的處理。具體來說, 在發(fā)送端,應(yīng)用層把數(shù)據(jù)傳輸為UDP協(xié)議,UDP只會給數(shù)據(jù)增加一個(gè)UDP頭標(biāo)識標(biāo)識是UDP協(xié)議。在接收端,網(wǎng)絡(luò)層把數(shù)據(jù)傳送給傳輸層,不會做任何的拼接操作。
功能點(diǎn)
具有單播,多播,廣播等功能。
面向報(bào)文
UDP是面向報(bào)文的,既不合并,也不拆分,因此應(yīng)用程序需要選擇合適的報(bào)文,進(jìn)行發(fā)送。
不可靠性
UDP回發(fā)生數(shù)據(jù)的丟失,由于沒有相關(guān)的數(shù)據(jù)的確認(rèn)過程。
傳輸效率高
由于頭部開銷小,傳輸數(shù)據(jù)的時(shí)候報(bào)文效率相當(dāng)?shù)母摺?/p>
TCP
當(dāng)一臺計(jì)算機(jī)與另一臺計(jì)算機(jī)通信的時(shí)候,兩臺計(jì)算機(jī)需要通信暢通,并且可靠,這樣才能保證收發(fā)數(shù)據(jù),所以就有了一個(gè)三次握手,四次揮手,實(shí)現(xiàn)數(shù)據(jù)的連接。
三次握手
第一次握手(SYN=1, seq=x):
客戶端發(fā)送一個(gè) TCP 的 SYN 標(biāo)志位置1的包,指明客戶端打算連接的服務(wù)器的端口,以及初始序號 X,保存在包頭的序列號(Sequence Number)字段里。
發(fā)送完畢后,客戶端進(jìn)入 SYN_SEND 狀態(tài)。
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即 SYN 標(biāo)志位和 ACK 標(biāo)志位均為1。服務(wù)器端選擇自己 ISN 序列號,放到 Seq 域里,同時(shí)將確認(rèn)序號(Acknowledgement Number)設(shè)置為客戶的 ISN 加1,即X+1。發(fā)送完畢后,服務(wù)器端進(jìn)入 SYN_RCVD 狀態(tài)。
第三次握手(ACK=1,ACKnum=y+1)
客戶端再次發(fā)送確認(rèn)包(ACK),SYN 標(biāo)志位為0,ACK 標(biāo)志位為1,并且把服務(wù)器發(fā)來 ACK 的序號字段+1,放在確定字段中發(fā)送給對方,并且在數(shù)據(jù)段放寫ISN的+1
發(fā)送完畢后,客戶端進(jìn)入 ESTABLISHED 狀態(tài),當(dāng)服務(wù)器端接收到這個(gè)包時(shí),也進(jìn)入 ESTABLISHED 狀態(tài),TCP 握手結(jié)束。

四次揮手
第一次揮手(FIN=1,seq=x)
假設(shè)客戶端想要關(guān)閉連接,客戶端發(fā)送一個(gè) FIN 標(biāo)志位置為1的包,表示自己已經(jīng)沒有數(shù)據(jù)可以發(fā)送了,但是仍然可以接受數(shù)據(jù)。
發(fā)送完畢后,客戶端進(jìn)入 FIN_WAIT_1 狀態(tài)。
第二次揮手(ACK=1,ACKnum=x+1)
服務(wù)器端確認(rèn)客戶端的 FIN 包,發(fā)送一個(gè)確認(rèn)包,表明自己接受到了客戶端關(guān)閉連接的請求,但還沒有準(zhǔn)備好關(guān)閉連接。
發(fā)送完畢后,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),客戶端接收到這個(gè)確認(rèn)包之后,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接。
第三次揮手(FIN=1,seq=y)
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶端發(fā)送結(jié)束連接請求,F(xiàn)IN 置為1。
發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài),等待來自客戶端的最后一個(gè)ACK。
第四次揮手(ACK=1,ACKnum=y+1)
客戶端接收到來自服務(wù)器端的關(guān)閉請求,發(fā)送一個(gè)確認(rèn)包,并進(jìn)入 TIME_WAIT狀態(tài),等待可能出現(xiàn)的要求重傳的 ACK 包。
服務(wù)器端接收到這個(gè)確認(rèn)包之后,關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)。
客戶端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒有收到服務(wù)器端的 ACK ,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)。

推薦閱讀
1、力扣刷題插件
2、你不知道的 TypeScript 泛型(萬字長文,建議收藏)
4、immutablejs 是如何優(yōu)化我們的代碼的?
?關(guān)注加加,星標(biāo)加加~
?
如果覺得文章不錯(cuò),幫忙點(diǎn)個(gè)在看唄
