西安網(wǎng)站建設(shè)開發(fā)查派谷歌seo排名公司
文章目錄
- 1. 網(wǎng)絡(luò)層
- 2. IP協(xié)議
- 2.1 協(xié)議頭格式
- 3. 網(wǎng)段劃分
- 3.1 特殊的IP地址
- 3.2 IP地址的數(shù)量限制
- 4. 私有IP地址和公網(wǎng)IP地址
1. 網(wǎng)絡(luò)層
在應(yīng)用層解決了如何讀取完整報(bào)文、序列化反序列化、協(xié)議處理問題。在傳輸層解決了可靠性問題。那么網(wǎng)絡(luò)層IP的作用是在復(fù)雜的網(wǎng)絡(luò)環(huán)境中確定一個(gè)合適的路徑,將數(shù)據(jù)從A主機(jī)送到B主機(jī)。
2. IP協(xié)議
主機(jī):配有IP地址,但是不進(jìn)行路由控制的設(shè)備。
路由器:即配有IP地址,又能進(jìn)行路由控制。
節(jié)點(diǎn):主機(jī)和路由器的統(tǒng)稱。
2.1 協(xié)議頭格式
4位版本號(version):指定IP協(xié)議的版本,對于IPv4來說就是4。
4位頭部長度: IP頭部的長度是多少個(gè)32bit,也就是 length * 4 的字節(jié)數(shù),4bit表示最大的數(shù)字是15,因此IP頭部最大長度是60字節(jié)。這里和TCP報(bào)頭理解是一樣的。
8位服務(wù)類型:3位優(yōu)先權(quán)字段(已經(jīng)棄用),4位TOS字段,和1位保留字段(必須置為0)。4位TOS分別表示:最小延時(shí),最大吞吐量,最高可靠性,最小成本。這四者相互沖突,只能選擇一個(gè)。對于ssh/telnet這樣的應(yīng)用程序,最小延時(shí)比較重要。對于ftp這樣的程序,最大吞吐量比較重要。不過這個(gè)一般不用了。
16位總長度:IP數(shù)據(jù)報(bào)整體占多少個(gè)字節(jié)。
16位頭部校驗(yàn)和: 使用CRC進(jìn)行校驗(yàn),來鑒別頭部是否損壞。
32位源地址和32位目標(biāo)地址:表示發(fā)送端和接收端。
那么IP協(xié)議如何給上層進(jìn)行分用呢?是交付給TCP還是UDP呢?
在報(bào)頭中,有8位協(xié)議: 表示上層協(xié)議的類型。
如果由于網(wǎng)絡(luò)的BUG或者對端主機(jī)不可達(dá)等不可控因素的存在,導(dǎo)致IP報(bào)文在網(wǎng)絡(luò)中長時(shí)間游離,而不消失。該怎么辦呢?
8位生存時(shí)間:數(shù)據(jù)報(bào)到達(dá)目的地的最大報(bào)文跳數(shù)。一般是64,每次經(jīng)過一個(gè)路由,TTL -= 1,一直減到0還沒到達(dá),那么就丟棄了。這個(gè)字段主要是用來防止出現(xiàn)路由循環(huán)。
我們要知道:數(shù)據(jù)在網(wǎng)絡(luò)層后還需要傳給數(shù)據(jù)鏈路層,但是數(shù)據(jù)鏈路層有個(gè)規(guī)定:為了減小傳輸時(shí)的碰撞,它單次發(fā)送的有效載荷是有限制的。所以就有了IP分片的問題。
需要對IP進(jìn)行分片,是由誰來做?
是由發(fā)送方的網(wǎng)絡(luò)層來做的。
全部收到之后,是由誰來組裝呢?
是由對方的網(wǎng)絡(luò)層進(jìn)行組裝。
如何進(jìn)行組裝呢?
16位標(biāo)識(id):唯一的標(biāo)識主機(jī)發(fā)送的報(bào)文,如果IP報(bào)文在數(shù)據(jù)鏈路層被分片了,那么每一個(gè)片里面的這個(gè)id都是相同的。
也就是說,一個(gè)IP報(bào)文它的16位標(biāo)識是1234,如果被分片成3份,那么每份的報(bào)文的報(bào)頭里的16位標(biāo)識都是1234。
第一點(diǎn)我們要知道的是:我們要識別某個(gè)報(bào)文的分片的,還是沒有分片的。
3位標(biāo)志字段:第一位保留(保留的意思是現(xiàn)在不用,但是還沒想好說不定以后要用到)。第二位置為1表示禁止分片。這時(shí)候如果報(bào)文長度超過最大限制,IP模塊就會丟棄報(bào)文。第三位表示"更多分片", 如果分片了的話,最后一個(gè)分片置為0,其它是1。類似于一個(gè)結(jié)束標(biāo)記。
13位分片偏移:是分片相對于原始IP報(bào)文開始處的偏移。其實(shí)就是在表示當(dāng)前分片在原報(bào)文中處在哪個(gè)位置。實(shí)際偏移的字節(jié)數(shù)是這個(gè)值 * 8 得到的。因此,除了最后一個(gè)報(bào)文之外,其它報(bào)文的長度必須是8的整數(shù)倍(否則報(bào)文就不連續(xù)了)。
根據(jù)這兩個(gè)標(biāo)記位,只要更多分片是1或者更多分片為0但是偏移量不為0。只要滿足這兩點(diǎn)就說明報(bào)文被分片過。
第二點(diǎn)我們要將序號相同的報(bào)文收集到一起。
我們?nèi)绾闻袛辔覀兪占膱?bào)文被收全了呢?
根據(jù)偏移量,偏移量為0就是開頭,然后下一個(gè)報(bào)文=上一個(gè)報(bào)文偏移量+上一個(gè)報(bào)文自身長度,這樣就能判斷有沒有缺失的了。
第三點(diǎn)我們要正確的把分片報(bào)文組裝起來。
這里就根據(jù)偏移量進(jìn)行排序,然后組裝就行了。
如何進(jìn)行分片呢?
分片之后,每一個(gè)分片也是一個(gè)獨(dú)立的IP報(bào)文,也要有報(bào)頭。
舉個(gè)例子:
假設(shè)傳輸層有2980個(gè)字節(jié)要傳給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層加上報(bào)頭就是3000字節(jié),但單次傳輸?shù)纳舷奘?500,那么網(wǎng)絡(luò)層就需要分片。
這個(gè)例子,我們最少要分片成3份:
第一份:20+1480=1500
第二份:20+1480=1500
注意:分片下來的報(bào)文每個(gè)都需要添加自己的報(bào)頭。
兩個(gè)1480是2960,因?yàn)榘l(fā)送的有效載荷的大小是2980,所以還差20字節(jié)。那么第三份:20+20=40。這樣才是正確的分片。
但是無論是發(fā)送方還是接收方,分片和組裝行為,雙方的傳輸層是不知道的,它只關(guān)系完整的一個(gè)報(bào)文。
假設(shè)一個(gè)報(bào)文傳輸?shù)膩G包概率是1%,但是我們進(jìn)行了分片,分成了3份,如果有一份丟失,就說明了整個(gè)報(bào)文丟失,那么丟包的概率就大大增加。其實(shí)網(wǎng)絡(luò)層進(jìn)行分片,不是主流的。
那么分片對UDP和TCP有影響嗎?
當(dāng)然有影響,但是TCP有可靠性,可以重傳,但UDP的影響就大大增加了。所以,我們可以進(jìn)行設(shè)置不進(jìn)行分片。
那么如何減少分片呢?
其實(shí)網(wǎng)絡(luò)層不能決定分片還是不分片,這是由傳輸層決定的。網(wǎng)絡(luò)層只是負(fù)責(zé)這個(gè)工作。一般在三次握手的時(shí)候,就會協(xié)商單次傳輸數(shù)據(jù)的報(bào)文大小。
那么傳輸層單個(gè)報(bào)文的大小一般設(shè)置成為多少合適呢?
3. 網(wǎng)段劃分
IP的構(gòu)成:ip=目的網(wǎng)絡(luò)+目的主機(jī)。
網(wǎng)絡(luò)號:保證相互連接的兩個(gè)網(wǎng)段具有不同的標(biāo)識。
主機(jī)號:同一網(wǎng)段內(nèi),主機(jī)之間具有相同的網(wǎng)絡(luò)號,但是必須有不同的主機(jī)號。
IP在路由的時(shí)候,先根據(jù)目的網(wǎng)絡(luò)進(jìn)行路由,找到目的網(wǎng)絡(luò)之后,再根據(jù)目的主機(jī)的主機(jī)號,進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)。
所以,子網(wǎng)劃分的作用是為了提高查找目標(biāo)主機(jī)的效率。
過去曾經(jīng)提出一種劃分網(wǎng)絡(luò)號和主機(jī)號的方案,把所有IP 地址分為五類:
隨著Internet的飛速發(fā)展,這種劃分方案的局限性很快顯現(xiàn)出來:例如申請了一個(gè)B類地址,理論上一個(gè)子網(wǎng)內(nèi)能允許6萬5千多個(gè)主機(jī),A類地址的子網(wǎng)內(nèi)的主機(jī)數(shù)更多。然而實(shí)際網(wǎng)絡(luò)架設(shè)中不會存在一個(gè)子網(wǎng)內(nèi)有這么多的情況,因此大量的IP地址都被浪費(fèi)掉了。
針對這種情況提出了新的劃分方案,稱為CIDR(Classless Interdomain Routing):
引入一個(gè)額外的子網(wǎng)掩碼(subnet mask)來區(qū)分網(wǎng)絡(luò)號和主機(jī)號。
子網(wǎng)掩碼也是一個(gè)32位的正整數(shù),通常用一串 “0” 來結(jié)尾。
將IP地址和子網(wǎng)掩碼進(jìn)行 “按位與” 操作,得到的結(jié)果就是網(wǎng)絡(luò)號。
網(wǎng)絡(luò)號和主機(jī)號的劃分與這個(gè)IP地址是A類、B類還是C類無關(guān)。
下面舉兩個(gè)例子:
IP地址與子網(wǎng)掩碼做按位與運(yùn)算可以得到網(wǎng)絡(luò)號,主機(jī)號從全0到全1就是子網(wǎng)的地址范圍。
IP地址和子網(wǎng)掩碼還有一種更簡潔的表示方法。例如140.252.20.68/24,表示IP地址為140.252.20.68,子網(wǎng)掩碼的高24位是1,也就是255.255.255.0。
3.1 特殊的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)回(loop back)測試,通常是127.0.0.1。
3.2 IP地址的數(shù)量限制
我們知道: IP地址(IPv4)是一個(gè)4字節(jié)32位的正整數(shù),那么一共只有2的32次方個(gè)IP地址,大概是43億左右。而TCP/IP協(xié)議規(guī)定:每個(gè)主機(jī)都需要有一個(gè)IP地址。
難道一共只有43億臺主機(jī)能接入網(wǎng)絡(luò)嗎?
并且由于一些特殊的IP地址的存在,數(shù)量遠(yuǎn)不足43億,另外IP地址并非是按照主機(jī)臺數(shù)來配置的,而是每一個(gè)網(wǎng)卡都需要配置一個(gè)或多個(gè)IP地址。CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率,減少了浪費(fèi),但是IP地址的絕對上限并沒有增加),仍然不是很夠用。這時(shí)候有三種方式:
1.動態(tài)分配IP地址: 只給接入網(wǎng)絡(luò)的設(shè)備分配IP地址。因此同一個(gè)MAC地址的設(shè)備,每次接入互聯(lián)網(wǎng)中,得到的IP地址不一定是相同的。
2.IPv6: IPv6并不是IPv4的簡單升級版,這是互不相干的兩個(gè)協(xié)議,彼此并不兼容,IPv6用16字節(jié)128位來表示一個(gè)IP地址。但是目前IPv6還沒有普及。
前面兩種方法都不能很好的解決問題,但還有個(gè)NAT技術(shù)能解決這個(gè)問題。
4. 私有IP地址和公網(wǎng)IP地址
如果一個(gè)組織內(nèi)部組建局域網(wǎng),IP地址只用于局域網(wǎng)內(nèi)的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC 1918規(guī)定了用于組建局域網(wǎng)的私有IP地址:
10.,前8位是網(wǎng)絡(luò)號,共16,777,216個(gè)地址。
172.16.到172.31.,前12位是網(wǎng)絡(luò)號,共1,048,576個(gè)地址。
192.168.,前16位是網(wǎng)絡(luò)號,共65,536個(gè)地址。
包含在這個(gè)范圍中的都成為私有IP,其余的則稱為全局IP(或公網(wǎng)IP)。
一個(gè)路由器可以配置兩個(gè)IP地址,一個(gè)是WAN口IP,一個(gè)是LAN口IP(子網(wǎng)IP)。路由器LAN口連接的主機(jī),都從屬于當(dāng)前這個(gè)路由器的子網(wǎng)中。
所以,家用路由器和運(yùn)營商路由器除了可以進(jìn)行IP報(bào)文轉(zhuǎn)發(fā)之外,還可以構(gòu)建子網(wǎng)。
那么當(dāng)我們家里用的主機(jī)發(fā)送消息通過運(yùn)營商路由器發(fā)送到公網(wǎng),然后它需要給我們響應(yīng),那么響應(yīng)的是我們家里的私有IP嗎?前面我們說過,私網(wǎng)IP是不能出現(xiàn)在公網(wǎng)上的。因?yàn)榧矣寐酚善鞯淖泳W(wǎng)IP是可以一樣的。
那么發(fā)送到公網(wǎng)的消息流程如下:
我們要從家里主機(jī)發(fā)送到公網(wǎng),那么假設(shè)開始IP是:192.168.1.201,目的IP是:122.77.241.3。首先會發(fā)送到家用路由器,它會發(fā)現(xiàn)我們發(fā)送的數(shù)據(jù)不在家用路由器的子網(wǎng)內(nèi),就會把開始IP是:192.168.1.201,替換成家用路由器的WAN口IP:10.1.1.2,然后發(fā)送到運(yùn)營商路由器,它也能發(fā)現(xiàn)我們發(fā)送的數(shù)據(jù)不在運(yùn)營商路由器的子網(wǎng)內(nèi),會被開始IP:10.1.1.2替換成運(yùn)營商路由器的WAN口IP:122.77.241.4,由此就可以訪問公網(wǎng)IP了。
子網(wǎng)內(nèi)的主機(jī)需要和外網(wǎng)進(jìn)行通信時(shí),路由器將IP首部中的IP地址進(jìn)行替換(替換成WAN口IP),這樣逐級替換,最終數(shù)據(jù)包中的IP地址成為一個(gè)公網(wǎng)IP這種技術(shù)稱為NAT(Network Address Translation 網(wǎng)絡(luò)地址轉(zhuǎn)換)。
那么公網(wǎng)怎么把響應(yīng)發(fā)給我們呢?
這個(gè)后面再說。