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