網(wǎng)絡(luò)通訊協(xié)議-TCP/IP協(xié)議

一.?了解2個名詞及語義: "OSI 7層參考模型"和"TCP/IP協(xié)議"

????????OSI 7層參考模型之所以叫它為參考模型 ,?是因為它并沒有被實現(xiàn)出來 ,?它是軟件工程學(xué)的東西 ,?分層的目的就是為了解耦 ,?讓每層只做自己的事情 ,?別的層該做的事情交給別的層去做 ,?最終實現(xiàn)網(wǎng)絡(luò)通訊的目的(參考圖:OSI7層參考模型)?

????????TCP/IP協(xié)議是基于OSI 7層參考模型已經(jīng)實現(xiàn)的一種協(xié)議 , TCP/IP協(xié)議在最終實現(xiàn)時 ,?是把OSI 7層參考模型分成了5層 ,?這里面主要是把"應(yīng)用層","表示層","會話層"縮到了"應(yīng)用層"一起 ,?顧名思義 , "應(yīng)用層"由應(yīng)用程序來提供 ,? "傳輸控制層" , "網(wǎng)絡(luò)層" , "鏈路層" , "物理層"?這4層放到了操作系統(tǒng)的內(nèi)核里面 ,?以內(nèi)核和應(yīng)用程序劃分了2個鴻溝 ,?內(nèi)核的東西由操作系統(tǒng)提供 ,?剩下"應(yīng)用層"就需要應(yīng)用程序來提供了

? ? ? ?到這里 ,?OSI 7層參考模型和TCP/IP協(xié)議這2個名詞算是解釋清楚了 ,?OSI 7層參考模型中理論上的東西就不聊了,?比如每層該干些什么啊之類的 , 我們進(jìn)入重點(diǎn) ,?接下來聊聊已經(jīng)實現(xiàn)了的TCP/IP協(xié)議.

????????TCP/IP協(xié)議總的來說就是"應(yīng)用層","傳輸控制層","網(wǎng)絡(luò)層","鏈路層","物理層"這么些層次的分法 , 比如說"應(yīng)用層"的常見協(xié)議有HTTP協(xié)議,HTTPS協(xié)議,FTP協(xié)議,SSH協(xié)議等等這些應(yīng)用程序當(dāng)中使用到的協(xié)議 , "傳輸控制層"有TCP協(xié)議,UDP協(xié)議 , "網(wǎng)絡(luò)層"有IP協(xié)議或者是關(guān)于IP的一些協(xié)議 , "鏈路層"有ARP協(xié)議 , "物理層"就是計算機(jī)編程里面硬件上面制定的一些協(xié)議了,比如編碼解碼器之類的 , 每個層有每層自己的相關(guān)協(xié)議來規(guī)定和約束一些工作的事情 ,?層與層之間沒有重疊 ,?互相調(diào)用就可以了 ,?這就實現(xiàn)就TCP/IP協(xié)議.

? ? ? ? 到這里 ,?TCP/IP協(xié)議這個名詞的語義也解釋清楚了?

OSI7層參考模型


TCP/IP實現(xiàn)的OSI 7層參考模型

二. TCP/IP協(xié)議?之?應(yīng)用層

????????我們先不去深挖TCP/IP協(xié)議的事 , 先來說說"應(yīng)用層" ,?應(yīng)用程序使用的那些協(xié)議 ,?比如說WEB工程師最常見的"HTTP協(xié)議 , SSH協(xié)議" ,?我們先來看HTTP協(xié)議 ,?那么什么是HTTP協(xié)議啊??比如說我們的服務(wù)器和網(wǎng)址www.huangcuigang.cn的服務(wù)器請求頁面的過程就要走一個HTTP協(xié)議 ,?咱們用一個簡單的方式來演示 , 使用LINUX操作系統(tǒng) ,?這里有一些瑣碎的知識點(diǎn)和概念 ,?一定要細(xì)心的觀察演示的過程 ,?后面的東西才能聽懂 ,?比如說先演示一個大家看不懂的一個事情:

[root@iZbp19r2vmlr853x5azt4rZ ~]# exec 8<> /dev/tcp/www.huangcuigang.cn/80

這里解讀一下我們寫下的這段字符串,?

第一部分的字符串是"exec" ,?它是一個命令(exec命令) , "exec"是"execute"單詞的簡寫 ,?顧名思義 ,?就是執(zhí)行的意思? ,?這個命令簡單了解一下就行 ,?不是我們要演示的重點(diǎn) ,?簡單知道是干什么的就行 ,??

第二部分的字符串是一個數(shù)字8(這個數(shù)字可以隨便寫,不是必須為8)緊鄰著<> , "<>"是Shell 輸入/輸出重定向?,?我們這里是把輸入輸出重定向到了一個數(shù)字8上了 ,?也就是說這里的數(shù)字8可以輸入也可以輸出 ,?

第三部分的字符串是一個路徑 ,?它是一個文件目錄 ,

我們思考一下這段字符串的語義 ,?當(dāng)我們按下回車鍵時 ,?在linux系統(tǒng)中 ,?一切都是文件 ,?比如說我們的打印機(jī)可以是一個文件 ,?我們把一個東西對著這個文件寫 ,?那么打印機(jī)會把東西打印出來 ,?我們的攝像頭可以是一個文件 ,?我們讀取這個文件 ,?就會把攝像頭拍到的東西讀出來 ,

如果我們與網(wǎng)址www.huangcuigang.cn建立TCP連接 , 它的連接也是一個文件 ,?那么對著這個文件讀寫的話 ,?就造成了對網(wǎng)址www.huangcuigang.cn的TCP連接的一種輸入輸出?,?linux中一切皆文件 ,?那么這段命令的語義就是 ,?對著網(wǎng)址www.huangcuigang.cn的80端口建立一個TCP連接 ,?并用一個數(shù)字8來代表這個TCP連接 , 且這個數(shù)字8代表的TCP連接可以輸入也可以輸出 ,?

按下回車 , 終端上什么提示輸出都沒有 ,?沒提示就是最好的提示 ,?說明成功了 ,?到這里我們就創(chuàng)建好了一個數(shù)字8的TCP連接對象 ,?通過這個數(shù)字8的TCP連接對象我們可以拿到輸入流 ,?也可以拿到輸出流 ,?這個理論一定要能明白

我們要演示的是HTTP協(xié)議 , 我們都知道HTTP協(xié)議是用來發(fā)送HTTP請求的 ,?那么什么叫做HTTP協(xié)議?簡單說HTTP協(xié)議就是一個基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)所制定的規(guī)范 ,?只有發(fā)送數(shù)據(jù)方和接收數(shù)據(jù)方都遵守HTTP協(xié)議來發(fā)送數(shù)據(jù) ,?雙方才能根據(jù)HTTP協(xié)議的約定去解析出來想要的數(shù)據(jù)

我們現(xiàn)在是在服務(wù)器上去演示 , 我們要把我們自己的雙手來充當(dāng)瀏覽器的角色 ,?瀏覽器在請求一個網(wǎng)址時 ,?必須要創(chuàng)造出一個基于HTTP協(xié)議請求的文本內(nèi)容 ,?我們來用echo命令打印一下這個文本內(nèi)容 (?HTTP協(xié)議的所有約定細(xì)節(jié)這里就不細(xì)談了 ,?主要目的是演示講解 )

小知識點(diǎn) : echo?的 -e選項是激活轉(zhuǎn)義字符 ,?也就是解析\n為換行 ,?而不是把\n作為字符串打印出來

[root@iZbp19r2vmlr853x5azt4rZ ~]# echo -e "GET / HTTP/1.0\n"

GET / HTTP/1.0

[root@iZbp19r2vmlr853x5azt4rZ ~]#

我們現(xiàn)在是用echo把字符串打印到我們的終端了 ,?其實我們應(yīng)該是要把這個字符串發(fā)送到網(wǎng)址www.huangcuigang.cn的TCP連接去 ,?我們再來重新改一下我們的echo輸出 ,?使用">"輸出重定向 ,?把echo的輸出重定向到數(shù)字8 ,?數(shù)字8代表了我們的一個TCP連接 ,?但是這里的數(shù)字8其實是一個文件描述符 ,?">"輸出重定向的對象要求是一個文件 ,?而輸出重定向到文件描述符的話要用">&",?然后數(shù)字8又代表了網(wǎng)址www.huangcuigang.cn的TCP連接 ,?那么這樣 ,?這個echo輸出的內(nèi)容就寫入TCP連接對象了

按下回車 ,?我們就已經(jīng)向www.huangcuigang.cn的TCP連接對象按照HTTP協(xié)議發(fā)送了請求了 ,

[root@iZbp19r2vmlr853x5azt4rZ ~]# echo -e "GET / HTTP/1.0\n" >& 8

按照HTTP協(xié)議 ,?收到消息了就必須要返回消息 ,?我們發(fā)送給www.huangcuigang.cn的TCP連接的消息是寫入到文件描述符8了 ,?那么www.huangcuigang.cn的TCP連接的返回數(shù)據(jù)應(yīng)該也是寫入到文件描述符8了 ,?我們讀取文件描述符8的內(nèi)容就能得到返回的內(nèi)容了 ,?這里我們使用cat命令去讀取 ,?cat加上<&輸出重定向?從文件描述符讀取數(shù)據(jù) ,?敲下回車 .?

注意圖片紅色圈出來的部分命令 ,?使用cat <& 8去讀取文件描述符的內(nèi)容時 ,?是沒有任何數(shù)據(jù)的 ,?我們要注意一下這個事情 ,?這是因為我們再寫這篇文章時 ,?花的時間比較長 ,?造成TCP連接被斷開了 ,?這里的知識點(diǎn) ,?我們?nèi)绻胍o對方發(fā)送數(shù)據(jù) ,?我們就必須先與對方建立TCP連接 , TCP連接有了之后 ,?我們才能夠給對方發(fā)送數(shù)據(jù) ,?那么重點(diǎn)來了 ,?我們與對方建立了連接 ,?但是我們什么時候會給對方發(fā)送消息 ,?這是一個未知數(shù) ,?我們有可能建立連接后很快就發(fā)送了數(shù)據(jù)給對方 ,?也有可能一直不發(fā)消息給對方 ,?所以站在www.huangcuigang.cn服務(wù)器的一方去想 ,?如果別人與我們建立了連接之后 ,?就相當(dāng)于我們也創(chuàng)建了TCP連接的資源 ,?也是一個文件描述符 , 我從這個連接去讀數(shù)據(jù) ,?就是在做I/O操作 , 對方一直沒有發(fā)送數(shù)據(jù) ,?一是會造成我們的資源浪費(fèi) ,?二是一直在對文件做I/O操作也是性能浪費(fèi) ,?再者就是這有可能會造成一種阻塞狀態(tài) ,?所以才會出現(xiàn)BIO , NIO ,?多路復(fù)用等等技術(shù)的出現(xiàn) ,?所以這完全是沒有意義的事情 ,?所以才會斷開連接 ,?有興趣的朋友 ,?可以想想 ,?如果沒有超時自動斷開連接這個機(jī)制會怎么樣?? 比如我們寫一個程序 ,?使用不同的虛擬IP ,?大量的與你服務(wù)器創(chuàng)建TCP連接但是不發(fā)送數(shù)據(jù) ,?其實每臺服務(wù)器可以創(chuàng)建的連接是有限的 ,?你的服務(wù)器會怎么樣? 再好的硬件也撐不住吧.

既然TCP連接斷開了 ,?那我們再重新創(chuàng)建一個TCP連接不就OK了嗎 ,?到這里 ,?請求回了www.huangcuigang.cn域名返回的頁面數(shù)據(jù)了

這里有一張截圖 ,?上部分是www.huangcuigang.cn所在的服務(wù)器 , IP為47.111.242.7 ,?下半部分是發(fā)起請求的一方 , IP為121.196.47.141 ,?首先IP47.111.242.7使用tcpdump命令監(jiān)聽了網(wǎng)卡上與IP121.196.47.141的數(shù)據(jù)包 ,?然后IP121.196.47.141使用exec命令創(chuàng)建了一個TCP連接 ,?每一條數(shù)據(jù)前面都有時間 ,?根據(jù)時間可以看到 , 20分28秒的時候 ,?IP47.111.242.7與IP121.196.47.141完成了3次握手 ,?然后,我們什么都沒有動 ,?建立了TCP連接都也不發(fā)送數(shù)據(jù)了 ,?在29分28秒的時候 ,?www.huangcuigang.cn所在的服務(wù)器IP47.111.242.7向發(fā)起請求方IP121.196.47.141發(fā)送了數(shù)據(jù)包完成了4次分手 ,?也就斷開了連接了

TCP/IP協(xié)議?之?應(yīng)用層?的?總結(jié) :?

????????我使用HTTP協(xié)議請求服務(wù)器獲得頁面的演示 ,?核心就是HTTP協(xié)議 ,?如果我們的"GET / HTTP/1.1\n"不按照HTTP協(xié)議的這種格式去寫 ,?那么我們發(fā)送給服務(wù)器 ,?服務(wù)器當(dāng)然也能夠接收到數(shù)據(jù) ,但是服務(wù)器根本就不知道我們是想要干什么 ,?就更不會正確的返回給我們想要的數(shù)據(jù)了 ,?再比如我們自己手寫了一個xx程序 , xx程序運(yùn)行在服務(wù)器上 , 我們xx程序監(jiān)聽系統(tǒng)的1314端口 , 我們xx程序自己制定了一套xx協(xié)議 ,?xx協(xié)議規(guī)定 , 發(fā)送字符串"操作:連接xx|賬號:xxx|密碼:xxx"格式到與我們xx程序的TCP連接 ,?就代表了連接與登錄操作 ,?再有就是增刪改查等等的操作我們xx協(xié)議都有規(guī)定 ,?那么你要連接登錄我們xx程序發(fā)過來字符串為:"我要登錄 ,?我的賬號是xx ,?密碼你等等 ,?我再想想" ,?這樣的字符串我們xx程序按照xx協(xié)議去解析 ,?并不能知道你想要干什么 ,?當(dāng)然也不能給你完成連接與登錄了 ,?這就是應(yīng)用層的協(xié)議完成是事情.

三. TCP/IP協(xié)議?之?傳輸控制層

????????接著上面 ,?我們已經(jīng)知道了應(yīng)用層只是完成了各種應(yīng)用程序之間通訊的一些協(xié)議 , 創(chuàng)建好了TCP連接并拿到了輸入輸出流 ,?就搞定了 ,?至于這些數(shù)據(jù)是怎么發(fā)出去的 ,?怎么走的 ,?從那一塊網(wǎng)卡進(jìn)出的 ,?我們根本就沒有去管 ,?因為這些事情都統(tǒng)一的交給了系統(tǒng)內(nèi)核的TCP/IP協(xié)議層了 , "傳輸控制層"?就是控制數(shù)據(jù)怎么傳輸 ,?以什么方式來傳輸?shù)?,?那么?"傳輸控制層"?的協(xié)議都有哪些呢?? 常見的就有TCP協(xié)議 , UDP協(xié)議 ,?我們這里只分析TCP協(xié)議.

什么是TCP協(xié)議?

????????簡單來說,TCP協(xié)議就是網(wǎng)絡(luò)通訊協(xié)議中的一種傳輸控制協(xié)議,TCP的工作原理是將消息或文件分解成更小的片段(稱為數(shù)據(jù)包),在通過Internet發(fā)送。然后,這些數(shù)據(jù)包由另一個TCP層接收,然后將該數(shù)據(jù)重組為完整的文件或消息。TCP還負(fù)責(zé)對數(shù)據(jù)流進(jìn)行錯誤檢查,以確保數(shù)據(jù)的傳遞; 如果發(fā)現(xiàn)錯誤,則TCP重新傳輸數(shù)據(jù)包。這樣來確保不同節(jié)點(diǎn)之間的端到端數(shù)據(jù)傳輸。Internet協(xié)議提供用于傳輸數(shù)據(jù)的指令,同時TCP創(chuàng)建連接并確保將數(shù)據(jù)傳遞到正確的目標(biāo)。這兩種協(xié)議通常是協(xié)同工作的,稱為TCP / IP協(xié)議.所以 , TCP協(xié)議是面向連接的 , 可靠的傳輸控制協(xié)議

這有引發(fā)一個新的問題 ,?既然TCP協(xié)議是面向連接的 ,?那么什么是連接?

? ? ? ? 這里的連接 ,?他肯定不是通過物理的連接吧 , 所以是虛擬的連接 ,?既然是虛擬的連接 ,?那就不要糾結(jié)"連接"這個詞了 ,?我們真實的問題是 , TCP連接 , 是通過什么形式來代表的連接??這里就引出了 "3次握手和4次分手"的過程了 ,?比如客戶端和服務(wù)端想要建立連接 ,?客戶端是要向服務(wù)端發(fā)送一個sync數(shù)據(jù)包 ,?表示想建立連接 , 那么服務(wù)端收到了客戶端發(fā)送的建立連接的請求?,?也回一個sync+akc數(shù)據(jù)包給客戶端 ,?sync也代表服務(wù)器想與客戶端建立連接 ,?akc表示確認(rèn)收到了客戶端建立連接的請求 ,?這個時候 ,?才完成了2次握手 ,?服務(wù)端并不確定自己發(fā)給客戶端的sync+akc有沒有被客戶端正確的收到 ,?所以 ,?這時客戶端又給服務(wù)端回復(fù)了一個ack,表示確認(rèn)收到了 ,?這時 ,?客戶端和服務(wù)端就完成了3次握手了 , 雙方都創(chuàng)建了為對方服務(wù)的資源 ,?這就是某種意義上的連接 ,?這里的為對方服務(wù)的資源就是我們上面演示HTTP協(xié)議時創(chuàng)建TCP連接見到的輸入輸出流文件描述符 ,?服務(wù)端的消息通過這個文件可以給到客戶端 ,?那么客戶端的消息也可以通過這個文件給到服務(wù)端 ,?這不就是真正意義上的連接了嗎.

簡單回答 ,?就是經(jīng)過3次握手為對方開辟的資源 ,?就是連接.


socket

還有一個比較重要的東西 ,?一說到傳輸控制層 ,?除了上面聊的傳輸控制協(xié)議 TCP協(xié)議 , UDP協(xié)議 ,?還有一個概念叫socket ,?個人理解 ,?本質(zhì)上socket還是TCP協(xié)議 ,?但是建立連接的方式不一樣 ,?我們來通過一個命令?netstat -natp?來找找socket的感覺 ,

這里就能看明白很多東西了,?有Proto列標(biāo)識使用的協(xié)議 ,?有Recv-Q,Send-Q列標(biāo)識發(fā)送接收的序列 ,?重點(diǎn)來了 ,?local Address和Foreign Address代表了本地地址和對端的地址,都是IP:Prot ,?這就是socket的概率 , 后面還State標(biāo)識了socket狀態(tài) ,?簡單了解一下這個狀態(tài) ,?LISTEN?表示套接字正在監(jiān)聽連接[調(diào)用listen后] ,?ESTABLISHED?表示已經(jīng)3次握手 , 連接已建立 ,?CLOSE_WAIT 遠(yuǎn)程套接字已經(jīng)關(guān)閉:正在等待關(guān)閉這個套接字[被動關(guān)閉的一方收到FIN] ,?TIME_WAIT 這個套接字已經(jīng)關(guān)閉,正在等待遠(yuǎn)程套接字的關(guān)閉傳送[FIN、ACK、FIN、ACK都完畢,這是主動方的最后一個狀態(tài),在過了2MSL時間后變?yōu)镃LOSED狀態(tài)] ,?還有一些狀態(tài) ,?不在這里展開聊 , PID/Program name標(biāo)識進(jìn)程ID和進(jìn)程名稱在使用當(dāng)前socket連接

這里我們來看第3行PID為873的sshd進(jìn)程 , 它是我們現(xiàn)在遠(yuǎn)程登錄服務(wù)器所使用的一個協(xié)議在linux系統(tǒng)上的一個服務(wù)進(jìn)程 ,?它現(xiàn)在是LISTEN狀態(tài) ,?表示它是在監(jiān)聽狀態(tài) ,?然后監(jiān)聽的是22端口 ,?這個不是我們與服務(wù)器創(chuàng)建TCP連接后產(chǎn)生的 ,?它本身就一直在 , 下面還有2個sshd的socket連接進(jìn)程 , PID:8138和PID:7688 ,?我們注意看著兩個的狀態(tài) ,?都是表示已經(jīng)3次握手 , 連接已建立 ,?那是因為我們現(xiàn)在確實是起了2個連接到服務(wù)器 ,?再看?local Address和Foreign Address的值 ,?服務(wù)器本地地址一樣 ,?但是客戶端的端口不一樣了 ,?說明客戶端是2個進(jìn)程來連接了我們的服務(wù)器的22端口 ,?這個可以換例子去理解 ,?我們在使用瀏覽器去訪問網(wǎng)址www.huangcuigang.cn時 ,?可以打開多個標(biāo)簽都訪問同一個網(wǎng)址 ,?但是這些瀏覽器的標(biāo)簽其實都是不同的進(jìn)程 ,?不同的端口去與服務(wù)器建立的連接進(jìn)行通訊的 ,?這樣各自是各自的連接 ,?他們的數(shù)據(jù)才能發(fā)送到正確的端與端 .

聊到這里 ,?新的問題來了 ,?上面我們能看到 ,?服務(wù)端的22端口 ,?同時與我們的客戶端創(chuàng)建了2個TCP連接 ,?那么我們會不會有疑問 ,?同一個端口號可以創(chuàng)建的TCP連接會沒有上限 ,?如果有的話 ,?上限時多少個連接?

同一個端口號可以創(chuàng)建的TCP連接數(shù)有限制嗎?

答案是有 ,?連接數(shù)是有上限的 ,?我們可以使用ulimit -a?命令去查看一下 ,?ulimit -a是用來顯示目前資源限制的設(shè)定 ,?里面有很多 ,?我們沒必要展開都解釋 ,?我們看open files這個參數(shù) ,?值是65535 ,?代表1個進(jìn)程可以創(chuàng)建可以創(chuàng)建的文件描述符的數(shù)量 ,?換言之 ,?一個PHP程序可以創(chuàng)建變量的數(shù)量或者創(chuàng)建對象的數(shù)量 ,?一切皆文件 ,?socket也是文件 ,?用文件描述符 ,?打開真正的文件 ,?也用文件描述符 ,?打開一個設(shè)備 ,?設(shè)備被抽象成文件了也是一個文件描述符 ,?所以1個進(jìn)程可以創(chuàng)建多少個連接 ,?受這個內(nèi)核參數(shù)的約束的影響 ,?如果我們修改nginx的配置文件 ,?讓nginx一個進(jìn)程可以創(chuàng)建10萬個連接 ,?那就不好意思了 ,?沒用 ,?因為受系統(tǒng)內(nèi)核的限制 ,?一個nginx進(jìn)程只能向系統(tǒng)申請到65535個文件描述符 ,?或者說65535個TCP連接所使用的文件描述符 .?當(dāng)然我們的應(yīng)用程序雖然受限制與系統(tǒng)內(nèi)核 ,?但是系統(tǒng)內(nèi)核本身也只是一段程序 ,?所以內(nèi)核的限制值是可以改的 ,?不過65535本身已經(jīng)是最大值了

我們打印當(dāng)期進(jìn)程的fd目錄 ,?可以看到 ,?一開始只有0 ,1 ,2 ,255 ,?一個進(jìn)程必然會有0 ,1 ,2這個3個文件描述符 , 0?是標(biāo)準(zhǔn)輸入文件描述符 , 1?是標(biāo)準(zhǔn)輸出 , 2?是報錯輸出 ,?但是我孟創(chuàng)建了一個TCP連接 ,?使用8代表文件描述符后就多了一個為8的文件描述符了 ,?也就是說 ,?對于我們當(dāng)前這個進(jìn)程而言 ,?這fd目錄下最多可以有65535個文件描述符 ,?并且新打開一個SSH連接進(jìn)程 ,?去查看自己進(jìn)程的fd目錄 ,?是沒有文件描述符8的

,

所以 ,?傳輸控制層還有一個重要的東西 ,?那就是斷開連接 ,?釋放資源 ,?本身系統(tǒng)的可用連接數(shù)是有限的 ,?斷開連接就是 4?次分手的過程

TCP/IP協(xié)議?之?傳輸控制層?的?總結(jié):

? ? ? ? 我們這里分析了TCP協(xié)議 ,?對3次握手4次分手有了一個宏觀的概念 ,?傳輸控制層只創(chuàng)建了傳輸控制包 ,?重點(diǎn)在控制 ,?傳輸控制層本身也完成不了傳輸數(shù)據(jù)包給別人 ,?所以下面才有其他的層

四. TCP/IP協(xié)議?之?網(wǎng)絡(luò)層

? ? ? ? 接著上面?zhèn)鬏斂刂茖?,?傳輸控制層本身是傳輸不了數(shù)據(jù)包的 ,?數(shù)據(jù)包的傳輸還得交給網(wǎng)絡(luò)層 ,?聊到網(wǎng)絡(luò)層 , IP協(xié)議就出現(xiàn)了 ,?那么先提一個問題 ,

IP是干什么的 , IP是為了解決什么問題的 ??

IP是用來尋址的 , 解決端到端的問題的 ,?互聯(lián)網(wǎng)上那么多計算機(jī) ,?沒有IP誰能知道數(shù)據(jù)要怎么傳輸什么地址去?

IP地址,掩碼,網(wǎng)關(guān)分別的作用?

IP地址里面包含兩個東西 ,?一個叫做"網(wǎng)絡(luò)號" ,?一個叫做"主機(jī)號","網(wǎng)絡(luò)號"用于定位到區(qū)域,也就是我們常說的局域網(wǎng)" , "主機(jī)號"用于定位到局域網(wǎng)的主機(jī) ,?在一段IP地址中怎么去區(qū)分哪些是代表"網(wǎng)絡(luò)"的 ,?哪些是代表"主機(jī)"的 ??這就跟我們的掩碼有關(guān)系了 ,?一說算法就知道了 , IP地址是點(diǎn)分字節(jié) ,?點(diǎn)分字節(jié)就是兩點(diǎn)之間放的是一個字節(jié)可以表示的10進(jìn)制數(shù) , 1個字節(jié)由8個2進(jìn)制位組成 ,?這8個2進(jìn)制位從全0到全1的演變過程 ,?它能表示的10進(jìn)制的數(shù)的范圍是0到255 ,?那么我們來看掩碼的特征"255.255.255.0" , "255"這個字節(jié)為全1,"0"這個字節(jié)為全0 ,?我們的IP地址"192.168.0.100"的每個點(diǎn)分字節(jié)也是代表了某種0和1的二進(jìn)制組合 ,?那么掩碼和ip做的事情就是 ,?用IP地址和掩碼做二進(jìn)制的"按位與運(yùn)算"后會得到一個數(shù) ,?切割后產(chǎn)生網(wǎng)絡(luò)號和主機(jī)號 ,?也就是我們的IP地址.

那么網(wǎng)關(guān)是起到什么作用呢??互聯(lián)網(wǎng)中有很多的計算機(jī) ,?那么每個計算機(jī)訪問到另一個計算機(jī)就需要有網(wǎng)關(guān)作為一個橋梁來連接了 ,?這里面有一個機(jī)制叫做"下一跳"機(jī)制 ,?英文原文叫"Nxet dump" ,?我們訪問本機(jī)電腦訪問網(wǎng)址www.huangcuigang.cn ,?在IP尋址時 ,?通過網(wǎng)關(guān)發(fā)現(xiàn)網(wǎng)址的IP地址不是我們同一個網(wǎng)關(guān)內(nèi)的設(shè)備 , "下一跳"到網(wǎng)關(guān)的上級網(wǎng)關(guān) ,?比如是路由器 ,?路由器的網(wǎng)關(guān)尋址發(fā)現(xiàn)也不是同一個路由器下的設(shè)備 ,?又"下一跳"到路由器服務(wù)商的網(wǎng)關(guān)去找 ,?就這樣直到找到為止 ,?所以叫"下一跳"機(jī)制

我們來看一個有意思的東西 ,?使用route -n命令查看機(jī)器的如有表 ,?這里面有des描述 ,?有Gateway網(wǎng)關(guān) ,?還有Genmask掩碼 ,?這里有3條配置 , 當(dāng)我們ping?www.huangcuigang.cn時 ,?網(wǎng)絡(luò)會從DNS去解析回IP地址是47.111.242.7,這個IP使用路由表的那一條數(shù)據(jù)的掩碼能匹配上??我們不會用二進(jìn)制按位與的算法就看des描述字段就行 ,?能與誰匹配上 ??很明顯169.254.0.0和172.16.48.0都匹配不上 ,?所有IP地址使用掩碼0做二進(jìn)制按位與運(yùn)算后都為0 ,?所以能匹配上第1條路由配置 ,?那么就得到了下一跳的網(wǎng)關(guān)地址172.16.63.253 , ping?www.huangcuigang.cn這個網(wǎng)絡(luò)請求的數(shù)據(jù)包就給到下一跳的網(wǎng)關(guān)地址172.16.63.253去處理了


TCP/IP協(xié)議?之?網(wǎng)絡(luò)層?的?總結(jié):

網(wǎng)絡(luò)層的主要工作就是用來完成下一跳機(jī)制的 ,?訪問本機(jī)局域網(wǎng)的IP地址時 ,?根據(jù)子網(wǎng)掩碼可以匹配出路由規(guī)則 ,?網(wǎng)關(guān)地址為0.0.0.0 ,?則代表不需要下一跳網(wǎng)關(guān) ,?就在本機(jī)局域網(wǎng)內(nèi)尋找主機(jī)即可 ,?如果訪問的IP地址為外網(wǎng)地址,?那么根據(jù)路由配置只能使用子網(wǎng)掩碼0.0.0.0做二進(jìn)制按位與運(yùn)算后匹配上 ,?并且得到下一跳網(wǎng)關(guān)地址 .?數(shù)據(jù)包交給下一跳網(wǎng)關(guān) ,?進(jìn)入鏈路層的工作來完成數(shù)據(jù)包在各個網(wǎng)關(guān)中跳來跳去并正確的到達(dá)正確的主機(jī)

五. TCP/IP協(xié)議?之?鏈路層

? ? ? ? 鏈路層的鏈字就比較有意思了 ,?因為它是一個一個的節(jié)點(diǎn)鏈起來的 ,?所以才能這個點(diǎn)不行就跳到下一個點(diǎn)去 , 每層都有協(xié)議 ,?鏈路層有個ARP協(xié)議?,?簡單來說 ,?就是我們通過ARP協(xié)議 ,?把要訪問的IP地址廣播出去 ,?局域網(wǎng)內(nèi)相同IP地址的主機(jī)收到廣播后回復(fù)消息 ,?然后就找到了對應(yīng)的主機(jī)了 ,?舉個例子 ,?我們當(dāng)前主機(jī)去訪問www.huangcuigang.cn ,?請求的數(shù)據(jù)包下一跳到了網(wǎng)關(guān)100.xxx.xxx.100 ,?網(wǎng)關(guān)100.xxx.xxx.100?中還是根據(jù)IP地址子網(wǎng)掩碼去匹配 ,?匹配不上繼續(xù)把數(shù)據(jù)包下一跳給下一個網(wǎng)關(guān)101.xxx.xxx.100 ,?根據(jù)IP地址和子網(wǎng)掩碼能匹配上 ,?說明IP地址已經(jīng)找到了對應(yīng)的局域網(wǎng)了 ,?我們根據(jù)ARP協(xié)議再廣播一個www.huangcuigang.cn的IP地址101.xxx.xxx.200 ,?局域網(wǎng)內(nèi)101.xxx.xxx.200收到消息后立即回復(fù)一個消息 ,?就正確的找到www.huangcuigang.cn的所在主機(jī)了

到這里了 ,?我們總的來理一下邏輯 ,?想要把一個請求頭發(fā)出去 , 要做的那些事情 ,?應(yīng)用層根據(jù)HTTP協(xié)議去封裝請求的數(shù)據(jù) ,?傳輸控制層要建立TCP連接 ,?建立TCP連接的時候就要先發(fā)送第1次握手的包 ,?發(fā)送第1次握手的包就要走網(wǎng)絡(luò)層找路由條目的下一跳網(wǎng)關(guān) ,?找到路由條目的下一跳地址后還得去看鏈路層有沒有下一跳網(wǎng)關(guān)地址的網(wǎng)卡硬件地址 ,?沒有的話還要觸發(fā)ARP協(xié)議去請求回來 ,? 最終到"物理層"那些電啊光啊的硬件的東西了 ,?這樣第1次握手的包才能到達(dá)目標(biāo)地址 ,?反反復(fù)復(fù)的這樣才能建立3次握手建立TCP連接

附學(xué)習(xí)視頻地址:https://www.bilibili.com/video/BV1ai4y1s7sG?p=14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容