我們知道網(wǎng)絡(luò)分層存在TCP/IP五層模型:
應(yīng)用層:負(fù)責(zé)應(yīng)用程序之間的數(shù)據(jù)溝通;自定制協(xié)議;知名協(xié)議(HTTP/FTP/SSH協(xié)議)
傳輸層:負(fù)責(zé)端與端之間的數(shù)據(jù)溝通(端口與端口之間);封裝端口信息(TCP/UDP協(xié)議)
網(wǎng)絡(luò)層:負(fù)責(zé)地址管理與路由選擇;(選擇最優(yōu)路徑);(IP協(xié)議,路由器)
鏈路層:相鄰設(shè)備之間的數(shù)據(jù)傳輸(兩個(gè)網(wǎng)卡之間,通過mac地址地址標(biāo)識)(以太網(wǎng)協(xié)議(Etherne)交換機(jī))
物理層:負(fù)責(zé)光電信號的傳輸(以太網(wǎng)協(xié)議,集線器(比如雙絞線的長度直徑,等等))
應(yīng)用層和傳輸層,阿鯉在之前已經(jīng)分享過了,連接在此:
http https tcp udp
我們在這篇文章中會介紹網(wǎng)絡(luò)層
提到ip,我想大家首先會想到的是ip地址,是的網(wǎng)絡(luò)中的一個(gè)ip就是一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。但是ip地址只是ip協(xié)議中的一個(gè)標(biāo)識而已,現(xiàn)在就讓我們看看IP協(xié)議的格式是怎樣的。
1:4為版本號:指定ip版本協(xié)議,對于ipv4而言就是4;
2:4位首部長度:ip頭部長度是以4字節(jié)為單位的;而其首部長度是4bit,4bit表示最大的數(shù)是15;所以ip頭部的最大長度為15*4=60字節(jié)
3:8位服務(wù)類型:3位優(yōu)先權(quán)字段(棄用);4位tos字段,和1位保留字段(必須值為0);4位tos字段分別表示,最小延遲,最大吞吐量,最高可靠性,最小成本,這四者沖突所以只能選一個(gè)。eg:對于ssh/telnet這樣的應(yīng)用程序,最小延遲就比較重要,對于ftp這樣的程序,最大吞吐量比較重要。
4:16位總長度:ip數(shù)據(jù)報(bào)整體占多少個(gè)字節(jié)
5:16位標(biāo)識:唯一的標(biāo)識主機(jī)發(fā)送的報(bào)文,如果ip報(bào)文在數(shù)據(jù)鏈路層被分片了,那么每一個(gè)片里面的這個(gè)id都是相同的。
6:3位標(biāo)志字段:第一位保留(不知道干啥,先空下來);第2位置為1表示禁止分片,如果這時(shí)候報(bào)文長度超過mtu,ip模塊就會丟棄報(bào)文。第3位表示”更多分片“,如果分片的話,最后一個(gè)分片值為1,其他為0,類似于結(jié)束標(biāo)志。
7:13位片偏移:是分片相對于原始ip報(bào)文開始處的偏移,其實(shí)就是在表示當(dāng)前分片在原始報(bào)文中的位置。實(shí)際偏移的字節(jié)數(shù)是這個(gè)值*8得到的。因此,除了最后一個(gè)報(bào)文之外,其他報(bào)文的長度必須是8的整數(shù)倍。
8:8位生存時(shí)間:數(shù)據(jù)報(bào)到達(dá)目的地的最大報(bào)文跳數(shù),一般為64,每次經(jīng)過一個(gè)路由,TTL就會減一,如果減到0還沒有到達(dá),就直接丟棄了;這個(gè)字段就是用來防止出現(xiàn)路由循環(huán)的。
9:8位協(xié)議:表示上層協(xié)議(網(wǎng)絡(luò)層)
10:16位首部校驗(yàn)和:使用CRC進(jìn)行校驗(yàn),來鑒別頭部是否受損
11:32位源/目的端口:表示發(fā)送端和接收端
12:選項(xiàng)字段:。。。
ok,現(xiàn)在大家對ip協(xié)議的結(jié)構(gòu)應(yīng)該有了一定的認(rèn)識,那么接下來讓我們看看ip協(xié)議在網(wǎng)絡(luò)層是怎樣傳輸?shù)?/span>
在網(wǎng)絡(luò)中,數(shù)據(jù)的傳遞被稱為一個(gè)路由的過程,而路由中的每一個(gè)點(diǎn)就是一個(gè)ip地址;而在我們?nèi)粘I钪?,?fù)責(zé)路由的儀器就是路由器(主機(jī)雖然有ip節(jié)點(diǎn),但是不能進(jìn)行路由控制)
那路由的過程是怎樣的呢?
唉,不著急,在講解路由過程之前,讓再看看ip地址的結(jié)構(gòu)
一個(gè)ip地址被分為兩個(gè)部分:網(wǎng)絡(luò)號+主機(jī)號
網(wǎng)絡(luò)號:保證相互鏈接的兩個(gè)網(wǎng)段具有不同的標(biāo)識
主機(jī)號:同一網(wǎng)段內(nèi),主機(jī)之間具有相同的網(wǎng)絡(luò)號,但是必須有不同的主機(jī)號
其實(shí)不同的主網(wǎng),就是把網(wǎng)路號相同的主機(jī)放在一起;如果在子網(wǎng)中新增一臺主機(jī),則這臺主機(jī)的網(wǎng)絡(luò)號和這個(gè)子網(wǎng)的網(wǎng)絡(luò)號一致,但是主機(jī)號必須不能和子網(wǎng)中的其主機(jī)重復(fù)。
那么合理設(shè)置主機(jī)號和網(wǎng)絡(luò)號,就可以保證在相互鏈接的網(wǎng)絡(luò)中,每臺主機(jī)的ip不相同。
那么問題來了,手動的管理子網(wǎng)ip,是一個(gè)相當(dāng)麻煩的事情。但是!有一種技術(shù)叫DHCP;
DHCP能夠自動的給主網(wǎng)內(nèi)新增主機(jī)節(jié)點(diǎn)分配ip地址,避免了手動管理ip的不便,一般的路由器都帶有這個(gè)功能。
說了這么多,我們還不知道網(wǎng)絡(luò)號和主機(jī)號是怎樣劃分的?
對于網(wǎng)絡(luò)號和主機(jī)號的劃分,可以分為兩種,以前和現(xiàn)在
首先讓我們看看以前的劃分
A以前提出的網(wǎng)絡(luò)號碼的劃分,將ip地址歸為以下5類:
A類地址:0.0.0.0到127.255.255.255;高1位固定,7位網(wǎng)絡(luò)號,24位主機(jī)號;一般用于組建超大型網(wǎng)絡(luò)--可以包含一千多萬的主機(jī)
B類地址:128.0.0.0到191.255.255.255;高2位固定,14位網(wǎng)絡(luò)號,16位主機(jī)號;一般用于組建中型網(wǎng)絡(luò)--可以包括65536個(gè)主機(jī)
C類地址:192.0.0.0到233.255.255.255;高3位固定;21位網(wǎng)絡(luò)號,8位主機(jī)號;一般用于組建小型網(wǎng)絡(luò),可以包含256個(gè)主機(jī)
D類地址:224.0.0.0到239.255.255.255;高4位固定,28位多播組號
E類地址:240.0.0.0到247.255.255.255;高5位固定,27位保留
隨著internet的飛速發(fā)展,這種劃分方案的局限性很快就顯現(xiàn)出來,大多數(shù)組織都申請B類網(wǎng)絡(luò)地址,導(dǎo)致B類地址很快就分配完了,而A類卻浪費(fèi)了大量地址;
eg:申請一個(gè)B類地址,理論上一個(gè)子網(wǎng)能夠允許6萬5千多個(gè)主機(jī)。A類地址的子網(wǎng)數(shù)更多,然而實(shí)際網(wǎng)絡(luò)假設(shè)中,不會存在一個(gè)子網(wǎng)內(nèi)有那么多情況。因此大量ip地址都被浪費(fèi)掉了。
為了針對這種情況提出了新的劃分方案,成為CIDR(classless interdomain routing)
引入一個(gè)額外的子網(wǎng)掩碼來區(qū)分網(wǎng)路號和主機(jī)號;
1:子網(wǎng)掩碼也是一個(gè)32位的正整數(shù)。通常用一串“0”來結(jié)尾;
2:將ip地址和子網(wǎng)掩碼進(jìn)行 “按位與” 操作,得到的結(jié)果就是網(wǎng)絡(luò)號;
3:網(wǎng)絡(luò)號和主機(jī)號的劃分與這個(gè)ip地址是A類,B類還是C類無關(guān);
eg:
ip地址140.252.20.68子網(wǎng)掩碼255.255.255.0網(wǎng)絡(luò)號142.252.20.0子網(wǎng)地址范圍142.252.20.0~140.252.20.255
細(xì)心的同學(xué)根據(jù)例子可以看出:ip地址與子網(wǎng)掩碼做與運(yùn)算可以得到網(wǎng)絡(luò)號,主機(jī)號從全0到全1就是子網(wǎng)的地址范圍;
ip地址和子網(wǎng)掩碼還有一種更簡潔的表示方法,
eg:140.252.20.68/24,表示ip地址位140.252.20.68,子網(wǎng)掩碼的高位是1,也就是255.255.255.0
在介紹完ip地址的劃分后,讓我們再看看幾個(gè)特殊的ip地址散散心
1:將ip地址中的主機(jī)號全部設(shè)置為0,就成了網(wǎng)絡(luò)號,代表這個(gè)局域網(wǎng);
2:將ip地址中的主機(jī)地址全部設(shè)置為1,就成了廣播地址,用于給同一個(gè)鏈路中相互鏈接的所有主機(jī)發(fā)送數(shù)據(jù)包
3:127.*的ip地址是用于本機(jī)回環(huán)測試的,通常是127.0.0.1
可是,以上的這些技術(shù)可以讓我們擁有足夠的ip地址嗎?
答案是:不能的;因?yàn)楝F(xiàn)在通用的ip地址是ipv4,一共是4個(gè)字節(jié),那么一共只有2的32次方個(gè)ip地址,大概是43億左右,而tcp/ip協(xié)議規(guī)定,每個(gè)主機(jī)都需要有一個(gè)IP地址。
但是世界上的主機(jī)遠(yuǎn)不止43億個(gè),并且ip地址都是按照網(wǎng)卡分的;
雖然CIDR在一定程度上緩解了ip地址的不夠,但是仍然不足。所以出現(xiàn)了下面的三種方法去解決ip地址不夠用;
1:動態(tài)分配ip地址:只給接入網(wǎng)絡(luò)的設(shè)備分配ip地址,因此同一個(gè)mac地址的設(shè)備,每次接入互聯(lián)網(wǎng)中得到的IP地址是不同的
2:IPV6:使用128字節(jié)來表達(dá)一個(gè)地址,現(xiàn)在還未推廣開;因?yàn)楹蚷pv4不兼容。
3:NAT技術(shù):在介紹NAT技術(shù)之前,我們先看一下什么是私有ip地址和公網(wǎng)ip地址
私有IP地址:如果一個(gè)組織內(nèi)部組建局域網(wǎng),ip地址只用于局域網(wǎng)內(nèi)的通信,而不是直接連到interent上,理論上,使用任意ip地址都可以,但是RFC1918規(guī)定了用于組建局域網(wǎng)的私有ip地址。
1:10.*,前八位為網(wǎng)絡(luò)號,共16777216個(gè)地址
2:172.16.到172.31.,前12位是網(wǎng)絡(luò)號,共1048,576個(gè)地址
3:192,168.*,前16位是網(wǎng)絡(luò)號,共65536個(gè)地址
在這個(gè)范圍中的,都稱為私有ip,其余則稱為公網(wǎng)ip;
每一個(gè)路由器可以配置兩個(gè)ip地址,一個(gè)是wan口ip,一個(gè)是lan口ip(子網(wǎng));
路由器的所有l(wèi)an口連接所有主機(jī),其網(wǎng)絡(luò)號都是這個(gè)ip;
不同的路由器,子網(wǎng)ip都是一樣的(因?yàn)閷?nèi)),一般都是192.168.1.1;主網(wǎng)的主機(jī)ip不可以重復(fù)。但是子網(wǎng)之間的主機(jī)ip就可以重復(fù)了。
wan口ip就是公網(wǎng)ip了,lan對內(nèi),wan對外;wan口ip就不能重復(fù)了,所以子網(wǎng)之間的ip是可以重復(fù)的。
每次在子網(wǎng)內(nèi)的主機(jī)需要和外網(wǎng)進(jìn)行通信的時(shí)候,路由器將ip首部中的ip地址進(jìn)行替換,這樣逐級替換,最終將數(shù)據(jù)包中的ip地址轉(zhuǎn)換成一個(gè)公網(wǎng)ip;這個(gè)轉(zhuǎn)換技術(shù)被稱為NAT(network address translation)
如果我們希望我們自己實(shí)現(xiàn)的服務(wù)器程序,能夠在公網(wǎng)上被訪問到,就需要把程序部署在一臺具有外網(wǎng)ip的服務(wù)器上。比如阿里云,騰訊云等。
說了這么多,就是為我們介紹路由的過程打鋪墊的,現(xiàn)在就讓我們一起看看路由的過程;
路由選擇就好比一個(gè)人問路的過程;
問路:當(dāng)ip數(shù)據(jù)包,到達(dá)路由器時(shí),路由器會先查看目的ip;
指路:路由器決定這個(gè)數(shù)據(jù)包是否可以直接發(fā)送給目標(biāo)主機(jī),還是需要發(fā)送給下一個(gè)路由器
重復(fù):依次反復(fù),一直達(dá)到目標(biāo)IP
那你知道,路由器是如何判定這個(gè)數(shù)據(jù)該發(fā)送到哪里呢?
這是因?yàn)槊總€(gè)節(jié)點(diǎn)都會維護(hù)一個(gè)路由表;這個(gè)表格可以在linux中使用route命令查看。如果ip命中了路由表,就直接轉(zhuǎn)發(fā)。
路由表中的最后一行,主要由一下次路由的地址和發(fā)送接口兩部分組成。
eg:
destination:目的網(wǎng)絡(luò)地址
gateway:下一條地址;(廣播)
genmast:子網(wǎng)掩碼
flags:U表示有效,G表示此條目的的下一條地址是某個(gè)路由器的地址。
Iface:發(fā)送鏈接接口
聯(lián)系客服