我正在做一個項目,必須描述從第 7 層到第 1 層的 ping 過程。這是否意味著上面的任何層都不重要,或者它們仍然以某種方式使用?
答案1
它使用應用程式層(7 或 4,取決於您的型號)以及 3 及以下。 ICMP 不像 TCP 或 UDP 那麼靈活,因此它提供的功能相當有限。ICMP支援最多255 命令訊息類型,並且在內部執行此操作,而不是使用上層協定將網路 IO 指派給進程。
因此,應用程式驅動使用命令訊息來控製網路。例如,Ping 是一個應用程序,它創建適合 ICMP 封包的資料結構,並將其提交給作業系統以發送到 IP。然後等待 IO 返回。當 IP 堆疊收到回顯回應時,它會將 IO 傳遞給程序,然後程式可以將訊息列印給使用者。
就像 TCP/IP 一樣,應用層控制和協調網路堆疊提供的所有原始操作,以建立對現代用戶有價值的功能。
如果您是一個有代碼意識的人,請考慮這段程式碼片段就這樣。它將偵聽 ICMP 訊息,並將其列印在程式輸出上。您可以看到它為ICMP 建立了一個“原始套接字”,將該套接字綁定到IP 介面(均為第3 層操作),建立一些資料結構並從套接字IO 讀取,尋找響應。當收到ICMP訊息時,其資料區域將出現在程式IO流中,並列印在螢幕上。它非常整潔。
按要求編輯:
因此,OSI 模型是一種思考職責的方法的抽象表示,使得任務具有先決條件(其下層中使用的協議的特徵)和必須滿足的後置條件。該模型所做的另一件事是建立透過每個任務傳輸資料的方法。
OSI 模型的主要目標是為應用程式提供一種輕鬆發送和接收網路訊息的方法的描述,這種方法是從系統配置中抽象化的,使其可以跨系統移植。在早期,應用程式必須重寫才能工作於其他平台和配置,因為應用程式必須自己完成所有工作。透過分離職責,程式可以只專注於其工作,並且這在系統之間不會有太大差異。此外,系統和網路管理員可以更改系統連接到其他系統的方式,而完全不會影響應用程式。
OSI 堆疊的底層都是關於系統互連的基本網路標準。每個人都必須以同樣的方式做這些事情,否則什麼都做不了。所有製造商都有遵守這些規則的約束性責任,以便擁有可以銷售的產品。
然而,作業系統供應商不太熱衷於阻止其平台脫穎而出的嚴格規則和結構。從來沒有一個完全符合 OSI 的系統的原因是沒有作業系統供應商願意編寫一個系統。
因此,OSI 第 1-4 層是可靠的、可預測的且必不可少的。然而,第 5 層和第 6 層完全是可選的。應用程式要么編寫程式碼來使用它們,要么不編寫程式碼,具體取決於它們的需要。
大多數現代應用程式只是從傳輸協定段讀取資料。在這些情況下,L5/L6 沒有封裝資料報。段有效負載中的數據是應用程式數據,因此應用程式只需將 IO 流附加到 L4 連接埠並從中讀取/寫入。
對於 ICMP,由於它不使用第 4 層,因此應用程式僅讀取原始 IP 套接字。相同的概念。
第5層僅用於需要網路代理或隧道的應用程式。此資料報的有效負載通常是透過隧道發送的另一個訊框或資料包,或透過 SOCKS 代理代理程式的分段。應用程式通常要么不知道代理正在發揮作用,要么會利用作業系統來處理第5 層(如果適用於該系統),儘管某些作業系統上的某些應用程式實際上可能控制L5 資料封包的解封裝。通常,L5 操作是使用驅動程式(VPN 虛擬網路適配器、系統代理等)在核心中處理的。
值得注意的是,大多數第 5 層協定用於控制與應用程式發送/接收訊息的願望無關的交互,並且通常對通訊中涉及的任何系統都沒有意義。它通常用於控製網絡,以便這兩個系統可以通訊。事實上,大多數時候應用程式資料流被作業系統攔截,並且系統應用程式處理外部資料封包的封裝,因此它獲取應用程式資料包,並將它們放入應用程式甚至不知道的其他資料包中存在。此時系統應用程式控制著資料。
第6層實在是沒用過。在我使用過的任何程式框架中,編碼都是在應用程式中使用適當的程式庫進行處理的。如果應用程式願意,可以使用作業系統編碼器/解碼器或提供自己的編碼器/解碼器來編寫第 6 層操作,但根據我的經驗,這通常由應用程式處理,不會影響資料封包封裝。
因此,歸根結底,所有這一切都是為了給應用程式提供可以讀取和寫入的 IO 流,以便透過網路發送和接收訊息,而幾乎不需要預先了解網路如何運作。這就是現代網路 100% 的意義。
如果系統使用系統範圍的代理或 VPN,它通常會自動封裝 L5 資料報,這樣發送應用程式甚至不知道它的存在。在接收端,L5 標頭在收到時已被剝離,因為它已由代理伺服器或 VPN 端點處理,因此遠端作業系統只需將資料從第 4 層有效負載傳輸到應用程式。
因此,給定的資料包只會封裝所需的層數,以完成工作。有些低階應用程式僅在第 2 層運行,且不包含 L3+ 元件。有些互聯層應用程式不使用 L4+,因此它們不封裝任何更高層的內容(如 ICMP)。您必須擁有要操作的圖層下方的所有圖層,但不需要其上方的任何圖層。大多數常見應用程式專注於第 4 層的讀寫,並讓作業系統根據需要處理第 5 層和第 6 層。
最後,我可以理解您為什麼感到困惑,以及為什麼很難找到有關此主題的好資訊。要真正理解這一切,你需要對網路、應用程式程式設計和作業系統設計有一定的了解,所以我花了很多年才覺得我對它的工作方式有足夠的了解。
答案2
ICMP 是網際網路控制訊息協議。顧名思義,ICMP 是一個網際網路協定。這是不是一個開放系統介面協定.
網際網路協定棧只有四層:
- 應用
- 運輸
- 網際網路
- [連結](假設該層存在於互聯網之外,它不是由互聯網協議棧本身指定的)
ICMP 是互聯網層協議,是互聯網協議棧的第二層。
還有其他流行的網路分層模型,例如乙太網路堆疊:
- 連結層
- 邏輯鏈路控制 (LLC)
- 媒體存取控制 (MAC)
- 協調子層 (RS)
- 物理層
- 物理編碼子層 (PCS)
- 物理介質附加子層 (PMA)
- 物理媒體相關子層 (PMD)
所有這 8 個層和子層總共只對應於網際網路協定棧中的一個層,即鏈結層。它們對應於OSI協定棧中的兩層:物理層和資料鏈結層。
正如您所看到的,所有這些不同的堆疊都有不同的層,並且不能保證來自一個堆疊的協定(例如來自乙太網路堆疊的IEEE 802.3cd 或來自網際網路堆疊的ICMP)可以完美地對應到不同的堆疊。
例如,您無法將 ICMP 對應到乙太網路堆疊。你可以嘗試將 IEEE 802.3cd 映射到互聯網堆棧,但這確實不精確:您只能說它屬於鏈路層,但在以太網堆疊中,該層分為 8 層和子層,並且 IEEE 802.3cd只屬於其中之一,而不屬於所有人。
同樣,如果您嘗試將 IEEE 802.3cd 映射到 OSI 堆疊,您只能說它屬於物理層,但在乙太網路堆疊中,它對應於三個不同的子層,而 IEEE 802.3cd 只屬於其中之一那些。