日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux网络收包过程

發布時間:2025/3/15 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux网络收包过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄一下linux數據包從網卡進入協議棧的過程,不涉及驅動,不涉及其他層的協議處理。

內核是如何知道網卡收到數據的,這就涉及到網卡和內核的交互方式:

輪詢(poll):內核周期性的檢查網卡,查看是否收到數據。優點:數據包非常多的時候,這種處理方法會非常快速有效。缺點:數據包少的時候會CPU總是輪詢卻沒有收到數據包,造成CPU資源的浪費。這種方法很少使用。

中斷(interrupt):網卡收到數據就給內核發送硬件中斷打斷內核的正常運行,讓內核來處理數據包。優點:在數據包少的時候CPU能及時中斷其他任務來處理數據包,比較高效。缺點:數據包多的時候每個數據包都引發一次中斷,造成CPU頻繁地在收包過程和其他過程之間切換,浪費時間。在極端情況下收包中斷可能會一直搶占CPU造成軟中斷無法運行,收包隊列得不到處理,進而造成大量丟包。這就是所謂的receive-livelock。

Llinux早期是采用中斷的方式處理數據包的,之后引入了另一種方式NAPI,NAPI結合了輪詢和中斷的優點,在數據包少的時候采用中斷方式,數據包多的時候采用輪詢的方式,從而在兩種極端情況下也會有比較好的表現。

在NAPI下收包的過程

先看一個比較關鍵的結構softnet_data,每個邏輯CPU都有一個softnet_data結構,這個結構的poll_list是非常重要的。

struct softnet_data {struct net_device *output_queue;//收報隊列,這個隊列是給傳統收報方法兼容新收報架構用的(backlog_dev),用來模擬NAPI的struct sk_buff_head input_pkt_queue;//用于收包的net_devicestruct list_head poll_list;struct sk_buff *completion_queue;//backlog_dev是一個偽造的net_device用來來處理input_pkt_queue里的數據struct net_device backlog_dev; /* Sorry. 8) */ };

收包過程可以分成兩步:

  • 當網卡收到數據包中斷發生,中斷處理程序就會把當前網卡的net_device插入當前CPU的softnet_data的poll_list鏈表,調度軟中斷。
  • ?軟中斷處理鏈表poll_list,讀出數據包,放入協議棧。
  • 第一步的中斷的代碼可以參考drivers/net/tg3.c文件的tg3_interrupt函數,中斷發生的時候它會調用netif_rx_schedule把當前網卡的net_device插入當前CPU的softnet_data的poll_list鏈表。netif_rx_schedule函數又調度了軟中斷NET_RX_SOFTIRQ。大致結構就是下圖這樣子

    第二步軟中斷在合適的時機得以執行,看一下他的執行過程:

    static void net_rx_action(struct softirq_action *h) {struct softnet_data *queue = &__get_cpu_var(softnet_data);unsigned long start_time = jiffies;//預算,所有網卡的總配額int budget = netdev_budget;void *have;local_irq_disable();while (!list_empty(&queue->poll_list)) {struct net_device *dev;//預算用完了,或者時間太長了,跳出等下一輪處理if (budget <= 0 || jiffies - start_time > 1)goto softnet_break;local_irq_enable();dev = list_entry(queue->poll_list.next,struct net_device, poll_list);have = netpoll_poll_lock(dev);if (dev->quota <= 0 || dev->poll(dev, &budget)) {netpoll_poll_unlock(have);local_irq_disable();//沒處理完,放到隊尾準備下次處理,注意是list_move_tai,不是//list_insert_taillist_move_tail(&dev->poll_list, &queue->poll_list);if (dev->quota < 0)dev->quota += dev->weight;elsedev->quota = dev->weight;} else {netpoll_poll_unlock(have);dev_put(dev);local_irq_disable();}}//省略部分代碼 }

    軟中斷不能長時間占用CPU,否則會造成用戶態進程長時間得不到調度,net_rx_action也一樣。所以net_rx_action函數每次執行最多會處理budget個數據包(所有網卡都算),同時這budget個數據包也需要平均分配,不能只處理一個網卡造成其他網卡得不到處理,net_device的weight和quota是用來處理這個問題的。這個代碼的大概意思是每次從poll_list里取出一個網卡,調用該網卡的poll函數盡可能多的收包(但是不會超過weight),poll函數收包后調用netif_receive_skb把數據包放入協議棧。如果網卡里的數據包沒處理完就會把net_device繼續放到poll_list鏈表等待下一次軟中斷繼續處理,如果網卡里的數據包處理完了就把該net_device從poll_list摘除。

    傳統中斷收包方式

    linux網卡驅動還有部分是用的傳統中斷收包方式,為了兼容也都挪到了NAPI架構上。用softnet_data結構的backlog_dev偽造了一個net_device。中斷發生的時候把數據包放到了softnet_data結構的input_pkt_queue鏈表里。

    static int __init net_dev_init(void) { //省略部分代碼 for_each_possible_cpu(i) {struct softnet_data *queue;queue = &per_cpu(softnet_data, i);skb_queue_head_init(&queue->input_pkt_queue);queue->completion_queue = NULL;INIT_LIST_HEAD(&queue->poll_list);set_bit(__LINK_STATE_START, &queue->backlog_dev.state);queue->backlog_dev.weight = weight_p;queue->backlog_dev.poll = process_backlog;atomic_set(&queue->backlog_dev.refcnt, 1);} }

    軟中斷的處理過程和NAPI類似。

    轉載于:https://www.cnblogs.com/4a8a08f09d37b73795649038408b5f33/p/11475249.html

    總結

    以上是生活随笔為你收集整理的linux网络收包过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 九九亚洲精品 | 久久精品视频3 | 欧美成人午夜精品免费 | 欧美巨鞭大战丰满少妇 | 国产免费av在线 | 五月激情久久 | 红桃视频91 | 色偷偷噜噜噜亚洲男人的天堂 | 国产伦精品一区二区三区视频我 | 国产美女激情 | 97国产精东麻豆人妻电影 | 青草视频污 | 欧美精品乱码99久久蜜桃 | 亚洲一区二区视频在线 | 强公把我次次高潮hd | 亚洲精品久久一区二区三区777 | 国产真实生活伦对白 | 国产手机在线 | 日本精品久久久久 | 中文字幕日韩国产 | 国产suv精品一区二区四 | 亚洲精品一区 | 日韩av电影网址 | √天堂在线 | 六月丁香激情网 | 特级丰满少妇一级aaaa爱毛片 | 美女二区 | 日本wwwwww| 欧美你懂得 | 少妇精品高潮欲妇又嫩中文字幕 | 国产精品成人久久电影 | 狠狠做深爱婷婷综合一区 | 亚洲国产一区视频 | 经典一区二区三区 | 国产成人在线播放 | 精品国产999久久久免费 | 很黄很黄的网站 | 久久久久久久久久久久久久av | 久久九九综合 | 国产免费资源 | 欧美精品片 | 午夜福利电影一区 | 又黄又骚又爽 | 欧美午夜激情视频 | 国产老头老太作爱视频 | 日韩性生交大片免费看 | 久久国产精品久久国产精品 | 91老肥熟 | 在线只有精品 | 美女一区二区视频 | 日韩91av | 91不卡在线 | 欧美黄色三级 | 日韩影院一区 | 伊人宗合| 一区二区在线视频免费观看 | 色哟哟视频在线观看 | 欧美日韩国产三区 | 日韩成人激情视频 | 欧美日韩一区二区三区电影 | 一起操17c| 野花视频免费在线观看 | 欧美激情久久久久 | 不卡免费av | 国产一级片免费 | 风间由美一区二区 | 中文字幕av久久 | 依人成人 | 日本xxxxxxxxx69| 亚洲va欧美va国产综合久久 | 日本一区二区免费视频 | 亚洲六月婷婷 | 91爱爱.com| www噜噜噜| 理论片在线观看视频 | 天堂√8在线中文 | 久久99网| 91美女在线 | 91久久超碰 | 亚洲国产欧美在线人成 | 久热国产视频 | 亚洲插| 精品人妻码一区二区三区红楼视频 | 国产午夜在线视频 | 日韩精品五区 | 三年中文在线观看中文版 | 四虎影院在线 | www.欧美国产 | 超碰97免费 | av毛片基地 | 五月天一区二区三区 | 国产每日更新 | 99riAv国产精品无码鲁大师 | 欧美顶级黄色大片免费 | 免费看污片网站 | 林雅儿欧洲留学恋爱日记在线 | 女教师痴汉调教hd中字 | 波多野结衣中文字幕在线播放 | 亚洲天堂男人天堂 |