linux網路子系統內核分析

来源:http://www.cnblogs.com/chd-zhangbo/archive/2016/01/26/5160492.html
-Advertisement-
Play Games

1.選擇路由 若要將數據包發至PC2,則linux系統通過查詢路由表可知168.1.1.10(目的地址)的網關地址為192.168.1.1,此時linux系統選擇網卡1發送數據包。2.鄰居子系統(通過arp協議建立起鄰居的信息) 選擇網卡1發送數據時,首先將數據包發給鄰居(網關),再由鄰居轉...


1.選擇路由  

  若要將數據包發至PC2,則linux系統通過查詢路由表可知168.1.1.10(目的地址)的網關地址為192.168.1.1,此時linux系統選擇網卡1發送數據包。

2.鄰居子系統(通過arp協議建立起鄰居的信息)

  選擇網卡1發送數據時,首先將數據包發給鄰居(網關),再由鄰居轉發至後面,若要發送給鄰居,則必須知道鄰居的MAC地址,若不知道鄰居的MAC地址,則需要通過arp請求包獲取鄰居的MAC地址。

 

Linux網路體繫結構由以下五個部分組成 1)系統調用介面 2)協議無關介面 3)網路協議 4)設備無關介面 5 設備驅動程式。下麵分別簡述五個部分:

    1)系統調用介面

    系統調用介面是用戶空間的應用程式正常訪問內核的唯一合法途徑(終端和陷入也可訪問內核)。如:

    asmlingkage long sys_getpid(void)

    {

    return current->pid;

    }

    系統調用一般由sys開頭 ,前面的修飾符是asmlingkage,表示函數由堆棧獲得參數。

    2)協議無關介面

    協議無關介面是由socket來實現的。它提供了一組通用函數來支持各種不同協議。

    通過網路棧進行的通信都需要對 socket 進行操作。Linux 中的 socket 結構是 struct sock ,這個結構是在 linux/include/net/sock.h 中定義的。這個巨大的結構中包含了特定 socket 所需要的所有狀態信息,其中包括 socket 所使用的特定協議和在 socket 上可以執行的一些操作。

    網路子系統可以通過一個定義了自己功能的特殊結構來瞭解可用協議。每個協議都維護了一個名為 proto 的結構(可以在 linux/include/net/sock.h 中找到)。這個結構定義了可以在從 socket 層到傳輸層中執行特定的 socket 操作

    3)網路協議

    Linux支持多種網路協議,可以在<linux/socket.h>中查到所支持的網路協議:

    #define AF_UNIX        1    /* Unix domain sockets         */

    #define AF_LOCAL    1    /* POSIX name for AF_UNIX    */

    #define AF_INET        2    /* Internet IP Protocol     */

    #define AF_AX25        3    /* Amateur Radio AX.25         */

    #define AF_IPX        4    /* Novell IPX

    … …

    其中每一個所支持的協議對應net_family[]數組中的一項,net_family[]是結構體指針數組,其中的每一項都是一個結構體指針,指向一個net_proto_family 結構

    struct net_proto_family {

    int family;

    int (*create) (struct socket * sock, int protocol);

    short authentication;

    short encryption;

    short encrypt_net;

    struct module *owner;

    };這個結構體中註冊了關於協議的信息。

    4)設備無關介面

    設備無關介面是由net_device實現的。任何設備和上層通信都是通過net_device設備無關介面。

    它將協議與具有很多各種不同功能的硬體設備連接在一起。這一層提供了一組通用函數供底層網路設備驅動程式使用,讓它們可以對高層協議棧進行操作。

    首先,設備驅動程式可能會通過調用 register_netdevice 或 unregister_netdevice 在內核中進行註冊或註銷。調用者首先填寫 net_device 結構,然後傳遞這個結構進行註冊。內核調用它的 init 函數(如果定義了這種函數),然後執行一組健全性檢查,並創建一個 sysfs 條目,然後將新設備添加到設備列表中(內核中的活動設備鏈表)。在 linux/include/linux/netdevice.h 中可以找到這個 net_device 結構。這些函數都是在 linux/net/core/dev.c 中實現的。

    要從協議層向設備中發送 sk_buff ,就需要使用 dev_queue_xmit 函數。這個函數可以對 sk_buff 進行排隊,從而由底層設備驅動程式進行最終傳輸(使用 sk_buff 中引用的 net_device 或 sk_buff->dev 所定義的網路設備)。dev 結構中包含了一個名為 hard_start_xmit 的方法,其中保存有發起 sk_buff 傳輸所使用的驅動程式函數。

    報文的接收通常是使用 netif_rx 執行的。當底層設備驅動程式接收一個報文(包含在所分配的 sk_buff 中)時,就會通過調用 netif_rx 將 sk_buff 上傳至網路層。然後,這個函數通過 netif_rx_schedule 將 sk_buff 在上層協議隊列中進行排隊,供以後進行處理。可以在 linux/net/core/dev.c 中找到 dev_queue_xmit 和 netif_rx 函數。

    5)設備驅動程式

    網路棧底部是負責管理物理網路設備的設備驅動程式。例如,包串口使用的 SLIP 驅動程式以及乙太網設備使用的乙太網驅動程式都是這一層的設備。

    在進行初始化時,設備驅動程式會分配一個 net_device 結構,然後使用必須的程式對其進行初始化。這些程式中有一個是 dev->hard_start_xmit ,它定義了上層應該如何對 sk_buff 排隊進行傳輸。這個程式的參數為 sk_buff 。這個函數的操作取決於底層硬體,但是通常 sk_buff 所描述的報文都會被移動到硬體環或隊列中。就像是設備無關層中所描述的一樣,對於 NAPI 相容的網路驅動程式來說,幀的接收使用了 netif_rx 和 netif_receive_skb 介面。NAPI 驅動程式會對底層硬體的能力進行一些限制。

 

分析內核代碼實現:

1.發送UDP數據包

  在應用程式中

  通過socket()函數建立一個socket,然後通過write()函數講數據寫入socket發送出去

  在內核中:

  a.在系統調用層和協議無關層中

  首先通過socket_file_ops結構找出應用程式在內核中的入口,其函數為sock_aio_write,緊接著調用do_sock_write---__sock_sendmsg---__sock_sendmsg_nosec

  b.在網路協議層中

  調用udp_sendmsg---ip_route_output_flow(選擇路由)  udp_flush_pending_frames---ip_flush_pending_frames(ip協議入口)---ip_local_out---dst_output---ip_finish_output---ip_finish_output2---arp_generic_ops->neigh_resolve_output(建立鄰居信息)

  c.在設備無關介面中

  調用dev_queue_ximt---dev_hard_start_xmit

  d.在驅動程式層中

  調用ndo_start_xmit

 

2.接收IP數據包

  在應用程式中

  通過系統調用recvmsg函數獲取包的內容

  在內核中:

  網卡接收到數據包之後發生中斷,通過netif_rx(此處觸發一個軟中斷,當處理器空閑時再處理)函數將包遞給上層的netif_rx_action(除驅動層之外,上面四層的總入口),繼續調用netif_receive_skb(判斷由哪個協議處理該包)---deliver_skb,然後將數據包遞交給ip協議層處理(ip_rcv-ip協議棧層處理入口),緊接著有丟給udp協議層處理(udp_rcv-udp協議棧層處理入口),udp層處理完之後,遞交給sock->ops->recvmsg,即為recvmsg系統調用對應的函數。

 

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述本篇文章主要介紹apache和nginx的相關配置,tomcat的相關安裝配置我在前面有寫過一篇,詳細介紹通過兩種配置方法配置nginx。tomcat配置參考:http://www.cnblogs.com/chenmh/p/5048893.htmlapache配置源碼安裝./configure ...
  • 本文轉載自http://pengyq.org/1. 幾何符號⊥ ∥ ∠ ⌒ ⊙ ≡ ≌ △2. 代數符號∝ ∧ ∨ ~ ∫ ≠ ≤ ≥ ≈ ∞ ∶3. 運算符號如加號(+),減號(-),乘號(×或·),除號(÷或/)兩個集合的並...
  • 安裝環境Linux伺服器:SuSe11-linux 64/32位Oracle伺服器:Oracle11gR2 64/32位系統要求記憶體:必須高於1G的物理記憶體交換空間:一般為記憶體的2倍,例如:1G的記憶體可以設置swap 分區為3G大小硬碟 :5G以上安裝包為了選擇正確的ORACLE版本,我們需要先瞭解...
  • 第一:其實最好的方法是直接用: mysqldump -u用戶名 -p密碼 資料庫名 < 資料庫名.sql 在linux在操作的,測試過一個一萬多行的導入數據,共121m。在linux下,幾秒內導入成功。如果是在phpmyadmin,或者在各個終端中實施導入121M的數據,是比較困難的,你會遇...
  • 一、RAID簡介傳統磁碟的劣勢:IO性能極弱、穩定性極差。影響電腦性能的組件一般包括:CPU、主板匯流排IO、記憶體IO、硬碟IO、網卡IO。現代的電腦匯流排、記憶體速度可以達到5G每秒,甚至更高,但是硬碟IO往往較低,硬碟是絕大多數電腦的性能瓶頸。RAID(Redundant Array of .....
  • vim快捷鍵不廢話,看圖。<a style="text decoration: none" title="vim鍵盤圖大圖" href="http://images.cnblogs.com/cnblogs_com/BYRans/761498/o_vim.png" target="_blank" 點....
  • Linux Apache svn
  • linux zip命令的基本用法是:zip [參數] [打包後的文件名] [打包的目錄路徑]linux zip命令參數列表:-a 將文件轉成ASCII模式-F 嘗試修複損壞的壓縮文件-h 顯示幫助界面-m 將文件壓縮之後,刪除源文件-n 特定字元串 不壓縮具有特定字尾字元串的文件-o 將壓縮文件內的...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...