資料包在Linux中的流程

來源:互聯網
上載者:User

1.中斷處理函數中:

網卡收到一幀------------------------〉

引發中斷-------------------〉

cpu調用相應的中斷處理函數(指向此網卡驅動中的相應的處理函數)(把此packet讀到ram中)--------------------〉

呼叫netif_rx函數來打上timestamp,並把此skb放入到cpu設定的隊列中-----------------〉

標記非強制中斷(__cpu_raise_softirq)---------------------〉中斷完成。

 

2.當非強制中斷被調用時(一共在三個地方調用),呼叫NET_RX_SOFTIRQ(其實就是net_rx_action()函數)來處理網路方面的非強制中斷。-----------------〉

net_rx_action()根據資料包的協議類型在數組ptype_base[16]裡找到相應的協議,並從中知道了接收的處理函數,然後把資料包交給處理函數,這樣就交給了上層處理,實際調用處理函數是通過net_rx_action()裡的pt_prev->func()這一句。例如如果資料包是IP協議的話,ptype_base[ETH_P_IP]->func()(ip_rcv()),這樣就把資料包交給了IP協議。根據包的類型,尋找系統中註冊了的相應的包處理函數,對於ipv4的ip包,呼叫ip_rcv-------------〉
NF_IP_PRE_ROUTING--------------〉

ip_rcv_finish(進行對此包的路由操作)---------------------〉

根據路由的結果,呼叫ip_local_deliver(給原生包)/ip_forwardd(要轉寄的包)/ip_error()(出現錯誤的包)/ip_mr_input()(多播包的處理)ip_forward:要進行轉寄的包,check ttl, mtu, call NF_IP_FORWARDS,--------------〉

ip_forwmard_finish(check other ip options for forwardd!)-------------------〉

ip_send(如果需要分區,則調用ip_fragment,否則調用ip_finish_output()(call NF_IP_POST_ROUTING,然後時ip_finish_output2(填充鏈路層頭部到skb結構中)--------------〉

hh->hh_output/dsr->neighbour->output

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.