IP協(xié)議
IP協(xié)議頭格式
4位版本號(version): 指定IP協(xié)議的版本, 對于IPv4來說, 就是44位頭部長度(header length): IP頭部的長度是多少個。32bit, 也就是 length * 4 的字節(jié)數(shù). 4bit表示大 的數(shù)字是15, 因此IP頭部大長度是60字節(jié)8位服務(wù)類型(Type Of Service): 3位優(yōu)先權(quán)字段(已經(jīng)棄用), 4位TOS字段, 和1位保留字段(必須置為0). 4位 TOS分別表示: 最小延時, 大吞吐量, 高可靠性, 小成本. 這四者相互沖突, 只能選擇一個. 對于 ssh/telnet這樣的應(yīng)用程序, 小延時比較重要; 對于ftp這樣的程序, 大吞吐量比較重要.16位總長度(total length): IP數(shù)據(jù)報整體占多少個字節(jié). 64K16位標識(id): 唯一的標識主機發(fā)送的報文. 如果IP報文在數(shù)據(jù)鏈路層被分片了, 那么每一個片里面的這個 id都是相同的.3位標志字段: 第一位保留(保留的意思是現(xiàn)在不用, 但是還沒想好說不定以后要用到). 第二位置為1表示禁 止分片, 這時候如果報文長度超過MTU, IP模塊就會丟棄報文. 第三位表示"更多分片", 如果分片了的話, 后一個分片置為1, 其他是0. 類似于一個結(jié)束標記13位分片偏移(framegament o?set): 是分片相對于原始IP報文開始處的偏移. 其實就是在表示當(dāng)前分片在原報文中處在哪個位置. 實際偏移的字節(jié)數(shù)是這個值 * 8 得到的. 因此, 除了后一個報文之外, 其他報 文的長度必須是8的整數(shù)倍(否則報文就不連續(xù)了).8位生存時間(Time To Live, TTL): 數(shù)據(jù)報到達目的地的大報文跳數(shù). 一般是64. 每次經(jīng)過一個路由, TTL -= 1, 一直減到0還沒到達, 那么就丟棄了. 這個字段主要是用來防止出現(xiàn)路由循環(huán)8位協(xié)議: 表示上層協(xié)議的類型16位頭部校驗和: 使用CRC進行校驗, 來鑒別頭部是否損壞.32位源地址和32位目標地址: 表示發(fā)送端和接收端.選項字段(不定長, 多40字節(jié)): 略
網(wǎng)絡(luò)層
功能:地址管理與路由選擇
路由選擇
在復(fù)雜的網(wǎng)絡(luò)傳輸中對數(shù)據(jù)的傳輸選擇一條合適路徑
IP地址不能隨意分配,因為隨意分配就有很大概率造成IP地址沖突(數(shù)據(jù)無法發(fā)送)
解決方法:將IP地址的分配規(guī)范起來
每個路由器都能夠組建一個局域網(wǎng),這個局域網(wǎng)就應(yīng)該具有自己的網(wǎng)絡(luò)標識(網(wǎng)絡(luò)號),這個路由器向自己組建的局域網(wǎng)中的主機分配的IP地址都應(yīng)該包含這個網(wǎng)絡(luò)標識
同時為了在局域網(wǎng)中,能夠唯一標識一個主機,IP地址中還應(yīng)該包含主機標識(主機號)
IP地址的組成:網(wǎng)絡(luò)號+主機號
IP地址的分配規(guī)范起來后,只需要對網(wǎng)絡(luò)號的取值進行規(guī)范就可以了,相鄰的網(wǎng)絡(luò)不能具備相同的網(wǎng)絡(luò)號
一個路由器上相連的所有網(wǎng)絡(luò)網(wǎng)絡(luò)號不能相同,因為這些網(wǎng)絡(luò)都屬于相鄰網(wǎng)絡(luò),數(shù)據(jù)到了路由器上之后,一旦網(wǎng)絡(luò)號沖突就會導(dǎo)致路由器不知道數(shù)據(jù)該給誰
網(wǎng)段的劃分
IP地址分為兩個部分, 網(wǎng)絡(luò)號和主機號
網(wǎng)絡(luò)號: 保證相互連接的兩個網(wǎng)段具有不同的標識;主機號: 同一網(wǎng)段內(nèi), 主機之間具有相同的網(wǎng)絡(luò)號, 但是必須有不同的主機號;
早期將IP地址劃分為五類
A類 0.0.0.0到127.255.255.255B類 128.0.0.0到191.255.255.255C類 192.0.0.0到223.255.255.255D類 224.0.0.0到239.255.255.255E類 240.0.0.0到247.255.255.255
隨著Internet的飛速發(fā)展,這種劃分方案的局限性很快顯現(xiàn)出來,大多數(shù)組織都申請B類網(wǎng)絡(luò)地址, 導(dǎo)致B類地址很快就 分配完了, 而A類卻浪費了大量地址;
例如, 申請了一個B類地址, 理論上一個子網(wǎng)內(nèi)能允許6萬5千多個主機. A類地址的子網(wǎng)內(nèi)的主機數(shù)更多.然而實際網(wǎng)絡(luò)架設(shè)中, 不會存在一個子網(wǎng)內(nèi)有這么多的情況. 因此大量的IP地址都被浪費掉了.
現(xiàn)在的網(wǎng)段劃分
CIDR(Classless Interdomain Routing):
引入一個額外的子網(wǎng)掩碼(subnet mask)來區(qū)分網(wǎng)絡(luò)號和主機號;子網(wǎng)掩碼也是一個32位的正整數(shù). 通常用一串 “0” 來結(jié)尾;將IP地址和子網(wǎng)掩碼進行 “按位與” 操作, 得到的結(jié)果就是網(wǎng)絡(luò)號;網(wǎng)絡(luò)號和主機號的劃分與這個IP地址是A類、B類還是C類無關(guān);
示例
有一個網(wǎng)絡(luò)ip:192.168.122.132,netmask:255.255.255.0;現(xiàn)在要將這個網(wǎng)絡(luò)平均劃分為四個子網(wǎng),請問每個子網(wǎng)ip地址范圍以及子網(wǎng)掩碼
解:
通過ip地址和子網(wǎng)掩碼得到的原網(wǎng)絡(luò)的主機號個數(shù):256通過ip地址和子網(wǎng)掩碼得到原網(wǎng)絡(luò)的網(wǎng)絡(luò)號192.168.122.0平均劃分四個子網(wǎng),則每個子網(wǎng)主機號個數(shù)64個;0~63 就是00111111按位取反子網(wǎng)掩碼 = 255.255.255.192192.168.122.0 ~ 192.168.122.63 255.255.255.192192.168.122.64 ~ 192.168.122.127 192.168.122.128 ~ 192.168.122.191192.168.122.192 ~ 192.168.122.255
注意事項
相鄰的網(wǎng)絡(luò)不能具有相同的網(wǎng)絡(luò)號RFC1918規(guī)定,能夠用于組建私網(wǎng)的網(wǎng)段,只有以下幾種網(wǎng)段:
10.*.*.* 172.16.*.* ~ 172.31.*.* 192.168.*.*
特殊的ip地址
主機號全為1的IP地址:192.168.122.132 255.255.255.0 局域網(wǎng)的udp廣播地址 例如:192.168.122.255主機號全為0的IP地址:網(wǎng)絡(luò)號—標識一個網(wǎng)絡(luò) 例如:192.168.122.0每一個局域網(wǎng)中,這兩個主機號是不能分配給主機的,意味著主機號雖然有256個,但是能夠分配給主機的只有254個127.0.0.1 本地回環(huán)網(wǎng)卡地址----虛擬網(wǎng)卡地址—用于本機內(nèi)的網(wǎng)絡(luò)回環(huán)測試
注意事項
一個路由器可以配置兩個IP地址, 一個是WAN口IP, 一個是LAN口IP(子網(wǎng)IP).路由器LAN口連接的主機, 都從屬于當(dāng)前這個路由器的子網(wǎng)中.不同的路由器, 子網(wǎng)IP其實都是一樣的(通常都是192.168.1.1). 子網(wǎng)內(nèi)的主機IP地址不能重復(fù). 但是子網(wǎng)之 間的IP地址就可以重復(fù)了每一個家用路由器, 其實又作為運營商路由器的子網(wǎng)中的一個節(jié)點. 這樣的運營商路由器可能會有很多級, 外層的運營商路由器, WAN口IP就是一個公網(wǎng)IP子網(wǎng)內(nèi)的主機需要和外網(wǎng)進行通信時, 路由器將IP首部中的IP地址進行替換(替換成WAN口IP), 這樣逐級 替換, 終數(shù)據(jù)包中的IP地址成為一個公網(wǎng)IP. 這種技術(shù)稱為NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換).如果希望我們自己實現(xiàn)的服務(wù)器程序, 能夠在公網(wǎng)上被訪問到, 就需要把程序部署在一臺具有外網(wǎng)IP的服 務(wù)器上. 這樣的服務(wù)器可以在阿里云/騰訊云上進行購買.
路由選擇
當(dāng)IP數(shù)據(jù)包, 到達路由器時, 路由器會先查看目的IP;路由器決定這個數(shù)據(jù)包是能直接發(fā)送給目標主機, 還是需要發(fā)送給下一個路由器;依次反復(fù), 一直到達目標IP地址
那么如何判定當(dāng)前這個數(shù)據(jù)包該發(fā)送到哪里呢? 這個就依靠每個節(jié)點內(nèi)部維護一個路由表;
路由表
路由表可以使用route命令查看如果目的IP命中了路由表, 就直接轉(zhuǎn)發(fā)即可;路由表中的后一行,主要由下一跳地址和發(fā)送接口兩部分組成,當(dāng)目的地址與路由表中其它行都不匹配 時,就按缺省路由條目規(guī)定的接口發(fā)送到下一跳地址
鏈路層
功能:負責(zé)相鄰設(shè)備結(jié)點之間的數(shù)據(jù)幀傳輸;eth–以太網(wǎng)協(xié)議;交換機
以太網(wǎng)
“以太網(wǎng)” 不是一種具體的網(wǎng)絡(luò), 而是一種技術(shù)標準; 既包含了數(shù)據(jù)鏈路層的內(nèi)容, 也包含了一些物理層的 內(nèi)容. 例如: 規(guī)定了網(wǎng)絡(luò)拓撲結(jié)構(gòu), 訪問控制方式, 傳輸速率等;例如以太網(wǎng)中的網(wǎng)線必須使用雙絞線; 傳輸速率有10M, 100M, 1000M等;以太網(wǎng)是當(dāng)前應(yīng)用廣泛的局域網(wǎng)技術(shù); 和以太網(wǎng)并列的還有令牌環(huán)網(wǎng), 無線LAN等;
以太網(wǎng)幀格式
源地址和目的地址是指網(wǎng)卡的硬件地址(也叫MAC地址), 長度是48位,是在網(wǎng)卡出廠時固化的2字節(jié)上層協(xié)議類型幀協(xié)議類型字段有三種值,分別對應(yīng)IP、ARP、RARP幀末尾是CRC校驗碼。
MAC地址:
物理網(wǎng)卡設(shè)備的硬件地址 uint8_t mac[6],負責(zé)定位相鄰的設(shè)備
MAC地址用來識別數(shù)據(jù)鏈路層中相連的節(jié)點;長度為48位, 及6個字節(jié). 一般用16進制數(shù)字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)在網(wǎng)卡出廠時就確定了, 不能修改. mac地址通常是唯一的(虛擬機中的mac地址不是真實的mac地址, 可 能會沖突; 也有些網(wǎng)卡支持用戶配置mac地址).
MTU–最大傳輸單元
MTU相當(dāng)于發(fā)快遞時對包裹尺寸的限制. 這個限制是不同的數(shù)據(jù)鏈路對應(yīng)的物理層, 產(chǎn)生的限制.
以太網(wǎng)幀中的數(shù)據(jù)長度規(guī)定小46字節(jié),大1500字節(jié),ARP數(shù)據(jù)包的長度不夠46字節(jié),要在后面補填充 位;大值1500稱為以太網(wǎng)的大傳輸單元(MTU),不同的網(wǎng)絡(luò)類型有不同的MTU;如果一個數(shù)據(jù)包從以太網(wǎng)路由到撥號鏈路上,數(shù)據(jù)包長度大于撥號鏈路的MTU了,則需要對數(shù)據(jù)包進行分 片(fragmentation);不同的數(shù)據(jù)鏈路層標準的MTU是不同的;
MTU對IP協(xié)議的影響
由于數(shù)據(jù)鏈路層MTU的限制, 對于較大的IP數(shù)據(jù)包要進行分包.
將較大的IP包分成多個小包, 并給每個小包打上標簽每個小包IP協(xié)議頭的 16位標識(id) 都是相同的;每個小包的IP協(xié)議頭的3位標志字段中, 第2位置為0, 表示允許分片, 第3位來表示結(jié)束標記(當(dāng)前是否是 后一個小包, 是的話置為1, 否則置為0);到達對端時再將這些小包, 會按順序重組, 拼裝到一起返回給傳輸層一旦這些小包中任意一個小包丟失, 接收端的重組就會失敗. 但是IP層不會負責(zé)重新傳輸數(shù)據(jù)
MTU對UDP協(xié)議的影響
一旦UDP攜帶的數(shù)據(jù)超過1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就會在網(wǎng)絡(luò)層分成多個IP數(shù)據(jù)報.這多個IP數(shù)據(jù)報有任意一個丟失, 都會引起接收端網(wǎng)絡(luò)層重組失敗. 那么這就意味著, 如果UDP數(shù)據(jù)報在 網(wǎng)絡(luò)層被分片, 整個數(shù)據(jù)被丟失的概率就大大增加了udp傳輸過程中,任意一個分片出問題,整個數(shù)據(jù)包都會被丟棄,分片越多,危險越高因此udp數(shù)據(jù)包在應(yīng)用層都需要由用戶根據(jù)mss分割成合適的大小
一個報文最大大小64K包含ip頭部 udp頭部數(shù)據(jù)大小不能超過64K - 20 - 8
udp數(shù)據(jù)大小 mtu < size < 64K - 20 - 8 就會在網(wǎng)絡(luò)層進行數(shù)據(jù)分片,到了對端就會進行分片重組
MTU對TCP協(xié)議的影響
TCP的一個數(shù)據(jù)報也不能無限大, 還是受制于MTU. TCP的單個數(shù)據(jù)報的大消息長度, 稱為MSS(Max Segment Size);TCP在建立連接的過程中, 通信雙方會進行MSS協(xié)商理想的情況下, MSS的值正好是在IP不會被分片處理的大長度(這個長度仍然是受制于數(shù)據(jù)鏈路層的 MTU).雙方在發(fā)送SYN的時候會在TCP頭部寫入自己能支持的MSS值然后雙方得知對方的MSS值之后, 選擇較小的作為終MSSMSS的值就是在TCP首部的40字節(jié)變長選項中(kind=2);MSS–最大報文段大小—實際的最大數(shù)據(jù)大小:MTU-IP頭部-TCP頭部1500 - 20 - 20 = 1460
ARP協(xié)議
ARP協(xié)議的作用
ARP協(xié)議建立了主機 IP地址 和 MAC地址 的映射關(guān)系.
在網(wǎng)絡(luò)通訊時,源主機的應(yīng)用程序知道目的主機的IP地址和端口號,卻不知道目的主機的硬件地址數(shù)據(jù)包首先是被網(wǎng)卡接收到再去處理上層協(xié)議的,如果接收到的數(shù)據(jù)包的硬件地址與本機不符,則直接丟 棄;因此在通訊前必須獲得目的主機的硬件地址;
ARP協(xié)議格式
注意到源MAC地址、目的MAC地址在以太網(wǎng)首部和ARP請求中各出現(xiàn)一次,對于鏈路層為以太網(wǎng)的情況 是多余的,但如果鏈路層是其它類型的網(wǎng)絡(luò)則有可能是必要的。硬件類型指鏈路層網(wǎng)絡(luò)類型,1為以太網(wǎng);協(xié)議類型指要轉(zhuǎn)換的地址類型,0x0800為IP地址;硬件地址長度對于以太網(wǎng)地址為6字節(jié)協(xié)議地址長度對于和IP地址為4字節(jié);op字段為1表示ARP請求,op字段為2表示ARP應(yīng)答
ARP協(xié)議的工作流程
源主機發(fā)出ARP請求,詢問“IP地址是192.168.0.1的主機的硬件地址是多少”, 并將這個請求廣播到本地網(wǎng)段(以太網(wǎng)幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播);目的主機接收到廣播的ARP請求,發(fā)現(xiàn)其中的IP地址與本機相符,則發(fā)送一個ARP應(yīng)答數(shù)據(jù)包給源主機,將自己的硬件地址填寫在應(yīng)答包中每臺主機都維護一個ARP緩存表,可以用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鐘),如 果20分鐘內(nèi)沒有再次使用某個表項,則該表項失效,下次還要發(fā)ARP請求來獲得目的主機的硬件地址
為什么要有緩存表? 為什么表項要有過期時間而不是一直有效?
在以太局域網(wǎng)內(nèi)數(shù)據(jù)包傳輸依靠的是MAC地址,IP地址與MAC對應(yīng)的關(guān)系依靠ARP表,每臺安裝有TCP/IP協(xié)議的主機(包括網(wǎng)關(guān))都有一個ARP緩存表。該表中保存這網(wǎng)絡(luò)中各個電腦的IP地址和MAC地址的對照關(guān)系。
ip地址動態(tài)分配,上一次保存的關(guān)系就失效了,所以保存時間不會很長
局域網(wǎng)的ARP攻擊
你給我一個請求,我不是你的請求對象,但是我還是給了你的響應(yīng)信息,然后你就把數(shù)據(jù)發(fā)給我了。
總結(jié)
以上是生活随笔為你收集整理的网络基础3-1(细谈IP协议头, 网络层,子网划分,路由选择,数据链路层,以太网帧格式,MAC地址,再谈ARP协议)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。