目錄
一、IP協(xié)議概述
二、協(xié)議頭格式
三、網(wǎng)段劃分
四、IP地址的數(shù)量限制
五、路由
六、分片和組裝
一、IP協(xié)議概述
主機(jī):配有IP地址,但是不進(jìn)行路由控制的設(shè)備
路由器:即配有IP地址,又能進(jìn)行路由控制
節(jié)點(diǎn):主機(jī)和路由器的總稱
IP:將數(shù)據(jù)從A主機(jī)跨網(wǎng)絡(luò)傳輸?shù)紹主機(jī)的能力,IP = 目標(biāo)網(wǎng)絡(luò) + 目標(biāo)主機(jī)
路徑選擇中,目標(biāo)IP決定了我們的路徑該怎么走(先確定目標(biāo)網(wǎng)絡(luò),再確定目標(biāo)主機(jī))
二、協(xié)議頭格式
- 4位版本號:version,指定IP協(xié)議的版本,對于IPv4來說就是4
- 4位首部長度:header length,IP頭部的長度是多少個32bit,也就是length * 4字節(jié)數(shù)
- 8位服務(wù)類型:Type of Service,3位優(yōu)先權(quán)字段(已放棄),4位TOS字段,1位保留字字段(0)。4位TOS字段分別表示最小延時、最大吞吐量、最高可靠性、最小成本,這四者相互沖突,只能選擇一個。對于ssh/telnet這樣的應(yīng)用程序,最小延時比較重要,對于ftp這樣的程序,最大吞吐量比較重要
- 16位總長度:total length,IP數(shù)據(jù)報(bào)整體占多少個字節(jié)
- 16位標(biāo)識:id,唯一的標(biāo)識主機(jī)發(fā)送的報(bào)文,如果IP報(bào)文在數(shù)據(jù)鏈路層被分開了,那么每一片里面這個id都是相同的
- 3位標(biāo)志字段:第一個保留,第二個位置置1表示禁止分片,這時候如果報(bào)文長度超過MTU,IP模塊就會丟棄報(bào)文,第三個位置表示“更多分片”,如果分片了的話,最后一個分片置1,其他都是0,類似一個結(jié)束標(biāo)志
- 13位片偏移:framegament offset,是分片相對于原始IP報(bào)文開始處的偏移,其實(shí)就是表示當(dāng)前分片在原始報(bào)文中的哪個位置,實(shí)際偏移的字節(jié)數(shù)是這個值*8得到的,因此除了最后一個報(bào)文之外,其他報(bào)文的長度必須是8的整數(shù)倍(否則報(bào)文就不連續(xù)了)
- 8位生存時間:Time To Live,TTL,數(shù)據(jù)報(bào)到達(dá)目的地的最大報(bào)文跳躍次數(shù),一般是64,每經(jīng)過一次路由,TTL -= 1,一直減到0還沒有到達(dá)就丟棄了,這個字段主要防止出現(xiàn)路由循環(huán)
- 8位協(xié)議:表示上層協(xié)議的類型
- 16位頭部檢驗(yàn)和:使用CRC進(jìn)行校驗(yàn),來鑒別頭部是否損壞
- 32位源地址和32位目的地址:表示發(fā)送端和接收端IP地址
- 選項(xiàng)字段:不定長,最多40字節(jié)
如何將報(bào)頭和有效載荷分離?4位首部長度,基本單位是4字節(jié),標(biāo)準(zhǔn)長度是20字節(jié),首部長度范圍[20, 60],標(biāo)準(zhǔn)長度的4位首部長度 0101,通過16位總長度減去4位首部長度,即可得到數(shù)據(jù)內(nèi)容,即可進(jìn)行報(bào)頭和有效載荷的分離。
三、網(wǎng)段劃分
IP地址分為兩個部分,網(wǎng)絡(luò)號和主機(jī)號
- 網(wǎng)絡(luò)號:保證相互連接的兩個網(wǎng)段具有不同的標(biāo)識
- 主機(jī)號:同一網(wǎng)段內(nèi),主機(jī)之間具有相互的網(wǎng)絡(luò)號,但是必須有不同的主機(jī)號
- 不同的子網(wǎng)其實(shí)就是把網(wǎng)絡(luò)號相同的主機(jī)放在一起
- 如果在子網(wǎng)中新增一臺主機(jī),則這個主機(jī)的網(wǎng)絡(luò)號和這個子網(wǎng)的網(wǎng)絡(luò)號一致,但是主機(jī)號不能和子網(wǎng)中的其他主機(jī)重復(fù)
通過合理設(shè)置主機(jī)號和網(wǎng)絡(luò)號,就可以保證在相互連接的網(wǎng)絡(luò)中,每臺主機(jī)的IP地址都不相同。
那么問題來了,手動管理子網(wǎng)中的IP,是一個相當(dāng)麻煩的事情,怎么解決呢?有一種技術(shù)叫做DHCP,能夠自動給子網(wǎng)內(nèi)新增主機(jī)節(jié)點(diǎn)分配IP地址,避免了手動管理IP的不便。一般的路由器都帶有DHCP功能,因此路由器也可以看做一個DHCP服務(wù)器。
過去曾經(jīng)提出過一種劃分網(wǎng)絡(luò)號和主機(jī)號的方案,把所有IP地址分為五類,如下圖TCPIP:?
- A類:0.0.0.0 ~?127.255.255.255
- B類:128.0.0.0 ~ 191.255.255.255
- C類:192.0.0.0 ~ 223.255.255.255
- D類:224.0.0.0 ~ 239.255.255.255
- E類:240.0.0.0 ~ 247.255.255.255
隨著Internet的飛速發(fā)展,這種劃分方案的局限性很快就顯現(xiàn)出來,大多數(shù)組織都申請B類網(wǎng)絡(luò)地址,導(dǎo)致B類地址很快就分配完了,而A類卻浪費(fèi)了大量地址。
針對以上情況提出的新的劃分方案,稱為CIDR(Classless Interdomain Routing):
- 引入了一個額外的子網(wǎng)掩碼(subnet mask)來區(qū)分網(wǎng)絡(luò)號和主機(jī)號
- 子網(wǎng)掩碼也是一個32位的正整數(shù),通常用一串“0”來結(jié)尾
- 將IP地址和子網(wǎng)掩碼“按位與”操作,得到的結(jié)果就是網(wǎng)絡(luò)號
- 網(wǎng)絡(luò)號和主機(jī)號的劃分與這個IP地址是A類、B類還是C類無關(guān)
一般在一個子網(wǎng)中,管理子網(wǎng)中IP的設(shè)備是路由器,目標(biāo)網(wǎng)絡(luò)、子網(wǎng)掩碼、子網(wǎng)中的主機(jī)都是由路由器管理的,目標(biāo)網(wǎng)絡(luò)和子網(wǎng)掩碼是在路由器內(nèi)配置的。
四、IP地址的數(shù)量限制
我們知道,IP地址(IPv4)是一個4字節(jié)32位的正整數(shù),那么一共只有2的32次方個IP地址,大概是43億左右,而TCP/IP協(xié)議規(guī)定,每個主機(jī)都需要有一個IP地址。
這意味著,一共只有43億臺主機(jī)接入網(wǎng)絡(luò)嗎?
實(shí)際上,由于一些特殊的IP地址的存在,數(shù)量遠(yuǎn)遠(yuǎn)不足43億,另外IP地址并非是按照主機(jī)臺數(shù)來劃分的,而是每一個網(wǎng)卡都需要配置一個或多個IP地址。
CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率,減少了浪費(fèi),但是IP地址的絕對上限并沒有增加),仍然是不夠用,這時候有三種方案提出:
- 動態(tài)分配IP地址:只給接入網(wǎng)絡(luò)的設(shè)備分配IP地址,一次同一個MAC地址的設(shè)備,每次接入互聯(lián)網(wǎng)中,得到的IP地址不一定是相同的
- IPv6:IPv6并不是IPv4的簡單升級版,這是兩個互不相干的協(xié)議,彼此并不兼容,IPv6用16字節(jié)128位來表示一個IP地址,但是目前IPv6并未普及
- NAT技術(shù):內(nèi)網(wǎng)IP切公網(wǎng)IP
私網(wǎng)IP和公網(wǎng)IP
如果一個組織內(nèi)部組建局域網(wǎng),IP地址只用于局域網(wǎng)內(nèi)的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC1918規(guī)定了用于組建局域網(wǎng)的私有IP地址。
- 10.* ,前8位是網(wǎng)絡(luò)號,共 16 777 216 個地址
- 172.16.*?~ 172.31.* ,前12位是網(wǎng)絡(luò)號,共 1 048 576 個地址
- 192.168.* ~ 192.168.* ,前16位是網(wǎng)絡(luò)號,共 65 536 個地址
- 包含在這些范圍內(nèi)的都是私網(wǎng)IP,其它的則稱為全局IP(公網(wǎng)IP)
特殊的IP地址
- 將IP地址中的主機(jī)地址全部設(shè)置為0,就成為了網(wǎng)絡(luò)號,代表這個局域網(wǎng)?
- 將IP地址中的主機(jī)地址全部設(shè)置為1,就成為了廣播地址,用于給同一個鏈路中的互相連接的所有主機(jī)發(fā)送數(shù)據(jù)包
- 127.* 的IP地址用于本機(jī)環(huán)回(loop back)測試,通常是127.0.0.1
五、路由
路由:在復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)中,找出一條通往終點(diǎn)的路線。
- 一個路由器可以配置兩個IP地址,一個是WAN口IP,一個是LAN口IP(子網(wǎng)IP)
- 路由器LAN口連接的主機(jī),從屬于這個路由器的子網(wǎng)中
- 不同的路由器,子網(wǎng)IP其實(shí)都是一樣的(通常都是192.168.1.1),子網(wǎng)中的主機(jī)IP不能重復(fù),但是子網(wǎng)之間的主機(jī)IP可以重復(fù)了
- 每一個家用路由器,其實(shí)又作為運(yùn)營商路由器的子網(wǎng)中的一個節(jié)點(diǎn),這樣的運(yùn)營商路由器可能會有很多級,最外層的運(yùn)營商路由器,WAN接口就是公網(wǎng)IP了
- 子網(wǎng)內(nèi)的主機(jī)需要和外網(wǎng)進(jìn)行通行時,路由器將IP首部中的IP地址進(jìn)行替換(替換成WAN口IP),這樣逐級替換,最終數(shù)據(jù)包中的IP地址稱為一個公網(wǎng)IP,這樣的技術(shù)就是NAT(Network Address Translation, 網(wǎng)絡(luò)地址轉(zhuǎn)換)
如果希望我們自己實(shí)現(xiàn)的服務(wù)器能夠在公網(wǎng)上能訪問到,就需要把程序部署在具有外網(wǎng)IP的服務(wù)器上,這樣的服務(wù)器可以在阿里云/騰訊云上面訪問到。
路由的過程,就是這樣“一跳一跳”(Hop by Hop)“問路”的過程,所謂的“一跳”就是數(shù)據(jù)鏈路層中的一個區(qū)間,具體在以太網(wǎng)中指從源MAC地址到目的MAC地址之間的幀傳輸區(qū)間。
路由在問路的過程中,會先詢問“目標(biāo)網(wǎng)絡(luò)”的地址,到達(dá)“目標(biāo)網(wǎng)絡(luò)”之后,再詢問目標(biāo)“目標(biāo)主機(jī)”的地址。
IP數(shù)據(jù)包的傳輸過程也一樣,當(dāng)IP數(shù)據(jù)包,到達(dá)路由器時,路由器會先查看目的IP,路由器決定這個數(shù)據(jù)包是能直接發(fā)送給目標(biāo)主機(jī)還是發(fā)送給下一個路由器,依次反復(fù)直到發(fā)送給目的IP地址。
那么如何判定當(dāng)前這個數(shù)據(jù)包該發(fā)送到哪里呢?這個就依靠每個節(jié)點(diǎn)內(nèi)部維護(hù)一個路由表。
- 路由表可以用route命令查看
- 如果目的IP命中了路由表,就直接轉(zhuǎn)發(fā)即可
- 路由表中的最后一行,主要由下一跳地址和發(fā)送接口兩部分組成,當(dāng)目的地址與路由表中其它行都不匹配時,就按缺省路由條目規(guī)定的接口發(fā)送到下一跳地址
假設(shè)某主機(jī)的網(wǎng)絡(luò)接口配置和路由表如下:
- 這臺主機(jī)有兩個網(wǎng)絡(luò)接口,一個網(wǎng)絡(luò)接口連到192.168.10.0/24,另一個網(wǎng)絡(luò)接口連到192.168.56.0/24這個網(wǎng)絡(luò)
- 路由表的Destination是目的網(wǎng)絡(luò)地址,Genmask是子網(wǎng)掩碼,Gateway是下一跳地址,Iface是發(fā)送地址,F(xiàn)lags中的U標(biāo)志表示此條目有效,G標(biāo)志表示此條目的下一跳地址是某個路由器的地址,沒有G標(biāo)志的條目表示目的網(wǎng)絡(luò)地址是與本機(jī)直接向量的網(wǎng)絡(luò),不用經(jīng)過路由器轉(zhuǎn)發(fā)
轉(zhuǎn)發(fā)示例1:要發(fā)送數(shù)據(jù)的目的地址是192.168.56.3
- 跟第一行的子網(wǎng)掩碼做運(yùn)算得到192.168.56.0,與第一行的目的網(wǎng)絡(luò)地址不符
- 再跟第二行的子網(wǎng)掩碼做與運(yùn)算得到192.168.56.0,正是第二行的目的網(wǎng)路地址,因此從eth1接口發(fā)送過去
- 由于192.168.56/24正是與eth1接口直接相連的網(wǎng)絡(luò),因此可以直接發(fā)送到目的主機(jī),不需要經(jīng)過路由器轉(zhuǎn)發(fā)
轉(zhuǎn)發(fā)示例2:要發(fā)送的數(shù)據(jù)的目的地址是202.10.1.2
- 依次和路由表前幾項(xiàng)進(jìn)行對比,發(fā)現(xiàn)都不匹配
- 按缺省路由條目,從eth0接口發(fā)出去,發(fā)往192.168.10.1路由器
- 由192.168.10.1路由器根據(jù)它的路由表決定下一跳地址
六、分片和組裝
數(shù)據(jù)在網(wǎng)絡(luò)中是以MAC幀的格式進(jìn)行傳輸,每個MAC幀的最大長度是1500字節(jié),故長度大于1500字節(jié)的數(shù)據(jù)報(bào)需要進(jìn)行分片發(fā)送,到達(dá)目的地址之后再進(jìn)行組裝。
文章來源:http://www.zghlxwxcb.cn/news/detail-609688.html
- 如何判斷一個報(bào)文是否被分片了?通過3位標(biāo)志進(jìn)行判斷,如果某個報(bào)文存在3位標(biāo)志的更多分片標(biāo)志為1的分片,則這個報(bào)文被分片了。
- 同一個報(bào)文的分片如何識別?通過16位標(biāo)識識別,同一個報(bào)文的不同分片,它們的16位標(biāo)識是一樣的。
- 哪一個分片是第一個?哪一個分片是最后一個?通過3位標(biāo)志和13位片偏移判斷,如果3位標(biāo)志的更多分片標(biāo)志為1且13位片偏移為0,則是第一個分片,如果3位標(biāo)志的更多分片標(biāo)志為0且13位片偏移不為0,則是最后一個分片。
- 如何判斷分片有沒有全部被接收?當(dāng)前的起始位置 + 自身長度 = 下一個報(bào)文中填充的偏移量大小,通過這個進(jìn)行判斷接收到的分片有沒有缺失。
- 如何對接收到的全部分片進(jìn)行組裝?按照片偏移量對分片進(jìn)行升序排序即可。
分片好嗎?分片并不好,分片越多數(shù)據(jù)丟失的幾率就越大,丟失一個報(bào)文就需要重新發(fā)送全部報(bào)文,故分片并不是在通信時的主流情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-609688.html
到了這里,關(guān)于【Linux后端服務(wù)器開發(fā)】IP協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!