網(wǎng)絡(luò)層(network layer)是實現(xiàn)互聯(lián)網(wǎng)的最重要的一層。正是在網(wǎng)絡(luò)層面上,各個局域網(wǎng)根據(jù)IP協(xié)議相互連接,最終構(gòu)成覆蓋全球的Internet。更高層的協(xié)議,無論是TCP還是UDP,必須通過網(wǎng)絡(luò)層的IP數(shù)據(jù)包(datagram)來傳遞信息。操作系統(tǒng)也會提供該層的socket,從而允許用戶直接操作IP包。
創(chuàng)新互聯(lián)主要企業(yè)基礎(chǔ)官網(wǎng)建設(shè),電商平臺建設(shè),移動手機平臺,小程序制作等一系列專為中小企業(yè)定制網(wǎng)站開發(fā)產(chǎn)品體系;應(yīng)對中小企業(yè)在互聯(lián)網(wǎng)運營的各種問題,為中小企業(yè)在互聯(lián)網(wǎng)的運營中保駕護(hù)航。
IP數(shù)據(jù)包是符合IP協(xié)議的信息(也就是0/1序列),我們后面簡稱IP數(shù)據(jù)包為IP包。IP包分為頭部(header)和數(shù)據(jù)(Data)兩部分。數(shù)據(jù)部分是要傳送的信息,頭部是為了能夠?qū)崿F(xiàn)傳輸而附加的信息(這與以太網(wǎng)幀的頭部功能相類似,如果對幀感到陌生,可參看 小喇叭 一文)。
IP協(xié)議可以分為IPv4和IPv6兩種。IPv6是改進(jìn)版本,用于在未來取代IPv4協(xié)議。出于本文的目的,我們可以暫時忽略兩者的區(qū)別,只以IPv4為例。下面是IPv4的格式
IPv4包 我們按照4 bytes將整個序列折疊,以便更好的顯示
與幀類似,IP包的頭部也有多個區(qū)域。我們將注意力放在紅色的發(fā)出地(source address)和目的地(destination address)。它們都是IP地址。IPv4的地址為4 bytes的長度(也就是32位)。我們通常將IPv4的地址分為四個十進(jìn)制的數(shù),每個數(shù)的范圍為0-255,比如192.0.0.1就是一個IP地址。填寫在IP包頭部的是該地址的二進(jìn)制形式。
IP地址是全球地址,它可以識別”社區(qū)”(局域網(wǎng))和”房子”(主機)。這是通過將IP地址分類實現(xiàn)的。
IP class??? From????????? To??????????????? Subnet Mask
A?????????? 1.0.0.0?????? 126.255.255.255??? 255.0.0.0
B?????????? 128.0.0.0???? 191.255.255.255??? 255.255.0.0
C?????????? 192.0.0.0???? 223.255.255.255??? 255.255.255.0
每個IP地址的32位分為前后兩部分,第一部分用來區(qū)分局域網(wǎng),第二個部分用來區(qū)分該局域網(wǎng)的主機。子網(wǎng)掩碼(Subnet Mask)告訴我們這兩部分的分界線,比如255.0.0.0(也就是8個1和24個0)表示前8位用于區(qū)分局域網(wǎng),后24位用于區(qū)分主機。由于A、B、C分類是已經(jīng)規(guī)定好的,所以當(dāng)一個IP地址屬于B類范圍時,我們就知道它的前16位和后16位分別表示局域網(wǎng)和主機。
網(wǎng)絡(luò)協(xié)議概覽 中說,IP地址是分配給每個房子(計算機)的“郵編”。但這個說法并不精確。IP地址實際上識別的是網(wǎng)卡(NIC, Network Interface Card)。網(wǎng)卡是計算機的一個硬件,它在接收到網(wǎng)路信息之后,將信息交給計算機(處理器/內(nèi)存)。當(dāng)計算機需要發(fā)送信息的時候,也要通過網(wǎng)卡發(fā)送。一臺計算機可以有不只一個網(wǎng)卡,比如筆記本就有一個以太網(wǎng)卡和一個WiFi網(wǎng)卡。計算機在接收或者發(fā)送信息的時候,要先決定想要通過哪個網(wǎng)卡。
NIC
路由器(router)實際上就是一臺配備有多個網(wǎng)卡的專用電腦。它讓網(wǎng)卡接入到不同的網(wǎng)絡(luò)中,這樣,就構(gòu)成在 網(wǎng)絡(luò)協(xié)議概覽 中所說的郵局。比如下圖中位于中間位置的路由器有兩個網(wǎng)卡,地址分別為199.165.145.17和199.165.146.3。它們分別接入到兩個網(wǎng)絡(luò):199.165.145和199.165.146。
IP包的傳輸要通過路由器的接力。每一個主機和路由中都存有一個路由表(routing table)。路由表根據(jù)目的地的IP地址,規(guī)定了等待發(fā)送的IP包所應(yīng)該走的路線。就好像下圖的路標(biāo),如果地址是“東京”,那么請轉(zhuǎn)左;如果地址是“悉尼”,那么請向右。
A real world routing table
比如我們從主機145.17生成發(fā)送到146.21的IP包:鋪開信紙,寫好信的開頭(剩下數(shù)據(jù)部分可以是TCP包,可以是UDP包,也可以是任意亂寫的字,我們暫時不關(guān)心),注明目的地IP地址(199.165.146.21)和發(fā)出地IP地址(199.165.145.17)。主機145.17隨后參照自己的routing table,里面有三行記錄:
145.17 routing table (Genmask為子網(wǎng)掩碼,Iface用于說明使用哪個網(wǎng)卡接口)
Destination??????? Gateway ? ? ? ? ? ? Genmask ? ? ? ? ? ? Iface
199.165.145.0????? 0.0.0.0???????????? 255.255.255.0?????? eth0
0.0.0.0???????? ?? 199.165.145.17????? 0.0.0.0???????????? eth0
這里有兩行記錄。
第一行表示,如果IP目的地是199.165.145.0這個網(wǎng)絡(luò)的主機,那么只需要自己在eth0上的網(wǎng)卡直接傳送(“本地社區(qū)”:直接送達(dá)),不需要前往router(Gateway 0.0.0.0 = “本地送信”)。
第二行表示所有不符合第一行的IP目的地,都應(yīng)該送往Gateway 199.165.145.17,也就是中間router接入在eth0的網(wǎng)卡IP地址(郵局在eth0的分支)。
我們的IP包目的地為199.165.146.21,不符合第一行,所以按照第二行,發(fā)送到中間的router。主機145.17會將IP包放入幀的payload,并在幀的頭部寫上199.165.145.17對應(yīng)的MAC地址,這樣,就可以按照 以太網(wǎng)與wifi協(xié)議 中的方法在局域網(wǎng)中傳送了。
中間的router在收到IP包之后(實際上是收到以太協(xié)議的幀,然后從幀中的payload讀取IP包),提取目的地IP地址,然后對照自己的routing table:
Destination??????? Gateway ? ? ? ? ? ? Genmask ? ? ? ? ? ? Iface
199.165.145.0????? 0.0.0.0???????????? 255.255.255.0?????? eth0
199.165.146.0????? 0.0.0.0???????????? 255.255.255.0?????? eth1
0.0.0.0???????? ?? 199.165.146.8 ??? ? 0.0.0.0???????????? eth1
從前兩行我們看到,由于router橫跨eth0和eth1兩個網(wǎng)絡(luò),它可以直接通過eth0和eth1上的網(wǎng)卡直接傳送IP包。
第三行表示,如果是前面兩行之外的IP地址,則需要通過eth1,送往199.165.146.8(右邊的router)。
我們的目的地符合第二行,所以將IP放入一個新的幀中,
在幀的頭部寫上199.165.146.21的MAC地址,直接發(fā)往主機146.21。
(在Linux下,可以使用$route -n來查看routing table)
IP包可以進(jìn)一步接力,到達(dá)更遠(yuǎn)的主機。IP包從主機出發(fā),根據(jù)沿途路由器的routing table指導(dǎo),在router間接力。IP包最終到達(dá)某個router,這個router與目標(biāo)主機位于一個局域網(wǎng)中,可以直接建立連接層的通信。最后,IP包被送到目標(biāo)主機。這樣一個過程叫做routing(我們就叫IP包接力好了,路由這個詞實在是混合了太多的意思)。
整個過程中,IP包不斷被主機和路由封裝入幀(信封)并拆開,然后借助連接層,在局域網(wǎng)的各個NIC之間傳送幀。整個過程中,我們的IP包的內(nèi)容保持完整,沒有發(fā)生變化。最終的效果是一個IP包從一個主機傳送到另一個主機。利用IP包,我們不需要去操心底層(比如連接層)發(fā)生了什么。
在上面的過程中,我們實際上假設(shè)了,每一臺主機和路由都能了解局域網(wǎng)內(nèi)的IP地址和MAC地址的對應(yīng)關(guān)系,這是實現(xiàn)IP包封裝(encapsulation)到幀的基本條件。IP地址與MAC地址的對應(yīng)是通過ARP協(xié)議傳播到局域網(wǎng)的每個主機和路由。每一臺主機或路由中都有一個ARP cache,用以存儲局域網(wǎng)內(nèi)IP地址和MAC地址如何對應(yīng)。
ARP協(xié)議(ARP介于連接層和網(wǎng)絡(luò)層之間,ARP包需要包裹在一個幀中)的工作方式如下:主機會發(fā)出一個ARP包,該ARP包中包含有自己的IP地址和MAC地址。通過ARP包,主機以廣播的形式詢問局域網(wǎng)上所有的主機和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址嗎?擁有該IP地址的主機會回復(fù)發(fā)出請求的主機:哦,我知道,這個IP地址屬于我的一個NIC,它的MAC地址是xxxxxx。由于發(fā)送ARP請求的主機采取的是廣播形式,并附帶有自己的IP地址和MAC地址,其他的主機和路由會同時檢查自己的ARP cache,如果不符合,則更新自己的ARP cache。
這樣,經(jīng)過幾次ARP請求之后,ARP cache會達(dá)到穩(wěn)定。如果局域網(wǎng)上設(shè)備發(fā)生變動,ARP重復(fù)上面過程。
(在Linux下,可以使用$arp命令來查看ARP的過程。ARP協(xié)議只用于IPv4。IPv6使用Neighbor Discovery Protocol來替代ARP的功能。)
我們還有另一個假設(shè),就是每個主機和路由上都已經(jīng)有了合理的routing table。這個routint table描述了網(wǎng)絡(luò)的拓?fù)?topology)結(jié)構(gòu)。如果你了解自己的網(wǎng)絡(luò)連接,可以手寫自己主機的routing table。但是,一個路由器可能有多個出口,所以routing table可能會很長。更重要的是,周圍連接的其他路由器可能發(fā)生變動(比如新增路由器或者路由器壞掉),我們就需要routing table能及時將交通導(dǎo)向其他的出口。我們需要一種更加智能的探測周圍的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),并自動生成routing table。
我們以北京地鐵為例子。如果從機場前往朝陽門,那么可以采取2號航站樓-三元橋-東直門-朝陽門。2號航站樓和朝陽門分別是出發(fā)和目的主機。而三元橋和東直門為中間的兩個router。如果三元橋-東直門段因為維修停運,我們需要更改三元橋的routing table,從而給前往朝陽門的乘客(IP包)指示:請走如下路線三元橋-芍藥居。然后依照芍藥居的routing table前往朝陽門(芍藥居-東直門-朝陽門)。
一種用來生成routing table的協(xié)議是RIP(Routing Information Protocol)。它通過距離來決定routing table,所以屬于distance-vector protocol。對于RIP來說,所謂的距離是從出發(fā)地到目的地途徑的路由器數(shù)目(hop number)。比如上面從機場到朝陽門,按照2號航站樓-三元橋-東直門-朝陽門路線,途徑兩個路由器,距離為2。我們最初可以手動生成三元橋的routing table。隨后,根據(jù)RIP協(xié)議,三元橋向周圍的路由器和主機廣播自己前往各個IP的距離(比如到機場=0,團(tuán)結(jié)湖=0,國貿(mào)=1,望京西=1,建國門=2)。收到RIP包的路由器和主機根據(jù)RIP包和自己到發(fā)送RIP包的主機的距離,算出自己前往各個IP的距離。東直門與三元橋的距離為1。東直門收到三元橋的RIP包(到機場的距離為0),那么東直門途徑三元橋前往機場的距離為1+0=1。如果東直門自己的RIP記錄都比這個遠(yuǎn)(比如東直門-芍藥居-三元橋-機場 = 2)。那么東直門更改自己的routing table:前往機場的交通都發(fā)往三元橋而不是芍藥居。如果東直門自身的RIP記錄并不差,那么東直門保持routing table不變。上述過程在各個點不斷重復(fù)RIP廣播/計算距離/更新routing table的過程,最終所有的主機和路由器都能生成最合理的路徑(merge)。
(RIP的基本邏輯是:如果A距離B為6,而我距離A為1,那么我途徑A到B的距離為7)
RIP出于技術(shù)上的原因(looping hops),認(rèn)為距離超過15的IP不可到達(dá)。所以RIP更多用于互聯(lián)網(wǎng)的一部分(比如整個中國電信的網(wǎng)絡(luò))。這樣一個互聯(lián)網(wǎng)的部分往往屬于同一個ISP或者有同一個管理機構(gòu),所以叫做自治系統(tǒng)(AS,autonomous system)。自治系統(tǒng)內(nèi)部的主機和路由根據(jù)通向外部的邊界路由器來和其它的自治系統(tǒng)通信。各個邊界路由器之間通過BGP(Border Gateway Protocol)來生成自己前往其它AS的routing table,而自治系統(tǒng)內(nèi)部則參照邊界路由器,使用RIP來決定routing table。BGP的基本工作過程與RIP類似,但在考慮距離的同時,也權(quán)衡比如政策、連接性能等其他因素,再決定交通的走向(routing table)。
我們一開始講述了IP包根據(jù)routing table進(jìn)行接力的過程。為了順利實現(xiàn)接力,我們又進(jìn)一步深入到ARP和RIP/BGP。這三個協(xié)議都協(xié)助了IP傳輸。ARP讓每臺電腦和路由器知道自己局域網(wǎng)內(nèi)IP地址和MAC地址的對應(yīng)關(guān)系,從而順利實現(xiàn)IP包到幀的封裝。RIP協(xié)議可以生成自治系統(tǒng)內(nèi)部合理的routing table。BGP協(xié)議可以生成自治系統(tǒng)外部的routing table。
在整個過程中,我們都將注意力放在了IP包大的傳輸過程中,而故意忽略一些細(xì)節(jié)。 而上面的IP接力過程適用于IPv6。
【TCP/IP詳解】系列教程
互聯(lián)網(wǎng)協(xié)議入門 1
互聯(lián)網(wǎng)協(xié)議入門 2
TCP-IP協(xié)議詳解(1)網(wǎng)絡(luò)協(xié)議概觀
TCP-IP協(xié)議詳解(2) 以太網(wǎng)與WiFi協(xié)議
TCP-IP協(xié)議詳解(3) IP/ARP/RIP/BGP協(xié)議
TCP-IP協(xié)議詳解(4)IPv4與IPv6地址
TCP-IP協(xié)議詳解(5)IP協(xié)議詳解
TCP-IP協(xié)議詳解(6) ICMP協(xié)議
TCP-IP協(xié)議詳解(7) UDP協(xié)議
TCP-IP協(xié)議詳解(8) TCP協(xié)議與流通信
TCP-IP協(xié)議詳解(9) TCP連接
TCP-IP協(xié)議詳解(10) TCP滑窗管理
TCP-IP協(xié)議詳解(11) TCP重傳
TCP-IP協(xié)議詳解(12) TCP堵塞控制
TCP-IP協(xié)議詳解(13) DNS協(xié)議
TCP-IP協(xié)議詳解(14) CIDR與NAT
TCP-IP協(xié)議詳解(15) HTTP協(xié)議概覽
圖解TCP-IP協(xié)議
1.首先,右鍵點擊桌面,選擇“打開終端”,或者按CTRL+Alt+T打開終端。
2.在終端中輸入ifconfig命令并按Enter鍵運行。
3.在ifconfig命令的輸出信息中,enp3s0表示以太網(wǎng)卡。
4.hwaddr之后的信息是MAC地址,MAC地址是48位的二進(jìn)制數(shù),總共6控制的話,一般用十六進(jìn)制表示,使用每個字節(jié):
分開,每4位二進(jìn)制數(shù)的使用十六進(jìn)制數(shù)表示,每個字節(jié)有兩個十六進(jìn)制數(shù)來表達(dá),所以MAC地址有六個字段,由五個冒號分開通道。
Linux Arp命令顯示和修改地址解析協(xié)議(ARP)使用的“IP 到物理”地址轉(zhuǎn)換表。 ARP -s inet_addr eth_addr [if_addr] ARP -d inet_addr [if_addr] ARP -a [inet_addr] [-N if_addr] [-v] -a 通過詢問當(dāng)前協(xié)議數(shù)據(jù),顯示當(dāng)前ARP項。如果指定inet_addr...
linux中查看arp-1.7.0安裝成功方法如下。
1、rpm包安裝的用rpm-qa|grep軟件或者包的名字。
2、以deb包安裝的用dpkg-l|grep軟件或者包的名字。
3、yum方法安裝的,用yumlistinstalled查找。
從ip_finish_output2到dev_queue_xmit路徑:
arp協(xié)議:
(1).硬件類型:
硬件地址類型,該字段值一般為ARPHRD_ETHER,表示以太網(wǎng)。
(2).協(xié)議類型:
表示三層地址使用的協(xié)議,該字段值一般為ETH_P_IP,表示IP協(xié)議
(3)硬件地址長度,以太網(wǎng)MAC地址就是6;
(4)協(xié)議地址長度,IP地址就是4;
(5)操作碼
常見的有四種,arp請求,arp相應(yīng),rarp請求,rarp相應(yīng)。
(6)發(fā)送方硬件地址與IP地址,(7)目標(biāo)硬件地址與目標(biāo)IP地址。
arp頭數(shù)據(jù)結(jié)構(gòu):
arp模塊的初始化函數(shù)為arp_init(),這個函數(shù)在ipv4協(xié)議棧的初始化函數(shù)inet_init()中被調(diào)用。
1.初始化arp表arp_tbl;
2.注冊arp協(xié)議類型;
3.建立arp相關(guān)proc文件,/proc/net/arp;
4.注冊通知事件
一個neigh_table對應(yīng)一種鄰居協(xié)議,IPv4就是arp協(xié)議。用來存儲于鄰居協(xié)議相關(guān)的參數(shù)、功能函數(shù)、鄰居項散列表等。
一個neighbour對應(yīng)一個鄰居項,就是一個arp條目
鄰居項函數(shù)指針表,實現(xiàn)三層和二層的dev_queue_xmit()之間的跳轉(zhuǎn)。
用來存儲統(tǒng)計信息,一個結(jié)構(gòu)實例對應(yīng)一個網(wǎng)絡(luò)設(shè)備上的一種鄰居協(xié)議。
注冊arp報文類型 :dev_add_pack(arp_packet_type);
就是把arp_packet_type添加到ptype_base哈希表中。
注冊新通知事件的時候,在已經(jīng)注冊和UP的設(shè)備上,會調(diào)用一次這個通知事件。
設(shè)備事件類型:
創(chuàng)建一個鄰居項,并將其添加到散列表上,返回指向該鄰居項的指針。
tbl:待創(chuàng)建的鄰居項所屬的鄰居表,即arp_tbl;
pkey:三層協(xié)議地址(IP地址)
dev:輸出設(shè)備
want_ref:??
創(chuàng)建鄰居項
1.設(shè)置鄰居項的類型
2.設(shè)置鄰居項的ops指針
3.設(shè)置鄰居項的output函數(shù)指針
調(diào)用dst_link_failure()函數(shù)向三層報告錯誤,當(dāng)鄰居項緩存中還有未發(fā)送的報文,而該鄰居卻無法訪問時被調(diào)用。不懂。
用來發(fā)送arp請求,在鄰居項狀態(tài)定時器處理函數(shù)中被調(diào)用。
neigh:arp請求的目的鄰居項
skb:緩存在該鄰居項中的待發(fā)送報文,用來獲取該skb的源ip地址。
將得到的硬件源、目的地址,IP源、目的地址等作為參數(shù),調(diào)用arp_send()函數(shù)創(chuàng)建一個arp報文并將其輸出。
創(chuàng)建及發(fā)送arp報文
創(chuàng)建arp報文,填充字段。
發(fā)送arp報文
用來從二層接收并處理一個arp報文。這個函數(shù)中就是做了一些參數(shù)檢查,然后調(diào)用arp_process()函數(shù)。
neigh_event_ns
neigh_update
這個函數(shù)的作用就是更新鄰居項硬件地址和狀態(tài)。分支比較多。
neigh_update_notify
代理arp(proxy arp),通常像路由器這樣的設(shè)備才使用,用來代替處于另一個網(wǎng)段的主機回答本網(wǎng)段主機的arp請求。
感覺代碼ARP好像沒啥用呀。
網(wǎng)絡(luò)主機發(fā)包的一般過程:
1.當(dāng)目的IP和自己在同一網(wǎng)段時,直接arp請求該目的IP的MAC。
2.當(dāng)目的IP和自己不再同一網(wǎng)段時,arp請求默認(rèn)網(wǎng)關(guān)的MAC。
當(dāng)主機沒有默認(rèn)網(wǎng)關(guān)的時候,arp請求別的網(wǎng)段的報文,到達(dá)路由器后,本來路由器是要隔離廣播的,把這個arp請求報文給丟棄,這樣就沒法通信了。當(dāng)路由器開啟arp proxy后,路由器發(fā)現(xiàn)請求的目的IP在其他網(wǎng)段,就自己給主機回復(fù)一個arp響應(yīng)報文,這樣源主機就把路由器的MAC當(dāng)成目的IP主機對應(yīng)的MAC,可以通信了。這樣可能會造成主機arp表中,多個IP地址都對應(yīng)于路由器的同一個MAC地址。
可以使用arping命令發(fā)送指定IP的arp請求報文。
寫完了發(fā)現(xiàn)這個老妹寫的arp代理文章蠻好的,不過她好像是轉(zhuǎn)載的。
標(biāo)題名稱:Linux命令查看ARP Linux命令查看端口
URL網(wǎng)址:http://www.yijiale78.com/article14/hhijge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、云服務(wù)器、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化、網(wǎng)站維護(hù)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)