文章目錄
- 前言
- 一、IP協(xié)議
-
二、MAC幀協(xié)議
- 1.以太網(wǎng)
- 2.以太網(wǎng)幀(MAC幀)格式報頭
- 3.基于協(xié)議講解局域網(wǎng)轉(zhuǎn)發(fā)的原理
- 總結(jié)
前言
為什么經(jīng)常將TCP/IP放在一起呢?這是因為IP層的核心工作就是通過IP地址來定位主機的,具有將一個數(shù)據(jù)報從A主機跨網(wǎng)絡(luò)發(fā)送到B主機的能力,而TCP所提供的策略使IP層可靠的將一個數(shù)據(jù)報從A主機跨網(wǎng)絡(luò)發(fā)送到B主機。
網(wǎng)絡(luò)層作用:
在復(fù)雜的網(wǎng)絡(luò)環(huán)境中確定一個合適的路徑。
網(wǎng)絡(luò)層主要負責(zé)地址管理和路由選擇,例如在IP協(xié)議中,通過IP地址來標(biāo)識一臺主機,并通過路由表的方式規(guī)劃出兩臺主機之間的數(shù)據(jù)傳輸?shù)木€路(路由),路由器工作在網(wǎng)絡(luò)層。
一、IP協(xié)議
?1.路徑選擇中,目的IP非常重要,決定了我們的路徑該如何走。
?2.?ip =?目標(biāo)網(wǎng)絡(luò) +?目標(biāo)主機 (先有一個概念:ip地址被劃分為目標(biāo)網(wǎng)絡(luò)和目標(biāo)主機,ip地址是支撐我們在路上路由的。)
主機:配有ip地址? ? 路由器:配有ip地址并且可以進行路由控制? ? 節(jié)點:主機和路由器的統(tǒng)稱
1.IP的協(xié)議報頭
?我們之前說過,要學(xué)習(xí)協(xié)議首先要弄明白兩個問題:
1.如何將報頭和有效載荷分離?
2.如何交付?
?如上圖,除了數(shù)據(jù)(數(shù)據(jù)就是我們經(jīng)常說的有效載荷)都是報頭,而選項一般不關(guān)心,所以IP的標(biāo)準長度報頭是20字節(jié)。
4位首部長度:4位首部長度的基本單位是4字節(jié),表示IP報頭的總長度問題。4位首部長度在TCP的報頭中也有。既然是4位首部長度那么在0000 ~ 1111也就是【0,15】然后乘4->【0,60】
又因為標(biāo)準長度報頭是20字節(jié),所以IP數(shù)據(jù)包的報頭長度是【20,60】最小20字節(jié),最大60字節(jié),其中的40字節(jié)供IP選項使用。設(shè)4位首部長度為x,x*4 = 20,得到四位首部長度是5,二進制表示也就是0101.
16位總長度:代表了IP報文的總長度(也就是包頭和數(shù)據(jù)包),由于占用其16個比特位所以IP數(shù)據(jù)包的最大值為65536,用16位總長度減去報頭長度就是有效載荷的長度,這樣我們就將報頭和有效載荷分離了。
當(dāng)我們做到將有效載荷和報頭分離后,就該思考如何向上交付了。
8位協(xié)議:向上交付的時候如何知道自己交付的到底是TCP協(xié)議還是UDP協(xié)議呢?就是通過8位協(xié)議來控制的,所以這個字段表示IP下一步應(yīng)當(dāng)把這個數(shù)據(jù)包發(fā)往更高層的協(xié)議,如TCP為6,UDP為17.
16位首部校驗和:對整個IP報頭進行校驗,如果校驗不通過會直接將這個數(shù)據(jù)包丟棄。
8位生存空間:數(shù)據(jù)包到達目的地的最大報文跳數(shù),這個字段主要是用來防止出現(xiàn)路由循環(huán)。因為數(shù)據(jù)包會在網(wǎng)絡(luò)環(huán)境中從一個節(jié)點跳到另一個節(jié)點,每次跳都會減小生存時間,當(dāng)時間減為0還沒到目標(biāo)主機這個報文就會被丟棄。
32位源IP地址:當(dāng)報文從主機跳到路由器時,路由器怎么知道你從哪來呢?所以32位源IP地址表示發(fā)送端。
32位目的IP地址:源IP會在路由中多次改變,而目的IP只有一個,就像西游記中唐僧的最終目標(biāo)是西天,代表目的IP。在從黑風(fēng)嶺到女兒國時,源IP就變成了黑風(fēng)嶺,但是目的IP還是西天。
4位版本:一般是IPV4。
8位服務(wù)類型:一般用于實現(xiàn)QoS的要求,我們現(xiàn)在一般捕獲到的數(shù)據(jù)包中此值為一缺省值。
2.網(wǎng)段劃分
網(wǎng)段劃分是什么?為什么要網(wǎng)段劃分?怎么做網(wǎng)段劃分?
網(wǎng)段劃分就是將IP地址分為兩個部分,網(wǎng)絡(luò)號和主機號。
網(wǎng)絡(luò)號:保證相互連接的兩個網(wǎng)段具有不同的標(biāo)識。
主機號:在同一個網(wǎng)段內(nèi),主機之間具有相同的網(wǎng)絡(luò)號,但是必須有不同的主機號。
網(wǎng)段劃分可以大大提高數(shù)據(jù)包的查找和轉(zhuǎn)發(fā)效率,比如中國有23個省,如果沒有網(wǎng)段劃分那么從北京發(fā)往西安的數(shù)據(jù)包就會依次將23個省遍歷看哪個是西安,如果進行了網(wǎng)段劃分那么直接查到這個數(shù)據(jù)包是發(fā)往西安的,直接轉(zhuǎn)到西安即可。這就像大學(xué)中丟了學(xué)生證可以按照學(xué)號分辨你是哪個學(xué)院哪個專業(yè)哪個班級的。
所以互聯(lián)網(wǎng)中的每一臺主機都隸屬于某一個子網(wǎng),這是為了方便定位這個主機。這也就是為什么要有子網(wǎng)劃分。
首先IP地址有32位,我們用前8位來標(biāo)識各個國家,每個國家都有國際路由器所以每個國家內(nèi)部都有自己的一套表示方式,比如再拿8個比特位表示中國的每一個省,所以IP地址就像我們的身份證一樣。
?如上圖所示我們可以看到路由器這種設(shè)備必須至少橋接兩個子網(wǎng),所以路由器就必須既屬于網(wǎng)段1,又屬于網(wǎng)段2,而路由器也是一臺主機,既然要屬于兩個網(wǎng)段,那么就必須在每個網(wǎng)段都有一個ip地址,一般路由器的ip都是網(wǎng)段標(biāo)識.1。上圖中我們可以把一個路由器構(gòu)成的網(wǎng)絡(luò)叫子網(wǎng),當(dāng)有很多這樣的路由器并且我們把很多這樣的路由器連接起來的時候可以叫公網(wǎng)。
劃分方案CIDR
?一般在一個子網(wǎng)中,管理子網(wǎng)中IP的設(shè)備通常是路由器。目標(biāo)網(wǎng)絡(luò)和子網(wǎng)掩碼,子網(wǎng)中的主機,都會被路由器管理。目標(biāo)網(wǎng)絡(luò)和子網(wǎng)掩碼其實是在路由器內(nèi)配置的。從上圖中可以看到,網(wǎng)絡(luò)號一般IP地址與子網(wǎng)掩碼按位與后的結(jié)果,一般全0(.0)是網(wǎng)絡(luò)號,全1(.255)是廣播號.
例子一眼就能看出來,下面我們把例子2算一下:
?為什么子網(wǎng)掩碼前面24個比特位是全1呢?因為前24個比特位是網(wǎng)絡(luò)號,如果將網(wǎng)絡(luò)號都修改了那么還怎么找呢從.65~.78就是所有能使用的主機號。
特殊的IP地址
也就是說2的32次方個IP不是都是在公網(wǎng)使用的,還有一些特殊的IP地址,比如127.0.0.1就是本地環(huán)回。
IP地址的數(shù)量限制
私有IP地址和公網(wǎng)IP地址

路由

路由的過程就是通過目標(biāo)ip獲取目標(biāo)主機所在的子網(wǎng),所以在查找的時候一定會有一張路由表供我們查找,如下圖:
路由表可以使用route命令查看
如果目的IP命中了路由表, 就直接轉(zhuǎn)發(fā)即可;
?下面我們查看一下路由表:
?首先destination表示目標(biāo)網(wǎng)絡(luò),GateWay表示下一跳路由器,Genmask表示子網(wǎng)掩碼(前面說過,每一個子網(wǎng)都必須有目標(biāo)網(wǎng)絡(luò)號和匹配的子網(wǎng)掩碼),F(xiàn)lags就是標(biāo)志,U后面的G表示默認網(wǎng)關(guān)也叫缺省路由,當(dāng)目的ip在路由表查不到是就會進入缺省路由,Iface表示服務(wù)器和路由器的哪個接口連接。
這個目的地址例子不夠多,我們用一個多的例子來演示:
當(dāng)有一個數(shù)據(jù)包進入路由器后,首先拿數(shù)據(jù)包中的目的地址和路由表的第一個網(wǎng)絡(luò)號的子網(wǎng)掩碼按位與,按位與后就能確定該報文要去的目標(biāo)網(wǎng)絡(luò),假如第二個192.168.56.0就是目標(biāo)網(wǎng)絡(luò),當(dāng)我們將按位與的結(jié)果和Destination做匹配時發(fā)現(xiàn)第二個就是我們要找的目標(biāo)網(wǎng)絡(luò),這個時候直接通過eth1接口將數(shù)據(jù)包轉(zhuǎn)發(fā)到192.168.56.0這個網(wǎng)絡(luò)號的路由器,這就是我們上圖中路由中一跳的實際過程。
假如現(xiàn)在進入路由器的數(shù)據(jù)包是202.10.1.2,遍歷路由表和每個網(wǎng)絡(luò)號的子網(wǎng)掩碼按位與后發(fā)現(xiàn)都沒有匹配的網(wǎng)絡(luò)號,這個時候就會將數(shù)據(jù)包轉(zhuǎn)到default也就是默認網(wǎng)關(guān)192.168.10.1,通過eth0接口發(fā)送。
下面我們講解IP報頭中剩下的三個部分:
要了解這三個標(biāo)識,就要了解數(shù)據(jù)鏈路層,我們在路由器之間傳遞的確實是IP報文,但是在網(wǎng)線中跑的確是數(shù)據(jù)鏈路層的MAC幀,而在MAC幀協(xié)議中規(guī)定,自己的有效載荷不能超過1500字節(jié)(MTU最大傳送單元,可以修改)。而把數(shù)據(jù)包給數(shù)據(jù)鏈路層的就是IP層,也就是說IP層必須將發(fā)送給MAC幀的數(shù)據(jù)大小控制在1500字節(jié)以內(nèi),這1500字節(jié)包括IP的報頭,那么如何控制呢?實際上就是分片與組裝,將原來超過1500字節(jié)的報文經(jīng)過分片不就將每個報文控制在1500字節(jié)以內(nèi)了嗎,所以上圖中這三個部分就是支持IP的分片與組裝的,下面我們演示一下這個過程:
首先分片與組裝是由IP層協(xié)議完成的,所以TCP協(xié)議,MAC幀協(xié)議都不會關(guān)心原來的報文是否被分片,這就是IP層協(xié)議自己的行為。注意:分片與組裝不是主流!!!
下面我們根據(jù)組裝與分片的四個問題來講解上圖中三個部分的作用:
1.如何知道一個報文被分片?
2.如何識別同一個報文的分片?
3.哪個分片是第一個,哪個分片是最后一個?有沒有收全或者丟失?
4.哪個在前?哪個在后?如何正確的進行組裝?
5.怎么保證合起來的報文是正確的?
16位標(biāo)識:主機發(fā)送報文的唯一標(biāo)識,如果IP報文在向數(shù)據(jù)鏈路層發(fā)送的時候被分片了,那么每一個片的16位標(biāo)識ID都是相同的。
也就是說1個報文如果被分為3片,那么這3片報文中的16位標(biāo)識都是相同的。這就解決了第二個如何識別一個報文的分片問題。
3位標(biāo)志字段:第一位保留(保留的意思是現(xiàn)在還用不到第一位)。第二位為1表示禁止分片,這個時候如果報文長度超過MTU,則IP模塊會直接將此報文丟棄。第三位表示更多分片,比如一個報文被分了3片,第一片的第三個標(biāo)志位為1,其他標(biāo)志位為0,第二片的第三個標(biāo)志位為1其他為0,第三片的第三個標(biāo)志位為0,其他標(biāo)志位為1,第三片類似于一個結(jié)束標(biāo)記,也就是說可以知道被分片的報文的結(jié)束。也就是說第三個標(biāo)志位的意思是:如當(dāng)前報文后面還有分片,那么第三個標(biāo)志位為1,如果當(dāng)前報文就是最后一個分片,那么第三個標(biāo)志位為0作為一個結(jié)束位置。注意:被分片的每個報文前面都會加上IP報頭。
由3位標(biāo)志字段中的第三個字段可以得知一個報文是否被分片(如果第三個字段為1說明被分片),第三個字段可以得知哪個報文是分片的最后一個。
13位片偏移:分片相對于IP原始報文開始處的偏移,也可以理解為當(dāng)前分片在原IP報文中的位置,實際偏移的字節(jié)數(shù)是這個值*8得到的,因此除了最后一個報文之外,其他報文的長度必須是8的整數(shù)倍(否則報文就不連續(xù)了)。
確定分片第一個很簡單,只需要看3位標(biāo)志字段中的第三位是否為1,并且13位片偏移量為0,如果滿足第三位為1并且偏移量為0則是第一個分片。
要確定最后一個分片,只需要看3位標(biāo)志字段的第三位是否為0,并且13位片偏移量大于0.
而我們組裝這個報文也很簡單,只需要按照片偏移進行升序排序,就可以將分片的報文組裝起來。
對于第三個問題中的如何知道分片的報文收全或者丟失,實際上我們保證不了,但是組裝之后我們可以進行簡單的判斷,只需要遍歷每個報文看當(dāng)前的起始位置+自身長度是否等于下一個報文中填充的偏移量大小。
如何保證合起來的報文是正確的呢?還記得我們IP報頭中的16首部校驗和和TCP報頭中的16位首部校驗和嗎?16位首部校驗和是使用CRC校驗來鑒別頭部是否損壞的。校驗后如果發(fā)現(xiàn)報文頭部損壞則直接丟棄。
分片是不好的,因為將一個報文拆成了多個,任意一個報文丟失就會造成拼接組裝失敗。一旦組裝失敗就會重發(fā)整個報文(對于TCP來講是不知道IP如何分片的,所以重發(fā)的時候只能整個報文重新發(fā)送)。
下面我們自己分一下片:
?首先傳輸層TCP發(fā)了3000字節(jié)的報文給IP層,IP層對數(shù)據(jù)添加報頭變成3020字節(jié),然后我們以1500字節(jié)為一片進行分片,每一片都添加IP層的報頭:
?如上圖,第一次直接1500字節(jié)分片因為本身就有報頭,第二次只能拿1480字節(jié)的數(shù)據(jù),因為還有20字節(jié)作為IP報頭,第三次拿最后40字節(jié)的數(shù)據(jù),加上20字節(jié)的IP報頭是60字節(jié),最后組裝的時候去掉報頭就是1480 + 1480 +40剛好是TCP發(fā)送的3000字節(jié)的報文。
二、MAC幀協(xié)議
前面我們說過,因為IP是在網(wǎng)絡(luò)層,IP報文是在路由器中跑的,當(dāng)我們要拿目的IP去路由器中查找網(wǎng)絡(luò)號的時候就是用的IP報文,而在網(wǎng)線中傳輸是在數(shù)據(jù)鏈路層,跑的實際上是MAC幀。我們之前說過IP提供了一種從A主機跨網(wǎng)絡(luò)傳輸?shù)紹主機的能力,這個能力是通過目的IP +?子網(wǎng)劃分 +?路由來完成的,但是要把數(shù)據(jù)跨網(wǎng)絡(luò)傳輸?shù)街鳈CB,就得先將數(shù)據(jù)交給與主機A相連的下一跳主機(也叫節(jié)點),如下圖:
?主機A要想給主機B發(fā)消息,首先要將數(shù)據(jù)發(fā)送給與主機A相連的下一跳節(jié)點(路由器A),而主機A要想發(fā)送數(shù)據(jù)給路由器A的前提一定是主機A和路由器A在同一個網(wǎng)段,所以我們所看到的跨網(wǎng)絡(luò)傳輸?shù)谋举|(zhì)就是由無數(shù)個局域網(wǎng)(子網(wǎng))轉(zhuǎn)發(fā)的結(jié)果。
所以我們想要徹底理解跨網(wǎng)絡(luò)轉(zhuǎn)發(fā)就首先要理解局域網(wǎng)中報文的轉(zhuǎn)發(fā)原理,而局域網(wǎng)中兩個主機的通信就必須認識數(shù)據(jù)鏈路層的以太網(wǎng)協(xié)議。
1.以太網(wǎng)
之前我們將局域網(wǎng)的時候說過,在同一個局域網(wǎng)的主機是可以直接進行通信的,并且在同一個局域網(wǎng)的每個主機必須有自己唯一的標(biāo)識符。
2.以太網(wǎng)幀(MAC幀)格式報頭
首先MAC幀協(xié)議的報頭是用藍色圈出來的地方,分別是6位目的地址,6位源地址,2位類型,4位CRC校驗校驗碼。
前面我們說過,學(xué)習(xí)協(xié)議首先理解兩點:
1.MAC幀協(xié)議如何將報頭和有效載荷分離?
MAC幀協(xié)議采用定長策略,前14位后4位都是固定的,所以可以直接將報頭和有效載荷分離。
2.如何向上交付?
?還記得IP報頭中的8位協(xié)議嗎?8位協(xié)議可以知道上層交付的是TCP還是UDP,而我們的MAC幀協(xié)議也是這樣解決的,在報頭的2位幀協(xié)議類型中,可以確定上層交付的是什么類型。比如0800代表上層是IP數(shù)據(jù)報,其次還有ARP,RARP數(shù)據(jù)報。
還記得我們剛剛說局域網(wǎng)中的主機必須有唯一標(biāo)識嗎?我們的每個主機都有網(wǎng)卡,每張網(wǎng)卡都有唯一的一個sn碼,這個sn碼就是這個網(wǎng)卡的MAC地址,這個MAC地址在全球范圍內(nèi)具有唯一性。
那么我們?nèi)绾尾樵冏约旱膍ac地址呢?通過ifconfig命令:
?ether的翻譯就有以太的意思,后面就是MAC地址。
3.基于協(xié)議講解局域網(wǎng)轉(zhuǎn)發(fā)的原理
首先m1這個主機給m8發(fā)送了一個數(shù)據(jù),這個數(shù)據(jù)是從應(yīng)用層添加報頭再到傳輸層添加報頭在到網(wǎng)絡(luò)層IP添加報頭最后在數(shù)據(jù)鏈路層添加MAC幀報頭,然后在MAC幀的報頭中的目的地址是主機m8的MAC地址,因為從m1主機發(fā)出所以源地址是m1主機的mac地址,交付的時候上層協(xié)議為IP,所以類型是0800,這條消息發(fā)出后整個局域網(wǎng)的所有主機都會受到這條消息,但是每個主機都會對這條消息進行報頭和有效載荷的分離,拿到報頭后拿自己的MAC地址和報頭的MAC地址對比,如果是發(fā)給自己的就將有效載荷向上交付,如果不是自己的則直接會被丟棄,而上層是不知道主機收到了這條消息并且將消息丟棄的。
?當(dāng)m8主機收到m1主機發(fā)來的消息后,然后給m1主機響應(yīng),期間也是從應(yīng)用層到數(shù)據(jù)鏈路層封裝最后變成一個MAC幀,只不過MAC幀中的目的地址變成了m1,源地址變成了m8(因為是從m8主機發(fā)出),消息發(fā)出后同樣局域網(wǎng)內(nèi)的每個主機都會收到m8主機發(fā)送給m1主機的響應(yīng),但是最后只有m1主機保留這條消息。
?明白了上面的原理我們應(yīng)該可以認識到局域網(wǎng)本質(zhì)實際上就是臨界資源,?這個資源是被所有局域網(wǎng)內(nèi)的主機共享的,而在局域網(wǎng)中,任何時刻只允許一個主機發(fā)送消息,如果多個消息被同時發(fā)送,就會導(dǎo)致局域網(wǎng)內(nèi)的數(shù)據(jù)發(fā)生碰撞。所以一個局域網(wǎng)就是一個碰撞域。那么如何讓任何時刻只允許一個主機發(fā)送消息呢?這就要看網(wǎng)絡(luò)策略的實現(xiàn)了,比如令牌環(huán)網(wǎng)中在一個局域網(wǎng)內(nèi)只有獲得令牌的主機才能發(fā)送消息,這就像鎖一樣。而以太網(wǎng)是依靠主機的碰撞檢測和碰撞避免算法來實現(xiàn)的,并且由于光電傳播非??焖砸粋€時刻產(chǎn)生碰撞的概率并不高,除非一個局域網(wǎng)內(nèi)的主機非常多,但是我們學(xué)局域網(wǎng)都知道一個局域網(wǎng)內(nèi)的主機并不會很多,這就像家里的WiFi,如果很多人連接使用就會很卡,只有兩三個人用就不擔(dān)心卡頓問題。
當(dāng)然解決碰撞問題還有一個有效的辦法就是交換機:
文章來源:http://www.zghlxwxcb.cn/news/detail-648007.html
?交換機的作用就是,當(dāng)m1給m6發(fā)送消息的時候m2給m1發(fā)送消息造成碰撞,這個時候交換機檢測到左邊發(fā)生碰撞那么這個時候就不會將左側(cè)的消息轉(zhuǎn)發(fā)到右側(cè)直接將消息丟棄(如果將左側(cè)碰撞的消息發(fā)送到右側(cè)就會影響右側(cè)的主機,右側(cè)的主機都會觸發(fā)碰撞檢測和碰撞避免算法)。如果左側(cè)沒有發(fā)生碰撞并且m1要向m8發(fā)送消息,這個時候消息到交換機這里交換機就會將消息轉(zhuǎn)發(fā)到右側(cè)。文章來源地址http://www.zghlxwxcb.cn/news/detail-648007.html
到了這里,關(guān)于【網(wǎng)絡(luò)層+數(shù)據(jù)鏈路層】深入理解IP協(xié)議和MAC幀協(xié)議的基本原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!