banner
ShuWa

ShuWa

是进亦忧,退亦忧。然则何时而乐耶?
twitter

OSI和TCP/IP網絡模型

OSI 七層模型#

OSI 的七層體系結構概念清楚,理論也很完整,但是它比較複雜而且不實用,而且有些功能在多個層中重複出現。
物理層:底層數據傳輸,如網線;網卡標準。
數據鏈路層:定義數據的基本格式,如何傳輸,如何標識;如網卡 MAC 地址。
網絡層:定義 IP 編址,定義路由功能;如不同設備的數據轉發。
傳輸層:端到端傳輸數據的基本功能;如 TCP、UDP。
會話層:控制應用程序之間會話能力;如不同軟件數據分發給不同軟件。
表示層:數據格式標識,基本壓縮加密功能。
應用層:各種應用軟件,包括 Web 應用。
image

TCP/IP 四層模型#

TCP/IP 四層模型 是目前被廣泛採用的一種模型,我們可以將 TCP / IP 模型看作是 OSI 七層模型的精簡版本,由以下 4 層組成:

  • 應用層
  • 傳輸層
  • 網絡層
  • 網絡接口層
    image

應用層#

應用層位於傳輸層之上,主要提供兩個終端設備上的應用程序之間信息交換的服務,它定義了信息交換的格式,消息會交給下一層傳輸層來傳輸。我們把應用層交互的數據單元稱為報文。
所以,應用層只需要專注於為用戶提供應用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。

image

而且應用層是工作在操作系統中的用戶態,傳輸層及以下則工作在內核態

傳輸層#

傳輸層的主要任務就是負責向兩台終端設備進程之間的通信提供通用的數據傳輸服務。應用進程利用該服務傳送應用層報文。“通用的” 是指並不針對某一個特定的網絡應用,而是多種應用可以使用同一個運輸層服務。
傳輸層常見協議:

  • TCP(Transmisson Control Protocol,傳輸控制協議):提供面向連接的,可靠字節流傳輸服務。
  • UDP(User Datagram Protocol,使用者數據報協議):提供無連接的,盡最大努力 的數據傳輸服務(不保證數據傳輸的可靠性),簡單高效。

網絡層#

網絡層負責為分組交換網上的不同主機提供通信服務。在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網絡層使用 IP 協議,因此分組也叫 IP 數據報,簡稱數據報。
網絡層的還有一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分組,能通過網絡層中的路由器找到目的主機。
互聯網是由大量的異構(heterogeneous)網絡通過路由器(router)相互連接起來的。互聯網使用的網絡層協議是無連接的網際協議(Internet Protocol)和許多路由選擇協議,因此互聯網的網絡層也叫做 網際層 或 IP 層。
網絡層常見協議:

  • IP(Internet Protocol,網際協議):TCP/IP 協議中最重要的協議之一,主要作用是定義數據包的格式、對數據包進行路由和尋址,以便它們可以跨網絡傳播並到達正確的目的地。目前 IP 協議主要分為兩種,一種是過去的 IPv4,另一種是較新的 IPv6,目前這兩種協議都在使用,但後者已經被提議來取代前者。
  • ARP(Address Resolution Protocol,地址解析協議):ARP 協議解決的是網絡層地址和鏈路層地址之間的轉換問題。因為一個 IP 數據報在物理上傳輸的過程中,總是需要知道下一跳(物理上的下一個目的地)該去往何處,但 IP 地址屬於邏輯地址,而 MAC 地址才是物理地址,ARP 協議解決了 IP 地址轉 MAC 地址的一些問題。
  • ICMP(Internet Control Message Protocol,互聯網控制報文協議):一種用於傳輸網絡狀態和錯誤消息的協議,常用於網絡診斷和故障排除。例如,Ping 工具就使用了 ICMP 協議來測試網絡連通性。
  • NAT(Network Address Translation,網絡地址轉換協議):NAT 協議的應用場景如同它的名稱 —— 網絡地址轉換,應用於內部網到外部網的地址轉換過程中。具體地說,在一個小的子網(局域網,LAN)內,各主機使用的是同一個 LAN 下的 IP 地址,但在該 LAN 以外,在廣域網(WAN)中,需要一個統一的 IP 地址來標識該 LAN 在整個 Internet 上的位置。
  • OSPF(Open Shortest Path First,開放式最短路徑優先):一種內部網關協議(Interior Gateway Protocol,IGP),也是廣泛使用的一種動態路由協議,基於鏈路狀態算法,考慮了鏈路的帶寬、延遲等因素來選擇最佳路徑。
  • RIP (Routing Information Protocol,路由信息協議):一種內部網關協議(Interior Gateway Protocol,IGP),也是一種動態路由協議,基於距離向量算法,使用固定的跳數作為度量標準,選擇跳數最少的路徑作為最佳路徑。
  • BGP(Border Gateway Protocol,邊界網關協議):一種用來在路由選擇域之間交換網絡層可達性信息(Network Layer Reachability Information,NLRI)的路由選擇協議,具有高度的靈活性和可擴展性。

網絡接口層#

我們可以把網絡接口層看作是數據鏈路層和物理層的合體。

  • 數據鏈路層 (data link layer) 通常簡稱為鏈路層(兩台主機之間的數據傳輸,總是在一段一段的鏈路上傳送的)。數據鏈路層的作用是將網絡層交下來的 IP 數據報組裝成幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。
  • 物理層的作用是實現相鄰計算機節點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質和物理設備的差異網絡接口層重要功能和協議如下圖所示:
    image

基於 TCP/IP 四層模型的 Socket 網絡編程#

Linux 網絡協議棧#

從圖的網絡協議棧,你可以看到:

  • 應用程序需要通過系統調用,來跟 Socket 層進行數據交互;
  • Socket 層的下面就是傳輸層、網絡層和網絡接口層;
  • 最下面的一層,則是網卡驅動程序和硬件網卡設備;
    image

接收過程#

網卡是計算機裡的一個硬件,專門負責接收和發送網絡包,當網卡接收到一個網絡包後,會通過 DMA 技術,將網絡包寫入到指定的內存地址,也就是寫入到 Ring Buffer ,這個是一個環形緩衝區,接著就會告訴操作系統這個網絡包已經到達。

那應該怎麼告訴操作系統這個網絡包已經到達了呢?

觸發中斷:每當網卡收到一個網絡包,就觸發一個中斷告訴操作系統。
但是這樣會出現一個問題,當操作系統頻繁接收到網絡包就會頻繁的觸發中斷,影響操作系統的運行效率。
解決方法是採用 NAPI 機制,它是混合「中斷和輪詢」的方式來接收網絡包,它的核心概念就是不採用中斷的方式讀取數據,而是首先採用中斷喚醒數據接收的服務程序,然後 poll 的方法來輪詢數據。

NAPI 機制?

因此,當有網絡包到達時,會通過 DMA 技術,將網絡包寫入到指定的內存地址,接著網卡向 CPU 發起硬件中斷,當 CPU 收到硬件中斷請求後,根據中斷表,調用已經註冊的中斷處理函數。
硬件中斷處理函數會做如下的事情:

  • 需要先「暫時屏蔽中斷」,表示已經知道內存中有數據了,告訴網卡下次再收到數據包直接寫內存就可以了,不要再通知 CPU 了,這樣可以提高效率,避免 CPU 不停的被中斷。
  • 接著,發起「軟中斷」,然後恢復剛才屏蔽的中斷。

至此,硬件中斷處理函數的工作就已經完成。

軟中斷?

內核中的 ksoftirqd 線程專門負責軟中斷的處理,當 ksoftirqd 內核線程收到軟中斷後,就會來輪詢處理數據。
ksoftirqd 線程會從 Ring Buffer 中獲取一個數據幀,用 sk_buff 表示,從而可以作為一個網絡包交給網絡協議棧進行逐層處理。

網絡協議棧

image
首先,會先進入到網絡接口層,在這一層會檢查報文的合法性,如果不合法則丟棄,合法則會找出該網絡包的上層協議的類型,比如是 IPv4,還是 IPv6,接著再去掉幀頭和幀尾,然後交給網絡層。
到了網絡層,則取出 IP 包,判斷網絡包下一步的走向,比如是交給上層處理還是轉發出去。當確認這個網絡包要發送給本機後,就會從 IP 頭裡看看上一層協議的類型是 TCP 還是 UDP,接著去掉 IP 頭,然後交給傳輸層。
傳輸層取出 TCP 頭或 UDP 頭,根據四元組「源 IP、源端口、目的 IP、目的端口」作為標識,找出對應的 Socket,並把數據放到 Socket 的接收緩衝區。
最後,應用層程序調用 Socket 接口,將內核的 Socket 接收緩衝區的數據「拷貝」到應用層的緩衝區,然後喚醒用戶進程。
至此,一個網絡包的接收過程就已經結束了,你也可以從下圖左邊部分看到網絡包接收的流程,右邊部分剛好反過來,它是網絡包發送的流程。

發送網絡數據的時候,涉及幾次內存拷貝操作?

第一次,調用發送數據的系統調用的時候,內核會申請一個內核態的 sk_buff 內存,將用戶待發送的數據拷貝到 sk_buff 內存,並將其加入到發送緩衝區。
第二次,在使用 TCP 傳輸協議的情況下,從傳輸層進入網絡層的時候,每一個 sk_buff 都會被克隆一個新的副本出來。副本 sk_buff 會被送往網絡層,等它發送完的時候就會釋放掉,然後原始的 sk_buff 還保留在傳輸層,目的是為了實現 TCP 的可靠傳輸,等收到這個數據包的 ACK 時,才會釋放原始的 sk_buff 。
第三次,當 IP 層發現 sk_buff 大於 MTU 時才需要進行。會再申請額外的 sk_buff,並將原來的 sk_buff 拷貝為多個小的 sk_buff。

Ref:
小林 coding
JavaGuide

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。