在復雜的網絡環境中確定一個合適的路徑.
1. IP協議


1. 基本概念
IP協議:提供一種能力(有非常大的概率,做到某事),把數據報從主機A,跨網絡,送到主機B?
--> 必須要有方式,標識通信兩端唯一性!!(IP協議解決的是主機到主機的問題,進程到進程的問題有端口號) ---> 每臺主機都必須設置IP地址(公網IP)

主機: 配有 IP 地址, 但是不進行路由控制的設備;
路由器: 即配有 IP 地址, 又能進行路由控制;(理論工作在網絡層,而當代路由器,已經是一臺小型計算機了!是可以工作在應用層的)
節點: 主機和路由器的統稱
2. 協議頭格式

? 4 位版本號(version): 指定 IP 協議的版本, 對于 IPv4 來說, 就是 4. ? 4 位頭部長度(header length): IP 頭部的長度是多少個 32bit, 也就是 length 4
的字節數. 4bit 表示最大的數字是 15, 因此 IP 頭部最大長度是 60 字節. ? 16 位總長度(total length): IP 數據報整體占多少個字節. ? 16 位標識(id): 唯一的標識主機發送的報文. 如果 IP 報文在數據鏈路層被分片
了, 那么每一個片里面的這個 id 都是相同的. ? 3 位標志字段: 第一位保留(保留的意思是現在不用, 但是還沒想好說不定以后要
用到). 第二位置為 1 表示禁止分片, 這時候如果報文長度超過 MTU, IP 模塊就會丟
棄報文. 第三位表示"更多分片", 如果分片了的話, 最后一個分片置為 0, 其他是 1. 類
似于一個結束標記. ? 13 位分片偏移(framegament offset): 是分片相對于原始 IP 報文開始處的偏移.
其實就是在表示當前分片在原報文中處在哪個位置. 實際偏移的字節數是這個值 8
得到的. 因此, 除了最后一個報文之外, 其他報文的長度必須是 8 的整數倍(否則報文
就不連續了). ? 8 位生存時間(Time To Live, TTL): 數據報到達目的地的最大報文跳數. 一般是
64. 每次經過一個路由, TTL -= 1, 一直減到 0 還沒到達, 那么就丟棄了. 這個字段主要是用來防止出現路由循環? 8 位協議: 表示上層協議的類型? 16 位頭部校驗和: 使用 CRC 進行校驗, 來鑒別頭部是否損壞. ? 32 位源地址和 32 位目標地址: 表示發送端和接收端. ? 選項字段(不定長, 最多 40 字節): 略
?1. IP報文,解包問題(封裝)
挪動指針即可增加/減少協議頭

2. 分用問題(8位協議表明有效載荷是什么數據)
?? 8 位服務類型(Type Of Service): 3 位優先權字段(已經棄用), 4 位 TOS 字段, 和
1 位保留字段(必須置為 0). 4 位 TOS 分別表示: 最小延時, 最大吞吐量, 最高可靠性,?
最小成本. 這四者相互沖突, 只能選擇一個. 對于 ssh/telnet 這樣的應用程序, 最小延
時比較重要; 對于 ftp 這樣的程序, 最大吞吐量比較重要.
3. 網段劃分(重要)
IP 地址分為兩個部分, 網絡號和主機號(IP = 網絡號? + 主機號)
???網絡號: 保證相互連接的兩個網段具有不同的標識;
???主機號: 同一網段內, 主機之間具有相同的網絡號, 但是必須有不同的主機號
???不同的子網其實就是把網絡號相同的主機放到一起.(路由器有構建子網的功能)
???如果在子網中新增一臺主機, 則這臺主機的網絡號和這個子網的網絡號一致, 但
是主機號必須不能和子網中的其他主機重復.
通過合理設置主機號和網絡號, 就可以保證在相互連接的網絡中, 每臺主機的 IP 地址都
不相同.
那么問題來了, 手動管理子網內的 IP, 是一個相當麻煩的事情.
? 有一種技術叫做 DHCP, 能夠自動的給子網內新增主機節點分配 IP 地址, 避免
了手動管理 IP 的不便.
? 一般的路由器都帶有 DHCP 功能. 因此路由器也可以看做一個 DHCP 服務器.
過去曾經提出一種劃分網絡號和主機號的方案, 把所有 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 類無關
FF代表全是1;0:整個IP就是表示網絡號
子網地址范圍:這個子網內最多可以有多少臺主機。
可見,IP 地址與子網掩碼做與運算可以得到網絡號, 主機號從全 0 到全 1 就是子網的地
址范圍;
IP 地址和子網掩碼還有一種更簡潔的表示方法,例如 140.252.20.68/24,表示 IP 地址為
140.252.20.68, 子網掩碼的高 24 位是 1,也就是 255.255.255.0
子網劃分是指將一個較大的網絡分割成多個較小的網絡,也就是子網;why?--- 查找目標主機,必須先查找目標網絡:本質就可以淘汰其他網絡,可以在全網中提高查找目標主機的效率?
子網劃分的本質:把32位比特位進行劃分,確定網絡號有多少位!
目的
- 提高 IP 地址利用率:在沒有子網劃分時,A 類、B 類網絡可能會造成 IP 地址浪費。例如,一個 B 類網絡理論上可容納 65534 個主機,但實際使用中往往不需要這么多主機地址。通過子網劃分,可以根據實際需求將大網絡分割成若干小網絡,充分利用 IP 地址資源。
- 增強網絡管理和安全性:將網絡劃分為多個子網后,不同子網可以根據需要進行獨立管理,設置不同的訪問控制策略。例如,企業可以將辦公子網、服務器子網等分開管理,辦公子網對外部網絡訪問進行限制,而服務器子網對特定的內部主機開放,從而增強網絡安全性。

結論1:IP地址是有用的,是有限的,是資源 --- 各國運營商都在搶,為啥搶?要搭建國家子網?

4. 特殊的IP地址
???將 IP 地址中的主機地址全部設為 0, 就成為了網絡號, 代表這個局域網
???將 IP 地址中的主機地址全部設為 1, 就成為了廣播地址, 用于給同一個鏈路中相互連接的所有主機發送數據包;
???127.*的 IP 地址用于本機環回(loop back)測試,通常是 127.0.0.1
5. IP地址的數量限制
我們知道, IP 地址(IPv4)是一個 4 字節 32 位的正整數. 那么一共只有 2 的 32 次方 個 IP 地址, 大概是 43 億左右. 而 TCP/IP 協議規定, 每個主機都需要有一個 IP 地址.
這意味著, 一共只有 43 億臺主機能接入網絡么?
實際上, 由于一些特殊的 IP 地址的存在, 數量遠不足 43 億; 另外 IP 地址并非是按照主機臺數來配置的, 而是每一個網卡都需要配置一個或多個 IP 地址.
CIDR 在一定程度上緩解了 IP 地址不夠用的問題(提高了利用率, 減少了浪費, 但是 IP
地址的絕對上限并沒有增加), 仍然不是很夠用. 這時候有三種方式來解決:
???動態分配 IP 地址: 只給接入網絡的設備分配 IP 地址. 因此同一個 MAC 地址的
設備, 每次接入互聯網中, 得到的 IP 地址不一定是相同的;
???NAT 技術(后面會重點介紹);
???IPv6: IPv6 并不是 IPv4 的簡單升級版. 這是互不相干的兩個協議, 彼此并不兼容; IPv6 用 16 字節 128 位來表示一個 IP 地址; 但是目前 IPv6 還沒有普及;
6. 私有IP地址和公網IP地址
公網的理解:公網IP -- 各個國家的運營商主動申請 -- 運營商不僅僅要組建內網,運營商,也要組建自己國家的公網環境 -- 一個區域,究竟能有多大的網絡,取決于自己有多少個公網IP -- 分配公網IP,是結合網民數量,按照地區劃分的

如果一個組織內部組建局域網,IP 地址只用于局域網內的通信,而不直接連到 Internet 上,理論上 使用任意的 IP 地址都可以,但是 RFC 1918 規定了用于組建局域網的私有 IP 地址
? 10.*,前 8 位是網絡號,共 16,777,216 個地址
? 172.16.*到 172.31.*,前 12 位是網絡號,共 1,048,576 個地址
? 192.168.*,前 16 位是網絡號,共 65,536 個地址
包含在這個范圍中的, 都成為私有 IP, 其余的則稱為全局 IP(或公網 IP);

???一個路由器可以配置兩個 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 的服務器上. 這樣的服務器可以在阿里云/騰訊云上進行購買
1.發送:
?
2.回來:


7. 路由
路由器本身就具有構建子網的能力-->給子網內所有主機分配IP的能力(任何路由器,都要配有至少配有兩個IP)
路由報文,本質是查找主機的問題!---> 查找本質,是一個淘汰的過程,只要淘汰效率高,查找效率就高
在復雜的網絡結構中, 找出一條通往終點的路線
路由的過程, 就是這樣一跳一跳(Hop by Hop) "問路" 的過程.
所謂 "一跳" 就是數據鏈路層中的一個區間. 具體在以太網中指從源 MAC 地址到目的 MAC 地址之間的幀傳輸區間.
?IP 數據包的傳輸過程也和問路一樣
???當 IP 數據包, 到達路由器時, 路由器會先查看目的 IP;
???路由器決定這個數據包是能直接發送給目標主機, 還是需要發送給下一個路由器;
???依次反復, 一直到達目標 IP 地址;
???路由表可以使用 route 命令查看
???如果目的 IP 命中了路由表, 就直接轉發即可;
???路由表中的最后一行,主要由下一跳地址和發送接口兩部分組成,當目的地址與路由表中其它行都不匹配時,就按缺省路由條目規定的接口發送到下一跳地址。
?假設某主機上的網絡接口配置和路由表如下:
???這臺主機有兩個網絡接口,一個網絡接口連到 192.168.10.0/24 網絡,另一個網絡接口連到 192.168.56.0/24 網絡;
???路由表的 Destination 是目的網絡地址,Genmask 是子網掩碼,Gateway 是下一跳地址,Iface 是發送接口,Flags 中的 U 標志表示此條目有效(可以禁用某些 條目),G標志表示此條目的下一跳地址是某個路由器的地址,沒有 G 標志的條目表示目的網絡地址是與本機接口直接相連的網絡,不必經路由器轉發;
轉發過程例 1: 如果要發送的數據包的目的地址是 192.168.56.3
???跟第一行的子網掩碼做與運算得 到 192.168.56.0,與第一行的目的網絡地址不符
???再跟第二行的子網掩碼做與運算得 到 192.168.56.0,正是第二行的目的網絡地址,因此從 eth1 接口發送出去;
???由于 192.168.56.0/24 正 是與 eth1 接口直接相連的網絡,因此可以直接發到目的主機,不需要經路由器轉發;
轉發過程例 2: 如果要發送的數據包的目的地址是 202.10.1.2
???依次和路由表前幾項進行對比, 發現都不匹配;
???按缺省路由條目, 從 eth0 接口發出去, 發往 192.168.10.1 路由器;
???由 192.168.10.1 路由器根據它的路由表決定下一跳地址;
結論1:公網路由器的路由算發表和內網的路由算發表復雜度是不同的
8.?IP 分片和組裝的具體過程


???16 位標識(id): 唯一的標識主機發送的報文. 如果 IP 報文在數據鏈路層被分片了, 那么每一個片里面的這個 id 都是相同的.
???3 位標志字段: 第一位保留(保留的意思是現在不用, 但是還沒想好說不定以后要用到). 第二位置為 1 表示禁止分片, 這時候如果報文長度超過 MTU, IP 模塊就會丟棄報文. 第三位表示"更多分片", 如果分片了的話, 最后一個分片置為 0, 其他是 1. 類似于一個結束標記.
???13 位分片偏移(framegament offset): 是分片相對于原始 IP 報文開始處的偏移.其實就是在表示當前分片在原報文中處在哪個位置. 實際偏移的字節數是這個值 除以 8 得到的. 因此, 除了最后一個報文之外(之前如果都是 8 的整數倍,最后一片的偏移量也一定是 8 的整數倍), 其他報文的長度必須是 8 的整數倍(否則報文就不連續了).
???注意:片偏移(13 位)表示本片數據在它所屬的原始數據報數據區中的偏移量
(以 8 字節為單位)
分片
如何甄別特定報文是否被分片了?--- 更多分片0 && 片偏移0 !!!
a. 更多分片(MF)標志判斷
IP 首部中有個 “更多分片(MF)” 標志位 。當 MF = 1 時,表明該報文是一個分片,且后續還有分片。因為如果報文被分片,只要不是最后一個分片,MF 位就會被置為 1 ,用于告知接收方還有后續分片。
b. MF 為 0 且片偏移大于 0 判斷
當 MF = 0 時,正常理解可能是未分片報文或最后一個分片。但如果此時片偏移(Fragment Offset ) > 0 ,說明該報文之前存在其他分片,即此報文是經過分片后的最后一個分片。因為片偏移表示該分片在原始報文中的位置偏移量,若片偏移大于 0 ,意味著前面有其他分片占據了原始報文靠前的位置,所以能判定報文經歷過分片 。
保證分片收全的原理
- 標識字段:IP 首部的 16 位標識字段,發送方對同一原始報文的所有分片設置相同標識值。接收方據此識別屬于同一報文的分片并聚合。
- 片偏移字段:接收方依據片偏移確定分片順序。理論上,若按片偏移升序排列后,相鄰分片的片偏移與自身長度滿足 “片偏移 + 自身報文長度 = 下一個分片的片偏移”,且收到 MF(更多分片)標志為 0 的分片(表示無后續分片 ),可認為收全。但實際網絡中,若有分片丟失(如第一片、中間片、結尾片 ),就無法滿足上述條件,意味著未收全。
1. 檢查 MTU 限制:
○ 當一個 IP 數據報的大小超過了網絡的 MTU(最大傳輸單元)限制時,就需要進行分片。MTU 是數據鏈路層對 IP 層數據包進行封裝時所能接受的最大數據長度。
2. 分割數據報:
○ IP 層將原始的 IP 數據報分割成多個較小的片段。
○ 對于每個片段,IP 層會設置相應的標識(Identification)、偏移量(Fragment Offset)和標志位(Flags)等字段。
○ 標識字段用于標識屬于同一個數據報的不同分片,確保所有分片能夠被正確地重新組裝。
○ 偏移量字段指示了當前分片相對于原始數據報的起始位置,以 8 字節為單位。
○ 標志位字段包含了 3 個位,其中 MF(More Fragment)位用于指示是否還有更多的分片,DF(Do Not Fragment)位用于指示數據報是否允許進行分片。
3. 添加 IP 頭部:
○ 每個分片都會加上自己的 IP 頭部,與完整 IP 報文擁有類似的 IP 頭結構,但 MF 和 Fragment Offset 等字段的值會有所不同。
4. 發送分片:
○ 分片在傳輸過程中獨立傳輸,每個分片都有自己的 IP 頭部,并且各自獨立地選擇路由
組裝
1. 接收分片:
○ 當目的主機的 IP 層接收到這些分片后,會根據標識字段將屬于同一個數據報的所有分片挑選出來。
2. 排序與組裝:
○ 利用片偏移字段,IP 層會對屬于同一個數據報的分片進行排序。
○ 當所有的分片都到達并正確排序后,IP 層會將這些分片重新組裝成一個完整的 IP 數據報。
3. 傳遞給上層協議:
○ 組裝好的 IP 數據報會傳遞給上層的協議進行處理。

