IP協(xié)議與硬件地址
- 硬件地址(物理地址):數(shù)據(jù)鏈路層和物理層使用的地址
-
IP地址(邏輯地址):網(wǎng)絡(luò)層及以上各層使用的地址
在發(fā)送數(shù)據(jù)時(shí),都是自上而下汽纤,最后才到通信鏈路上傳輸趁仙。使用IP地址的IP數(shù)據(jù)報(bào)一旦提交給數(shù)據(jù)鏈路層就封裝成了MAC幀,MAC幀在傳輸時(shí)都使用的是硬件地址拥褂,這兩個(gè)地址都寫在MAC幀的首部求橄。
連接在通信鏈路的設(shè)備接受到MAC幀時(shí)今野,根據(jù)MAC幀首部中硬件地址決定丟棄或者接受。只有剝?nèi)AC幀的首部尾部把MAC層的數(shù)據(jù)上交給網(wǎng)絡(luò)層以后罐农,網(wǎng)絡(luò)層才能在IP數(shù)據(jù)報(bào)中找到源IP地址和目標(biāo)IP地址条霜。
注意幾點(diǎn):
- IP層抽象的互聯(lián)網(wǎng)上只能看到IP數(shù)據(jù)報(bào)
- 雖然IP數(shù)據(jù)報(bào)首部中有源地址,但只根據(jù)目標(biāo)地址的網(wǎng)絡(luò)號(hào)進(jìn)行路由選擇
- 局域網(wǎng)的鏈路層傳輸只能看見(jiàn)MAC幀涵亏,IP數(shù)據(jù)報(bào)被封裝在MAC幀的中
- IP層抽象的互聯(lián)網(wǎng)屏蔽了許多的底層細(xì)節(jié)宰睡,能夠使用同一的蒲凶、抽象的IP協(xié)議研究主機(jī)與主機(jī)、主機(jī)與路由之間的通信
地址解析協(xié)議ARP
簡(jiǎn)介
地址解析協(xié)議拆内,即ARP(Address Resolution Protocol)旋圆,是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。是解決統(tǒng)一局域網(wǎng)的IP地址和硬件地址映射的問(wèn)題麸恍。
ARP高速緩存
ARP高速運(yùn)行的關(guān)鍵是每個(gè)主機(jī)都有一個(gè)ARP高速緩存灵巧,存放最近的internet地址到硬件之間的映射紀(jì)錄,每一項(xiàng)的生產(chǎn)時(shí)間為20分鐘抹沪。
一個(gè)簡(jiǎn)單的流程
主機(jī)A向同網(wǎng)內(nèi)的主機(jī)B發(fā)送數(shù)據(jù)刻肄,現(xiàn)在A的ARP告訴緩存中查找是否有B的IP地址,若有融欧,則在ARP高速緩存中查找B的MAC地址敏弃,再把這個(gè)硬件地址寫入MAC幀,通過(guò)局域網(wǎng)將該MAC幀發(fā)給該地址噪馏。
若沒(méi)有查找到麦到,主機(jī)A自動(dòng)運(yùn)行ARP,并通過(guò)以下流程找到B的MAC地址:
- 通過(guò)本地局域網(wǎng)廣播發(fā)送一個(gè)ARP請(qǐng)求分組逝薪,請(qǐng)求分組中同時(shí)將A自己的IP地址與硬件地址的映射協(xié)議ARP請(qǐng)求分組中
- 本局域網(wǎng)中所有主機(jī)上運(yùn)行的ARP進(jìn)程都收到該ARP請(qǐng)求分組
- 各主機(jī)將這個(gè)請(qǐng)求傳回網(wǎng)絡(luò)層隅要,對(duì)比IP地址蝴罪,檢驗(yàn)是否可以接受董济,如果不行,則直接丟失這個(gè)信息要门,如果可以那么向主機(jī)A回復(fù)ARP請(qǐng)求虏肾,同時(shí)在該回復(fù)中寫入自己的硬件地址以及在自己的ARP高速緩存中寫入A的IP地址與硬件地址的映射
- 主機(jī)A收到主機(jī)B的ARP響應(yīng)分組,在A的ARP高速緩存中協(xié)議主機(jī)B的IP地址與硬件地址的映射
地址解析協(xié)議幾種經(jīng)典應(yīng)用場(chǎng)景
發(fā)送方是主機(jī)H1欢搜,要把IP數(shù)據(jù)報(bào)發(fā)送到同一個(gè)網(wǎng)絡(luò)上的另一個(gè)主機(jī)H2.這時(shí)H1發(fā)送ARP請(qǐng)求分組(在網(wǎng)1上廣播)封豪,找到目的主機(jī)H2的硬件地址;
發(fā)送方是主機(jī)H1炒瘟,要把IP數(shù)據(jù)報(bào)發(fā)送到另一個(gè)網(wǎng)絡(luò)上的另一個(gè)主機(jī)H3.這時(shí)H1發(fā)送ARP請(qǐng)求分組(在網(wǎng)1上廣播)吹埠,找到網(wǎng)1的一個(gè)路由器R1,剩下的工作由路由器R1來(lái)完成疮装;
發(fā)送方是路由器R1缘琅,要把IP數(shù)據(jù)報(bào)發(fā)送到R1連接在同一個(gè)網(wǎng)絡(luò)(網(wǎng)2 )上的主機(jī)H3。這時(shí)R1發(fā)送ARP請(qǐng)求分組(在網(wǎng)2上廣播)廓推,找到目的主機(jī)H3的硬件地址刷袍;
發(fā)送方是路由器R1,要把IP數(shù)據(jù)報(bào)發(fā)送到網(wǎng)3上的一個(gè)主機(jī)H4樊展。這時(shí)R1發(fā)送ARP請(qǐng)求分組(在網(wǎng)2上廣播)呻纹,找到連接在網(wǎng)2上的一個(gè)路由器R2的硬件地址堆生,剩下的工作由路由器R2來(lái)完成。
IP數(shù)據(jù)報(bào)格式
簡(jiǎn)介
TCP/IP標(biāo)準(zhǔn)中雷酪,各種數(shù)據(jù)報(bào)格式以32位(4字節(jié))為單位萊描述淑仆。
一個(gè)IP數(shù)據(jù)報(bào)由首部和數(shù)據(jù)報(bào)部分組成,首部的前一部分是固定長(zhǎng)度哥力,共20字節(jié)糯景,是所有IP數(shù)據(jù)報(bào)必須具有的。在首部的固定部分的后面是一些可選字段省骂,其長(zhǎng)度是可變的蟀淮。首部中的源地址和目的地址都是IP協(xié)議地址
各字段含義
版本
占4位,指IP協(xié)議的版本钞澳。通信雙方使用的IP協(xié)議版本必須一致怠惶。目前廣泛使用的IP協(xié)議版本號(hào)為4(即IPv4)。
首部長(zhǎng)度
占4位轧粟,可表示的最大十進(jìn)制數(shù)值是15策治。請(qǐng)注意,這個(gè)字段所表示數(shù)的單位是32位字長(zhǎng)(1個(gè)32位字長(zhǎng)是4字節(jié))兰吟,因此通惫,當(dāng)IP的首部長(zhǎng)度為1111時(shí)(即十進(jìn)制的15),首部長(zhǎng)度就達(dá)到60字節(jié)混蔼。當(dāng)IP分組的首部長(zhǎng)度不是4字節(jié)的整數(shù)倍時(shí)履腋,必須利用最后的填充字段加以填充。因此數(shù)據(jù)部分永遠(yuǎn)在4字節(jié)的整數(shù)倍開(kāi)始惭嚣,這樣在實(shí)現(xiàn)IP協(xié)議時(shí)較為方便遵湖。。最常用的首部長(zhǎng)度就是20字節(jié)(即首部長(zhǎng)度為0101)晚吞,這時(shí)不使用任何選項(xiàng)延旧。
區(qū)分服務(wù)
占8位。這個(gè)字段在舊標(biāo)準(zhǔn)中叫做服務(wù)類型槽地,但實(shí)際上一直沒(méi)有被使用過(guò)迁沫。1998年IETF把這個(gè)字段改名為區(qū)分服務(wù)DS(Differentiated Services)。只有在使用區(qū)分服務(wù)時(shí)捌蚊,這個(gè)字段才起作用集畅。
總長(zhǎng)度
總長(zhǎng)度指首部和數(shù)據(jù)之和的長(zhǎng)度,單位為字節(jié)逢勾∧嫡總長(zhǎng)度字段為16位,因此數(shù)據(jù)報(bào)的最大長(zhǎng)度為216-1=65535字節(jié)溺拱。
在IP層下面的每一種數(shù)據(jù)鏈路層都有自己的幀格式逃贝,其中包括幀格式中的數(shù)據(jù)字段的最大長(zhǎng)度谣辞,這稱為最大傳送單元MTU(Maximum Transfer Unit)。當(dāng)一個(gè)數(shù)據(jù)報(bào)封裝成鏈路層的幀時(shí)沐扳,此數(shù)據(jù)報(bào)的總長(zhǎng)度(即首部加上數(shù)據(jù)部分)一定不能超過(guò)下面的數(shù)據(jù)鏈路層的MTU值泥从。
在進(jìn)行分片是,數(shù)據(jù)報(bào)首部的總長(zhǎng)度字段指分片后的每一個(gè)分片的首部長(zhǎng)度與該分片的數(shù)據(jù)長(zhǎng)度的總和
(5)標(biāo)識(shí)(identification) 占16位沪摄。IP軟件在存儲(chǔ)器中維持一個(gè)計(jì)數(shù)器躯嫉,每產(chǎn)生一個(gè)數(shù)據(jù)報(bào),計(jì)數(shù)器就加1杨拐,并將此值賦給標(biāo)識(shí)字段祈餐。但這個(gè)“標(biāo)識(shí)”并不是序號(hào),因?yàn)镮P是無(wú)連接服務(wù)哄陶,數(shù)據(jù)報(bào)不存在按序接收的問(wèn)題帆阳。當(dāng)數(shù)據(jù)報(bào)由于長(zhǎng)度超過(guò)網(wǎng)絡(luò)的MTU而必須分片時(shí),這個(gè)標(biāo)識(shí)字段的值就被復(fù)制到所有的數(shù)據(jù)報(bào)的標(biāo)識(shí)字段中屋吨。相同的標(biāo)識(shí)字段的值使分片后的各數(shù)據(jù)報(bào)片最后能正確地重裝成為原來(lái)的數(shù)據(jù)報(bào)蜒谤。
標(biāo)志(flag)
占3位,但目前只有2位有意義至扰。
標(biāo)志字段中的最低位記為MF(More Fragment)鳍徽。MF=1即表示后面“還有分片”的數(shù)據(jù)報(bào)。MF=0表示這已是若干數(shù)據(jù)報(bào)片中的最后一個(gè)敢课。
標(biāo)志字段中間的一位記為DF(Don’t Fragment)阶祭,意思是“不能分片”。只有當(dāng)DF=0時(shí)才允許分片翎猛。
片偏移
占13位胖翰。片偏移指出:較長(zhǎng)的分組在分片后接剩,某片在原分組中的相對(duì)位置切厘。也就是說(shuō),相對(duì)用戶數(shù)據(jù)字段的起點(diǎn)懊缺,該片從何處開(kāi)始疫稿。片偏移以8個(gè)字節(jié)為偏移單位。這就是說(shuō)鹃两,每個(gè)分片的長(zhǎng)度一定是8字節(jié)(64位)的整數(shù)倍遗座。
生存時(shí)間
占8位,生存時(shí)間字段常用的的英文縮寫是TTL(Time To Live)俊扳,表明是數(shù)據(jù)報(bào)在網(wǎng)絡(luò)中的壽命途蒋。由發(fā)出數(shù)據(jù)報(bào)的源點(diǎn)設(shè)置這個(gè)字段。其目的是防止無(wú)法交付的數(shù)據(jù)報(bào)無(wú)限制地在因特網(wǎng)中兜圈子馋记,因而白白消耗網(wǎng)絡(luò)資源号坡。最初的設(shè)計(jì)是以秒作為TTL的單位懊烤。每經(jīng)過(guò)一個(gè)路由器時(shí),就把TTL減去數(shù)據(jù)報(bào)在路由器消耗掉的一段時(shí)間宽堆。若數(shù)據(jù)報(bào)在路由器消耗的時(shí)間小于1秒腌紧,就把 TTL值減1。當(dāng)TTL值為0時(shí)畜隶,就丟棄這個(gè)數(shù)據(jù)報(bào)壁肋。
TTL通常是32或者64,scapy中默認(rèn)是64
協(xié)議
占8位籽慢,協(xié)議字段指出此數(shù)據(jù)報(bào)攜帶的數(shù)據(jù)是使用何種協(xié)議浸遗,以便使目的主機(jī)的IP層知道應(yīng)將數(shù)據(jù)部分上交給哪個(gè)處理過(guò)程。(在scapy中箱亿,下層的這個(gè)protocol一般可以從上曾繼承而來(lái)乙帮,自動(dòng)填充,我們一般可以省略不填此項(xiàng))
常用協(xié)議和字段對(duì)應(yīng)值:
首部檢驗(yàn)和
占16位极景。這個(gè)字段只檢驗(yàn)數(shù)據(jù)報(bào)的首部察净,但不包括數(shù)據(jù)部分。這是因?yàn)閿?shù)據(jù)報(bào)每經(jīng)過(guò)一個(gè)路由器盼樟,路由器都要重新計(jì)算一下首部檢驗(yàn)和(一些字段氢卡,如生存時(shí)間、標(biāo)志晨缴、片偏移等都可能發(fā)生變化)译秦。不檢驗(yàn)數(shù)據(jù)部分可減少計(jì)算的工作量
源地址
占32位
目的地址
占32位
IP層轉(zhuǎn)發(fā)分組流程
根據(jù)目的網(wǎng)絡(luò)地址來(lái)確定下一跳路由器
IP數(shù)據(jù)報(bào)最終一定可以找到目的主機(jī)所在目的網(wǎng)絡(luò)上的路由器(可能要通過(guò)多次的間接交付)。
只有到達(dá)最后一個(gè)路由器時(shí)击碗,才試圖向目的主機(jī)進(jìn)行直接交付筑悴。
注:在互聯(lián)網(wǎng)上轉(zhuǎn)發(fā)分組時(shí),是從一個(gè)路由器轉(zhuǎn)發(fā)到下一個(gè)路由器稍途「罅撸總之,在路由表中械拍,對(duì)每一條路由最主要的是以下兩個(gè)信息:(目的網(wǎng)絡(luò)地址突勇,下一跳地址)。
特定主機(jī)路由
雖然因特網(wǎng)所有的分組轉(zhuǎn)發(fā)都是基于目的主機(jī)所在的網(wǎng)絡(luò)坷虑,但在大多數(shù)情況下都允許有這樣的特例甲馋,即對(duì)特定的目的主機(jī)指明的一個(gè)路由。迄损,這種路由叫做特定主機(jī)路由定躏。
采用特定主機(jī)路由的好處:
(1)可使網(wǎng)絡(luò)管理人員能夠更方便地控制網(wǎng)絡(luò)和測(cè)試網(wǎng)絡(luò),同時(shí)也可在需要考慮某種安全問(wèn)題時(shí)采用這種特定主機(jī)路由。
(2)在對(duì)網(wǎng)絡(luò)的連接或路由表進(jìn)行排錯(cuò)時(shí)痊远,指明到某一主機(jī)的特定路由就十分有用绑谣。
注:特定主機(jī)路由是要到某一臺(tái)機(jī)器的路由。特定網(wǎng)絡(luò)路由是你到某一個(gè)子網(wǎng)的路由拗引。特定主機(jī)路由也可視為特定網(wǎng)絡(luò)路由的一個(gè)特例借宵,即Mask為255.255.255.255的特定網(wǎng)絡(luò)路由。
默認(rèn)路由
默認(rèn)路由是一種特殊的靜態(tài)路由矾削,指的是當(dāng)路由表中與包的目的地址之間沒(méi)有匹配的表項(xiàng)時(shí)路由器能夠做出的選擇壤玫。
如果沒(méi)有默認(rèn)路由,那么目的地址在路由表中沒(méi)有匹配表項(xiàng)的包將被丟棄
哼凯。
默認(rèn)路由在某些時(shí)候非常有效欲间,當(dāng)存在末梢網(wǎng)絡(luò)時(shí),默認(rèn)路由會(huì)大大簡(jiǎn)化路由器的配置断部,減輕管理員的工作負(fù)擔(dān)猎贴,提高網(wǎng)絡(luò)性能。
主機(jī)里的默認(rèn)路由通常被稱作默認(rèn)網(wǎng)關(guān)蝴光,默認(rèn)網(wǎng)關(guān)通常會(huì)是一個(gè)有過(guò)濾功能的設(shè)備她渴,如防火墻和代理服務(wù)器。
默認(rèn)路由和靜態(tài)路由的命令格式一樣蔑祟,只是把目的地ip和子網(wǎng)掩碼改成0.0.0.0和0.0.0.0趁耗,默認(rèn)路由只能存在末梢網(wǎng)絡(luò)中。
分組轉(zhuǎn)發(fā)算法
注:當(dāng)發(fā)送一連串的數(shù)據(jù)報(bào)時(shí)疆虚,上述的這種查找路由表苛败、計(jì)算硬件地址、寫入MAC幀的首部等過(guò)程径簿,將不斷地重復(fù)進(jìn)行罢屈,造成了一定的開(kāi)銷。盡管如此篇亭,也不能在路由表中直接使用硬件地址缠捌,因?yàn)槭褂贸橄蟮腎P地址,就是為了屏蔽各種底層網(wǎng)絡(luò)的復(fù)雜性而便于分析和研究問(wèn)題暗赶,這樣就不可避免地多了一些開(kāi)銷鄙币。
(1)從數(shù)據(jù)報(bào)的首部提取目的主機(jī)的IP地址D,得出目的網(wǎng)絡(luò)地址為N蹂随。
(2)若N就是與此路由器直接相連的某個(gè)網(wǎng)絡(luò)地址,則進(jìn)行直接交付因惭,不需要再經(jīng)過(guò)其他的路由器岳锁,直接把數(shù)據(jù)報(bào)交付給目的主機(jī)(這里包括把目的主機(jī)地址D轉(zhuǎn)換為具體的硬件地址,把數(shù)據(jù)報(bào)封裝為MAC幀蹦魔,再發(fā)送此幀)激率;否則就要執(zhí)行(3)進(jìn)行間接交付咳燕。
(3)若路由表中有目的地址為D的特定主機(jī)路由,則把數(shù)據(jù)報(bào)傳送給路由表中所指明的下一跳路由器乒躺,否則執(zhí)行(4)招盲。
(4)若路由表中有到達(dá)網(wǎng)絡(luò)N的路由,則把數(shù)據(jù)報(bào)傳送給路由表中所指明的下一跳路由器嘉冒,否則執(zhí)行(5)曹货。
(5)若路由表中有一個(gè)默認(rèn)路由,則把數(shù)據(jù)報(bào)傳送給路由表中所指明的下一跳路由器讳推,否則執(zhí)行(6)顶籽。
(6)報(bào)告轉(zhuǎn)發(fā)分組出錯(cuò)。