目錄
1.網絡層
2.數據鏈路層
1.網絡層
? ? ? ? 我們知道,我們的消息為了從A端發送到B端,達成遠距離傳輸,我們為此設計了很多協議層,分別是應用層,傳輸層,網絡層,數據鏈路層,網卡,傳輸層確保我們數據的可靠性與安全送達,而我們對網絡層的定位是:IP提供個一種把數據從A端送到B端的能力。
如果說TCP能夠保證我們數據的可靠性,那么我們的IP就能夠讓我們的數據在不同的主機間進行傳輸。
一個形象的比喻是,假如張三是一個學霸,它的數學特別好,有能力考到150分,這個有能力的意思是有很大概率考到150分,并不能確保一定能考到150分,那張三學校的教導主任為了讓張三的成績每次都是150分,它的做法是假如張三這次考試沒有考到150分,那么我就讓全校重考,知道張三數學考到150分。張三有考150分的能力,加上教導主任的助力,實現了張三每次的成績都是150分,那么我們的TCP/IP也是類似的,IP提供了一種把數據從A端傳輸到B端的能力,但是不能保證傳輸的過程不丟包,那么萬一我們的IP丟包了,我們的TCP就要保證數據的可靠性,進行重傳,具體的實現不就是沒有收到應答,就有超時重傳和快重傳的機制嗎?
? ?IP是是什么?
? ? ? ? IP=網絡地址+主機地址
我們路由的本質就是實現不同子網間的信息傳遞!
? ? ? ? 要認識IP,就得認識他的報頭,我們講解TCP的時候說過,一個協議要解決的2個問題就是,如何把報頭和有效載荷進行分離,如何向上交付的問題,也就是如何分用。
? ? ? ? 看著下面的IP報頭,我們來解讀一下,首先16位字節總長度是我們報文的總長度,由于IP的報頭長度是固定的,那么我們知道16位總長度,那么我們就可以知道了報頭和有效載荷的分界線,我們讀到一個完整的IP報頭就可以對報頭和有效載荷進行分離了。
? ? ? ? 這是沒有選項的情況,如果有選項,我們就需要看一下四位首部長度,那么減去的就是4位首部長度,因為4位首部長度里面是報頭+選項的總長度。
? ? ? ? 第二個問題,如何向上交付,8位協議里面有上層協議的類型。
? ? ? ? 那么我們IP報文在傳輸的過程中,由于網絡拓補結構的復雜,可能會出現環路問題,會出現永生報文,我們不允許這種情況的出現,所以我們報頭有一個參數是8位生存時間,每進行一次路由器傳輸,它的數字--,減到0的時候這個報文就被丟棄掉。
? ? ? ?IP是遠距離傳輸的過程還會出現信號減弱,所以我們有集線器,每經過一次集線器,它的信號就被放大了,確保了我們遠距離傳輸。
? ? ? ? 下面來說我們的32位IP地址,和我們的學號一樣,學號是經過精心設計的,拿這你的學號就可以知道你是哪個專業,哪個院,哪個班,,就可以找到你這個人,身份證不也是一樣嗎?你的身份證里有你的地區,有你的出生日期,也是被精心設計的呀,一個身份證對應的就是一個人,我們的IP也是類似的,IP=網絡號+主機號。
? ? ? ? 我們同一個子網內我們IP的網絡號是相同的,如果我想要進行查找,我本質就是進行IP的淘汰,比如我的目的IP是1.0,同時有2.0,3.0,4.0等多個子網,我們一下就會淘汰掉許多IP,提高了我們的效率,如果我們不這樣設計一個一個去找,就是線性查找,效率非常的低下,我們的紅黑樹為什么高效,不就是它查找一次淘汰一般的數據嗎?
? ? ? ? 因為線性查找低效,所以我們要提高效率,為了提高效率,我們精心設計了IP,所以同學們,我們發現不僅僅是計算機是這樣,我們的身份證等等不都是這樣嗎?
? ? ? ? 了解完了IP的報頭我們還需要進一步了解我們的IPV4,你不是說我的IPV4有32個比特位嗎?它不就是2的32次方嗎?既然IP是唯一的,那我現在的設備超過了這個2的32次方,我不就無法進行標識唯一性了嗎?你給我解釋一下。
? ? ? ? 起初,我們的IP劃分的時候沒有想到互聯網會像現在這么普及到千家萬戶,所以它開始設計的就比較少,而且劃分的時候比較糙。
? ? ? ? 你看假如我把一個網絡號劃給一個子網,它的子網內就不可能有2的24次方臺主機,這樣的劃分造成了大量的IP浪費,為了減少浪費,我們引入了子網掩碼,就是IP地址與子網掩碼按位與之后有幾個1,就有幾位是網絡號!
子網掩碼的本質就是:提高我們的IP利用效率!我們的IP設計沒有一處是多余的,都是經過精心的設計的,20個字節的報頭就能表示這么多東西,實在是厲害。
下面的IP地址與我們的子網掩碼按位與之后就是我們的網絡號。28位表示網絡號,4位表示網絡號。
其中我們的主機地址全0表示網絡地址,全F表示廣播。所以我們實際表示的主機數還要減去2!
? ? ? ? 說完了IP的這些之后,我想問你有沒有發現我們的家庭網絡的IP都是192.多少多少,而且不同的網絡之間IP是可以進行重復的,怎么回事,你不是說IP不可以重復嗎?但是我看到的明明可以重復呀!
? ? ? ? 其實我們除了我們的公網IP之后,還有我們的私網IP,它們只能用來構建子網,不能出現在公網。
? ? ? ? 那誰來幫助我們組件子網,家庭路由器幫助我們對子網進行組件,所以路由器不僅有組件網絡的功能,也有路由的功能。
? ? ? ? 我們平時接觸的IP都是子網IP,都不是公網IP。
? ? ? ? 為了解釋這種現象,我們可以這么理解,我們家庭路由器都是只有私網IP,我們的運營商的路由器有一個私有IP有一個公網IP,我們的路由器把消息轉發給運營商的路由器,由它幫助我們進行公網的轉發,所以我們發的消息都會經過運營商的檢測,你一旦訪問一些不科學的網站,就會把你的訪問請求報文直接丟棄掉,所以想要科學上網,就需要PIAN過運營商。????????
? ? ? ? 這樣的設計讓我們私網IP之間可以進行重復,大大減少了IP不足的壓力。
家用路由器的本質就是由運營商搭建的一個子網,我們國家的基礎設施就是聯通移動電信來搭建的,光纖入戶就是讓我們用戶接入網絡,這樣就有需求產生,有需求就會有市場,這樣經濟就發展起來了。
所以我們想進行短視頻的請求,就是進行轉發,從一個子網到另一個子網,但是我們的公網不存在私人IP,所以這樣的轉發是不正確的。我們需要對我們的IP進行替換。
下面的圖才是正確的轉發過程,源IP不斷被轉換,知道發到公網,然后回來的時候還發到我們的運營商路由器會進行查表,返回到我們的私人IP。具體的過程還得
總而言之,我們的個人是通過運營商來訪問公網的。
????????
? ? ? ? 要想了解IP的整個機制,就需要了解一下我們的IP子網劃分是怎么樣進行的。
? ? ? ? 首先我們國家與國家之間會有一個國際路由器,我們簡化模型,假設俄羅斯的網絡地址是1.0,美國是2.0,英國是3.0,中國是5.0,俄羅斯想發一條消息給中國,它會把目的IP與子網掩碼進行按位與,然后查表,進行跳躍,國與國之間的國際路由器就是一個子網,
然后中國有許多省份,我們會為每個省份劃分一個IP,這是第二次子網劃分,每個省內的每個市分發一個IP,這是第三次子網劃分,市的IP就相當于我們之前的出入口的路由器,市下面全部都是一個一個的私人IP,就去構建一個一個子網了。
IP能夠找到我們的主機就是因為我們的IP被統一設計過了。
我們的網絡=內網+公網,公網有限,我們大部分接觸的網絡IP都是內網IP。
我們的IP報頭里面還有一個13位偏移位,這是因為鏈路層規定,交給鏈路層的報文大小不要超過1500字節。所以如果超過我們的網絡層需要進行切分。傳過去之后再進行合并。
? ? ? ? 學習網絡的本質就是學習報文的整個生命周期,因為我們的IP報文超過規定的大小需要切分,所以我們的IP報頭里面有一個表示IP的唯一標識位,如果分片了,標識位就是一樣的,
還有一個偏移量是為了讓我們的分片之后進行檢查是否有丟包的分片。
我們IP分片的過程,和我們的傳輸層沒有關系,不需要讓傳輸層知道,分片和組裝的過程都是在你的網絡層進行的,不要讓上層知道。
分片不是簡單的對每個報文進行分片,還要為每個報文進行報頭的添加。由一個IP報文變為多個IP報文。
有一個問題是13位偏移量如何表示16位總長度,這是因為我們13位偏移量會右移3位,也就是2的3次方,這樣就是16位了,所以這就要求我們的偏移量必須是8的倍數。
報文有分片就要組裝,我們分片后就要討論如何組裝的問題。
1.有的分片,有的IP報文根本就沒有分片,如何挑出來報文的分片。
如果一個報文分片了,第一個報文,偏移量為0的報文,第三個標志位一定為1,表示還有更多標志位。
如果是最后一個,那它的偏移量一定大于0,并且第三個標志位為0,表示沒有更多分片了。
2.挑出來分片的報文了,如何確保它們的完整?
完整就是有頭有尾有中間,根據頭部和尾部的特性可以知道,那么如何知道中間的呢?
一個報文的偏移量等于它前面報文的有效載荷+前面報文的偏移量,按照升序排序,就能發現是否有缺失的,如果有,丟棄整個報文進行重傳。
? ? ? ? 我們知道了這么多分片和組裝的策略,但是并不意味著我們要多進行分片,這是迫不得已進行分片和組裝,你想我一個IP報文傳輸成功的概率大,還是一群IP報文傳輸成功的概率大,肯定是一個IP報文傳輸的概率大,所以我們分片之后一個IP報文丟失就要丟掉整個報文,不利于我們可靠的傳輸,丟包之后我們的傳輸層還要進行重傳。非常低耗時啊。
? ? ? ? 所以我們要盡量減少分片,要減少分片就要讓我們的傳輸層盡量傳輸少于我們的鏈路層最大接受報文的量,所以我們的傳輸是用滑動窗口進行分段傳輸而不是把整個滑動窗口的字節全部傳輸過去,這樣做會變相增大丟包率。
? ? ? ? 所以傳輸層需要選擇合適的數據大小進行傳輸。什么是合適的數據大小呢?
????????
子網傳輸中,為什么要把數據要給路由器F,這是因為我的IP報文的網絡地址是路由器F,目的IP決定的,目的IP決定你往哪個路由器進行傳輸。
如何把數據交給F就是局域網通信的問題,這是由數據鏈路層解決的。? ? ? ??
????????
2.數據鏈路層
? ? ? ? 數據鏈路層有:
目的地址就是目的MAC地址,源IP地址就是源MAC地址,類型就是說明該報文向上交付給誰。
CRC進行數據校驗,檢查數據是否傳輸正確,不正確丟掉進行重傳。
MAC數據幀并不是越大越好,局域網進行通信,會發送碰撞,為了保證數據的正確傳輸就有碰撞避免和碰撞檢測,發送碰撞就要進行重傳。
一個MAC數據幀太大了,在網絡間停留的時間長,容易發生碰撞。但是太小了比如1字節,它傳的數據還沒有報頭大,效率太低,所以MAC幀數據不能太高也不能太低,科學家進行大量的實驗發現46-1500字節是最為合適的,所以我們的傳輸最大值為1500字節,如果不夠46字節會補夠46字節。
? ? ? ? 一個數據幀在進行轉發的時候需要知道目的MAC地址,和源MAC地址,源MAC地址肯定知道,那么問題就是我們的目的MAC地址,所以會出現我們的ARP協議獲取局域網內特性的MAC地址。
? ? ? ? 大致的過程是我們的會把我們的MAC幀的目的地址設為全F,發給局域網內所有的主機,然后所有的主機收到,拆掉MAC幀報頭,然后里面有ARP報頭,ARP報頭里面就有
發送方會把OP設為1,表示發送,硬件類型0800代表的上層交付給IP協議,目的MAC地址設為全F,然后對應的IP主機收到報文會對我們的發送方進行應答,然后我們發送方就收到了目的MAC地址就可以進行路由傳輸了。
? ? ? ? 我們知道的IP報文會進行轉發,我的問題是,當我們到達我們的子網路由器入口的時候,我的IP報文里面有源IP和目的IP,但是我們如果要進行轉發還需要知道我們的目的MAC地址,就比如下面這個IP報文,它的目的IP是IPX,它的源IP是我們的IPE,而我們的路由器則是R,我們已經到了子網的入口,下一步我要將我的IP報文交給我們的數據鏈路層。
數據鏈路層有我們的以太網目的地址,也就是我們的目的MAC地址,還有以太網源地址,也就是源MAC地址,還有幀類型,說明報文是應該交付向上交付給誰,但是我們不知道我們IPE的MAC地址,我們只知道它的IP地址,所以我們為了知道我們的IPE的MAC地址,就有ARP協議。
ARP的報文有硬件類型,一般是1表示以太網,協議類型表示要轉化的地址,0800代表IP,OP代表是請求還是應答報文,發送端以太網地址就是本主機的MAC地址,發送端IP地址就是本主機的IP地址,目的以太網地址就是不知道的,設為全F,我們知道目的IP地址的。這樣我們的ARP報文里面就把目的以太網地址空出來了。
該通信是局域網內通信,我們的數據鏈路層會把這個報文發給該局域網內所有的主機,所有的主機都會收到該報文,該報文會進行填充。
下面就是我們數據鏈路層填充好的協議,這個報文會發給該局域網內所有的主機,然后其他主機收到這個報文,根據協議,發現我們的目的MAC地址是全F表示任意主機,幀類型是08-06,代表ARP協議,即這個報文不應該直接交付給IP,而是先交給ARP協議棧,嗯,交給ARP了然后,主機會看它的OP字段,判斷他是請求報文還是應答報文,看到該報文是請求報文,再去對比發送的目的IP地址,發現目的IP和自己不一樣,丟棄,發現目的IP和自己一樣就會對我們的目的MAC地址進行填充,然后就會進行應答。
你看,應答的時候它就成了發送報文的一方,它的以太網目的MAC自己就知道,以太網源MAC地址,就是它自己的MAC地址嗎,你說它能不知道嗎?
幀類型就是選擇0806,0806代表了ARP應答,硬件類型選擇以太網,協議類型就是0800,表示向上交付給的是IP,OP寫為2,代表該ARP報文是應答報文,發送端以太網地址改為MACE,IP為IPE,目的以太網地址改為MACR,目的IP改為IPR,這樣我們就把這個報文發給局域網內所有的主機。
與路由器R發過來的請求報文相比,這次我們的開頭的目的地址不再是全F,這樣當其他不匹配的目的地址收到該報文的時候,在數據鏈路層直接丟棄掉,不必到了ARP層再進行丟棄,發的時候全部受到了ARP,不匹配的在ARP層才丟棄,但是回復的時候不匹配的主機在數據鏈路的MAC層就會被丟掉,當我們的路由器R拆掉報頭,拿到ARP的報頭,先看OP層發現它是2,就明白了它是一個應答報文,我們要的MAC地址就是ARP中的發送端的MAC地址,至此,我們拿到了目標主機的MAC地址,源IP,目的IP,源MAC,目的MAC也有了,可以開始進行向指定的主機進行發送了。
發送的過程中,我們的ARP不過也是數據鏈路層的一個協議。