網絡層
網絡層
是OSI參考模型中的第三層,介於傳輸層和數據鏈路層之間
,它在數據鏈路層提供的兩個相鄰端點之間的數據幀的傳送功能上,進一步管理網絡中的數據通信,將數據設法從源端經過若干個中間節點傳送到目的端,從而向運輸層提供最基本的端到端的數據傳送服務。
網絡層的目的
:實現兩個端系統之間的數據透明傳送,具體功能包括尋址和路由選擇、連接的建立、保持和終止等。它提供的服務使傳輸層不需要了解網絡中的數據傳輸和交換技術
ip協議
在計算機通信中,爲了識別通信的對端,就必須有一個類似於地址的識別碼進行識別。而在網絡層中,ip就充當了地址的作用。
ip地址用於在 連接到網絡中的所有主機中識別出進行通信的目標地址,因此,TCP/ip通信中的所有主機或者路由器必須設定自己的ip地址
TCP/ip協議在網絡層的核心是ip協議,它是TCP/IP協議族中最主要的協議之一。
在TCP/IP協議族中,網絡層協議包括IP協議
(網際協議),ICMP協議
(Internet互聯網控制報文協議)以及IGMP協議
(Internet組管理協議)
ip協議報頭格式
- 4位版本:描述ip協議的版本。對於ip協議,他一共有兩個版本,也就是
ipv4和ipv6
。ipv6版本不向下兼容ipv4 - 4位首部長度:表示ip協議的頭部長度。4個字節中所表示的數字 * 4,纔是ip協議頭部的長度,最長爲
0xf * 4 = 60字節
(固定的20個字節 + 40字節的選項) - 8位服務類型:
前三位,表示優先權,目前已經棄用
後面四位,表示最小延時(ssh)+ 最大吞吐量(ftp)+ 最高可用性 + 最小費用。他們之間是一個互斥的關係,如果都是0,則表示使用默認屬性
最後一位,是一個保留位,必須置0
-
16位總長度:表示ip數據報整體的長度,單位是字節,他的最大報文長度時2^16次方,也就是65535個字節,但是由於受到MTU的影響,一般達不到最大字節。
-
16位標識:是一個標識,唯一標識主機發送的報文。
如果通信使用的是UDP協議,那麼當數據長度大於MTU
的時候,就需要進行分片傳輸,這個時候在每一個分片中的16位標識
都是相同的,標識着他們是由哪一個數據組成的
- 3位標誌:分別是 保留位,禁止分片,標識更多分片
當前分片不是最後分片的時候,第三位爲 1
當前分片是最後分片的時候,第三位爲 0
- 13位片偏移:標識着分片在UDP報文中的位置。等同於彙編中的
段基址 + 偏移量
我們發現,13個字節最大可以表示的數字是 2^13 = 8192,而實際中最大的長度是16個字節,也就是2 ^16 = 65536。
所以在計算片偏移的時候,需要在13位數值的基礎上 * 8,也就是 片偏移 = 13位數值 * 8
,所求出來的數據的單位就是字節,也就是該分片的起始位置
- 8位生存週期:數據在傳輸到達目的地之前,所允許經過的路由器的個數;
TTL,表示跳數(一般是64),也就是該數據最多可以經過多少個路由器進行轉發數據,每經過一個路由器,就進行TTL - 1操作,這是爲了防止出現環形路徑發生死循環的情況。
如果TTL變成0,並且還沒有到達對端,那麼轉發設備就丟棄該報文
- 8位協議:標識傳輸層中使用什麼協議,當對方在進行分用的時候,就可以知道對方使用的協議,然後將數據提交給對應的傳輸層協議進行下一步分用
- 16位首部校驗和:判斷ip頭部在傳輸的過程中是否發生損壞
- 32位源ip地址 和 32位目的ip地址:表示這條數據從哪來,到哪去。在轉發的過程中不會發生改變(NAT模式除過)
MTU
MTU:最大傳輸單元,可以使用ifconfig命令查看,單位是字節
有了MTU,網絡層傳遞給數據鏈路層的數據,如果大於MTU字節時,就需要進行分片傳輸
而數據在封裝的過程中,網絡層數據來源於傳輸層,而傳輸層有兩個協議TCP和UDP
- TCP協議
因爲TCP協議在三次握手期間就有一個任務,就是互相協商,確定一個MSS(最大報文長度)
MTU = MSS + ip頭部 + TCP頭部
所以說,TCP協議是按照MSS去給網絡層提交數據,但是MSS的大小一定小於MTU的,所以TCP協議下通信的數據在網絡層是不需要分片傳輸的
- UDP協議
UDP協議是面向數據報,一般是整條數據發送,並且整條數據進行接收,所以是很有可能會超過MTU的大小的。
而當UDP協議一次發送的報文超過了MTU字節
的大小時,就需要在網絡層進行分片傳輸。
最後,由於UDP協議是不可靠
的,而網絡層的ip協議也是不可靠的
,所以如果在分片傳輸的過程中丟失了一部分的分片,那麼整條UDP數據就會被全部丟失
ip地址
對於ipv4的地址,他的類型是unint32_t,所表示的範圍是0 ~ 2^32
ip地址 = 網絡號 + 主機號
- 網路號:標識一個子網絡,也就是很多ip地址
- 主機號:在子網當中唯一標識一臺主機
對於那麼多的ip地址,他們又被分爲5類,依次爲A類,B類,C類,D類和E類
- A類:最高的1位爲0,後面7位爲網絡號,剩下的24位爲主機號
那麼A類ip地址,可以表示的子網範圍就是 0 ~ 127。也就是說,A類中可以分出來128個子網。
每一個A類子網,最多可以有2^24次方個ip地址,也就是16777216個(包括網絡號 和 廣播號)
2. B類:最高的2位固定爲10,然後14位標識網絡號,剩下的16位標識主機號
3. C類:最高的三位爲 110,後面21位標識網絡號,最後8位標識主機號
- D類:高四位爲 1110 ,剩下28位爲多播組號
- E類:高五位固定爲 11110,剩下27位留用
我們可以看出,ip地址雖然有所劃分,但是所有的ip地址都是相連的,A類的最大ip地址 + 1 = B類的最小ip地址
同時,C類ip地址擁有着最少的主機號 2^8 ,也就是 256個ip地址。
而如果有人只想要10個ip地址,總不能直接把C類的ip地址都給這個人吧,那樣很容易造成ip地址的浪費。這個時候就有了子網掩碼
子網掩碼
針對上面這種情況,引入了一個新的解決方法,叫做CIDR
(Classless Interdomain Routing)
他的作用是爲了更精確的劃分子網,已經精確分配ip地址,從而避免ip地址浪費的問題
使用了一個子網掩碼
,這其實是一個 uint32_t
類型的整數,由一段連續的二進制1構成,利用子網掩碼就可以區分最大主機號與網絡號
- 最大主機號:子網掩碼取反
- 網絡號:子網掩碼 & ip地址
就拿我自己的這個子網掩碼來演示一下
- 主機號全爲0的ip地址是網絡號
- 主機號全爲1的ip地址是廣播號
私網與公網
在42億的ipv4的ip地址中,又被劃分出來的3個段,在這3個段中的ip地址不具備訪問互聯網的功能,被稱爲私網。
與之對應的,可以訪問互聯網的其他ip地址,就是公網。
私網ip的劃分:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
私網ip與私網ip之間是不影響通信的,也就是說私網中的機器之間可以互相通信,但是不能訪問互聯網
兩個不同公司的私網之間想要進行通信,就得接住NAT,利用代理將自己的私網ip用一個公網ip代替,然候使用公網進行通信
路由選擇
當我們在發送數據的時候,這樣幾個東西總是必不可少的
- 源ip,標識數據從哪來
- 源端口
- 目的ip,標識數據要到哪裏去
- 目的端口
- protocol,數據傳輸中所使用的協議
使用route命令,可以在Linux下查看路由表的信息
- U表示該路由條目有效
- G表示該路由條目爲網關
默認路由
如果一張路由表中包含所有網絡以及子網的信息,那麼就會造成很大程度的浪費。
這個時候,就可以使用默認路由,他是指路由表中的任何一個地址都可以進行匹配的機率
主機路由
ip地址 / 32
,這就被稱爲主機路由,就像 192.168.1.1/32
他的意思是整個ip地址的所有位都將參與路由。進行主機路由,意味着要基於主機上網卡設備的ip地址本身,而不是基於該地址的網絡地址進行路由
一般用於不希望通過網絡地址路由的情況
環回地址
環回地址是在同一臺計算機上的程序之間進行網絡通信時所使用的一個默認地址。
一般使用一個特殊的ip地址作爲環回地址,127.0.0.1
目的ip的作用:
- 在路由選擇中,數據每到一個路由器中,就用目的ip地址和路由表中的
子網掩碼
進行按位與
操作
如果結果是該子網的網絡號,那麼就直接把數據發送給當前子網中的機器;
如果不是該子網的網絡號,表示這個數據不在這個路由器的子網中
- 如果除了默認網關之外的其他路由條目都沒有匹配上,那麼這個數據就走默認網關,直接傳遞給上級路由器
- 在每一個路由器中進行比對的時候,每比對一次,TTL-1,直到TTL耗盡就被丟棄了,或者是數據到達了目標位置,傳輸成功。