1. ICMP協議的介紹及應用
IP協議的助手 —— ICMP 協議
ping 是基于 ICMP
協議工作的,所以要明白 ping 的工作,首先我們先來熟悉 ICMP 協議。
ICMP 全稱是 Internet Control Message Protocol,也就是互聯網控制報文協議。
里面有個關鍵詞 —— 控制,如何控制的呢?
網絡包在復雜的網絡傳輸環境里,常常會遇到各種問題。當遇到問題的時候,總不能死的不明不白,沒頭沒腦的作風不是計算機網絡的風格。所以需要傳出消息,報告遇到了什么問題,這樣才可以調整傳輸策略,以此來控制整個局面。
ICMP
主要的功能包括:
- 確認 IP 包是否成功送達目標地址
- 報告發送過程中 IP 包被廢棄的原因和改善網絡設置等
IP 包中有一個字段叫做 TTL
(Time To Live
,生存周期),它的值隨著每經過一次路由器就會減 1,直到減到 0 時該 IP 包會被丟棄。
此時,路由器將會發送一個 ICMP 超時消息給發送端主機,并通知該包已被丟棄。
設置 IP 包生存周期的主要目的,是為了在路由控制遇到問題發生循環狀況時,避免 IP 包無休止地在網絡上被轉發。
ping —— 查詢報文類型的使用
同個子網下的主機 A 和 主機 B,主機 A 執行ping
主機 B 后,我們來看看其間發送了什么?
traceroute —— 差錯報文類型的使用
有一款充分利用 ICMP 差錯報文類型的應用叫做 traceroute
(在UNIX、MacOS中是這個命令,而在Windows中對等的命令叫做 tracert )。
- traceroute 作用一
traceroute 的第一個作用就是故意設置特殊的 TTL,來追蹤去往目的地時沿途經過的路由器。
traceroute 的參數指向某個目的 IP 地址:
traceroute 192.168.1.100
這個作用是如何工作的呢?
它的原理就是利用 IP 包的生存期限 從 1
開始按照順序遞增的同時發送 UDP 包,強制接收 ICMP 超時消息的一種方法。
比如,將 TTL 設置 為 1
,則遇到第一個路由器,就犧牲了,接著返回 ICMP 差錯報文網絡包,類型是時間超時。
接下來將 TTL 設置為 2
,第一個路由器過了,遇到第二個路由器也犧牲了,也同時返回了 ICMP 差錯報文數據包,如此往復,直到到達目的主機。
這樣的過程,traceroute 就可以拿到了所有的路由器 IP。
發送方如何知道發出的 UDP 包是否到達了目的主機呢?
traceroute 在發送 UDP
包時,會填入一個不可能的端口號值作為 UDP 目標端口號(大于 3000
)。當目的主機,收到 UDP 包后,會返回 ICMP 差錯報文消息,但這個差錯報文消息的類型是「端口不可達」。 所以,當差錯報文類型是端口不可達時,說明發送方發出的 UDP 包到達了目的主機。
- traceroute 作用二
traceroute 還有一個作用是故意設置不分片,從而確定路徑的 MTU。
這么做是為了什么?
這樣做的目的是為了路徑MTU發現。
因為有的時候我們并不知道路由器的 MTU
大小,以太網的數據鏈路上的 MTU
通常是 1500
字節,但是非以外網的 MTU
值就不一樣了,所以我們要知道 MTU
的大小,從而控制發送的包大小。
它的工作原理如下:
首先在發送端主機發送 IP
數據報時,將 IP
包首部的分片禁止標志位設置為 1。根據這個標志位,途中的路由器不會對大數據包進行分片,而是將包丟棄。
隨后,通過一個 ICMP 的不可達消息將數據鏈路上 MTU 的值一起給發送主機,不可達消息的類型為「需要進行分片但設置了不分片位」。
發送主機端每次收到 ICMP 差錯報文時就減少包的大小,以此來定位一個合適的 MTU
值,以便能到達目標主機。
2. 內網穿透
內網穿透,即NAT(Network Address Translator)穿透,是指計算機在內網(局域網)內使用私有IP地址,在連接外網(互聯網)時使用全局IP地址的技術。該技術被普遍使用在有多臺主機但只通過一個公有IP地址訪問的私有網絡中。
舉個例子:比如我在實驗室配置了一個服務器 Server A,當我在實驗室的時候,就可以通過自己的筆記本使用SSH連接【因為我和服務器處于一個局域網】,當我回宿舍以后,就沒有辦法直接使用SSH連接了【因為我和服務器不在一個局域網】,這個時候就需要進行NAT穿透,讓我在宿舍也可以使用SSH連接Server A。
1. NAT原理解析
- 當信息由局域網向因特網傳遞時,源地址從專有地址轉換為公用地址。由路由器跟蹤每個連接上的目的地址和端口。
- 當數據返回路由器時,通過記錄的連接跟蹤數據來決定該轉發給內部網的哪個主機;如果此時如果有多個公用地址可用,當數據包返回時,則會客戶機的端口號可以用來分解數據包。
圖例:
下圖以10.0.0.10的主機與163.221.120.9的主機進行通信為例進行講解。
-
首先NAT路由器將發送源地址從私有IP地址(10.0.0.10)轉換為全局的IP地址 (202.244.174.37)再發送數據
-
當數據從地址163.221.120.9發過來時,NAT路由器將目標地址從原句IP地址(202.244.174.37)先轉換成私有IP地址10.0.0.10以后再轉發
3. 動態路由協議
雖然靜態路由在某些時刻很有用,但是必須手工配置每條路由條目,對于大中型網絡或拓撲經常改變的情況,配置和維護靜態路由的工作量變得非常繁重,因此使用動態路由是必要的。
動態路由協議 , 用來實現路由器之間的動態路由表更新。
路由器在配置了接口的P地址后,就會將直連網段存儲在路由表中。對于非直連的網段,如果使用靜態路由,需要在路由器上配置到達目標網段需要經過的下一跳地址,也就是說,需要人為指定一條數據傳輸的路徑,手工構造路由表。
如果使用動態路由協議,路由器之間就會將自己的路由信息向相鄰的路由器發送,并接收相鄰路由發過來的路由信息,有選擇地保護這些路由信息,生成自己的路由表。
- 舉例:OSPF(Open Shortest Path First,開放最短路徑優先)
鏈路狀態路由算法
工作原理:
每個路由器將自己的鏈路狀態信息洪泛(flooding)
到網絡上的所有路由器。
- 最后,每個路由器都會紙雕整個網絡的拓撲結構(LSDB)
- 每個路由器使用的是
最短路徑算法
計算最短路徑,來更新路由表 - 路由器的鏈路狀態發生變化的時候會繼續洪泛自身的鏈路狀態信息到其他的路由器
參考鏈接
- # 動態路由協議(一)
- # 內網穿透原理總結與工具推薦