學習Linux-4.12核心網路協議棧(2.1)——介面層加快傳輸速率的特性
前面花了好多篇幅,終於將網路協議棧的初始化相關的內容介紹完了,也就是說完成前面的那些步驟以後,網路協議棧具備了資料包的收發功能。在網路介面層,它只負責資料包的接收與傳送,而不關注資料包在網路層的型別是什麼,所以傳輸速率的快慢往往與介面層的處理有著密切的關係,下面我們來了解一下在提供傳輸速率上面,現在的核心都引進了哪些新的特性。
資料包的接收: NAPI, RPS,RFS
資料包的傳送: TSO, GRO
資料包的處理: slab, RCU
1. NAPI
從上圖我們可以看到,NAPI和非NAPI的最大區別是skb到達網路層的方式,前者通過輪詢直接將包傳遞到網路層,後者則需要等待中斷一個一個將資料包傳遞到網路層。
下面是NAPI的處理過程:
下面是每個CPU都獨有的一個結構體,主要管理在該CPU上資料的收發:
下面是介紹NAPI的兩篇文章,詳細可以參考:
2. RPS
3. GSO/TSO
4. slab
5. RCU
上面這些內容可以先了解以後,起碼知道每個特性的幹什麼的,後面在分析程式碼的時候會詳細分析怎麼實現的,下面講進入網路介面層資料包的接收和傳送過程。
相關推薦
學習Linux-4.12核心網路協議棧(2.1)——介面層加快傳輸速率的特性
前面花了好多篇幅,終於將網路協議棧的初始化相關的內容介紹完了,也就是說完成前面的那些步驟以後,網路協議棧具備了資料包的收發功能。在網路介面層,它只負責資料包的接收與傳送,而不關注資料包在網路層的型別是什麼,所以傳輸速率的快慢往往與介面層的處理有著密切的關係,下面我們來了解一下在提供傳輸速率上面,現在的核心都
學習Linux-4.12核心網路協議棧(3.1)——網路層的收包處理
現在我們將進入傳輸層的分析: 在前面我們知道,資料包到達介面層的時候,它會根據ptype_base來查詢包的型別,並根據包的型別交給不同的網路層函式處理,比如ip_recv,icmp_recv等,現在我們就來看看網路層是怎麼處理不同型別的包的: 1. IP私有資訊控制塊
學習Linux-4.12核心網路協議棧(2.2)——介面層資料包的接收(上半部)
前面寫了這麼多,終於可以開始分析資料報的傳輸過程了,那我們就愉快的開始吧! 我們知道,一箇中斷處理函式主要分兩個部分,上半部和下半部,這篇文章主要介紹上半部分。 當一個數據包到達的時候,網絡卡驅動會完成接收並且觸發中斷,我們就從這個中斷處理函式開始: 當一箇中斷產生併發送
學習Linux-4.12核心網路協議棧(1.6)——協議棧的初始化(inet_init實現過程)
這篇文章主要分析inet_init()函式的實現過程: 1796 static int __init inet_init(void) 1797 { 1798 struct inet_protosw *q; 1799 struct list_head *r;
學習Linux-4.12核心網路協議棧(1.7)——網路裝置的初始化(struct net_device)
在linux的網路裝置裡,其中一個最關鍵的結構體應該要算net_device了,它由對應的網路裝置驅動進行建立和初始化,服務於核心網路子系統。 1. struct net_device 註釋分析 struct net_device這個結構體比較大,在瞭解它之前,我們先看一下
學習Linux-4.12核心網路協議棧(1.5)——協議棧的初始化(inet_init主要資料結構)
前面瞭解到網路初始化申請了兩塊skb快取記憶體和建立了一個/proc/net/protocols檔案,現在開始重頭戲,網路協議棧的初始化。這篇文章主要介紹網路棧中使用到的主要資料結構。 網路協議棧的核心實現和理論上的分層有些不一樣,在程式碼裡面的分層如下圖: 開始前,
學習Linux-4.12核心網路協議棧(1.4)——協議棧的初始化(proto_init)
這篇文章主要分析proto_init過程,它完成協議相關proc檔案的建立 3241 static __net_initdata struct pernet_operations proto_net_ops = { 3242 .init = proto_init
學習Linux-4.12核心網路協議棧(1.8)——網路裝置驅動模組的載入
1.瞭解PCI匯流排 說到網路裝置驅動,就不得不說PCI匯流排,但是這個話題可深可淺,而且網上的資料也是一大堆(比如),但是對於我們來說,目前並不需要掌握很深,下面是網上找的兩張最基本的PCI工作結構圖,雖然PCI總線上可以掛接不同種類的裝置,但我們這裡只要瞭解網路裝置就夠
linux核心網路協議棧學習筆記(6)
本篇討論IP包的收發(暫不包括路由) 先來看inet_init, 首先是呼叫proto_register,註冊了tcp_prot, udp_prot, raw_prot,其中proto_register前半部分是初始化各種slab_cache,後半部分把這些struct
Linux 核心網路協議棧 -sk_buff結構體
sk_buff結構體是linux網路程式碼中最重要的資料結構,是整個網路傳輸載體。所以sk_buff結構體裡面有很多關於其他功能的成員欄位,比如:防火牆,子路由系統,多播等。這些欄位並不是一定有的,只有在滿足特點條件才有的。 sk_buff結構體是雙鏈表結構,sk_buf
Linux 核心網路協議棧 ------ 擁塞避免處理函式 tcp_reno_cong_avoid
慢啟動和快速重傳擁塞避免演算法,函式tcp_reno_cong_avoid 在“慢開始”階段,每收到一個ACK,cwnd++一次,那麼一個RTT之後,cwnd就會加倍 擁塞避免階段,其實就是在一個RTT時間內將cwnd++一次( 注意在不丟包的情況下 ) /* *
Linux 核心網路協議棧 中最重要的資料結構 SKB
在計算機的世界裡,備份是一種美德。-------------漫步雲端 作為核心網路協議部分最重要的資料結構SKB,有很多值得仔細推敲的問題。 SKB這種說法實際包含了兩部分,即skb描述符和skb資料。 Skb描述符即核心中的skbuff結構體,裡面含有大量的指標變數
Linux 核心網路協議棧 ------ tcp重傳資料包 tcp_retransmit_skb 函式
/* This retransmits one SKB. Policy decisions and retransmit queue * state updates are done by the caller. Returns non-zero if an
Linux核心網路協議棧程式碼分析
^ | sys_read fs/read_write.c | sock_read net/socket.c | sock_recvmsg net/socket.c | inet_re
Linux 核心網路協議棧 ----- Linux 核心路由機制(一) (2.6.25)
核心的路由部分是是網路中重要部分,目前在Linux核心中預設的路由查詢演算法使用的是Hash查詢,所以你會看到很多的資料結構是XXX_hash什麼之類(例如fn_hash)。Linux核心從2.1開始就支援基於策略的路由,那麼什麼是基於策略的路由呢?我們一般
Linux 核心網路協議棧 ------sk_buff 結構體 以及 完全解釋 (2.6.16)
在2.6.24之後這個結構體有了較大的變化,此處先說一說2.6.16版本的sk_buff,以及解釋一些問題。 一、 先直觀的看一下這個結構體~~~~~~~~~~~~~~~~~~~~~~在下面解釋每個欄位的意義~~~~~~~~~~~ struct sk_buff {
【Linux 核心網路協議棧原始碼剖析】socket.c——BSD Socket層(1)
寫在前面:本系列文章先把各個層對應的檔案原始碼剖析一遍,最後再穿插起來,理清整個協議棧網路資料包的上下傳送通道,從整體實現上進行把握。 圖片來源於《Linux 核心網路棧原始碼情景分析》 更上層函式:tcp socket函式介紹。本篇則是介紹BSD Sock
Linux 核心網路協議棧 ------ tcp_ack 函式處理接收到的ACK包之後
注意 tcp_ack 是來處理接收到的ACK的,那麼到底怎麼去做呢?看下面: 先還上把tcp_sock的結構放在這裡,下面一些資料的分析需要用到: struct tcp_sock { /* inet_connection_sock has to be
【Linux 核心網路協議棧原始碼剖析】bind 函式剖析
socket 函式並沒有為套接字繫結本地地址和埠號,對於伺服器端則必須顯性繫結地址和埠號。bind 函式主要是伺服器端使用,把一個本地協議地址賦予套接字。 1、應用層——bind 函式 #include <sys/socket.h> int bind(int
如何在Linux 4.12核心新增系統呼叫
轉發:http://blog.csdn.net/qq_34911465/article/details/74840024 基本情況 系統版本:CentOS Linux 7 核心版本:linux-4.12 準備操作 1.下載並且解壓開啟資料夾 2.進入資料夾後進入系統呼叫