十年碼農內功:收包(一)

    來源: 個人圖書館-漢無為2023-08-21 01:40:34
      


    (資料圖)

    }

    除了 IP 還有下面協議:

    $ grep -R dev_add_pack net/{ipv4,packet}/*net/ipv4/af_inet.c:         dev_add_pack(&ip_packet_type);   //IPnet/ipv4/arp.c:             dev_add_pack(&arp_packet_type);  //ARPnet/ipv4/ipconfig.c:        dev_add_pack(&rarp_packet_type);net/ipv4/ipconfig.c:        dev_add_pack(&bootp_packet_type);net/packet/af_packet.c:     dev_add_pack(&po->prot_hook);    //用于抓包net/packet/af_packet.c:     dev_add_pack(&f->prot_hook);     //用于抓包

    包的類型可以通過下面命令查看:

    $ cat /proc/net/ptype     # packet type (skb->protocol)Type Device      Function0800             ip_rcv0806             arp_rcv86dd             ipv6_rcv

    1.7.4 小結

    好了,inet_protos 存儲著 TCP、UDP 和 ICMP 接收數據的 udp_rcv 和 icmp_rcv 函數地址,ptype_base 存儲著接收數據的 ip_rcv 函數地址。后面會看到軟中斷中會通過 ptype_base 找到 ip_rcv 函數地址,進而將 IP 包正確地送到 ip_rcv 中執行。在 ip_rcv 中將會通過 inet_protos 找到 TCP 或者 UDP 的處理函數,再而把包轉發給 tcp_v4_rcv 或者 udp_rcv 函數。

    ip_rcv、tcp_v4_rcv、udp_rcv 和 icmp_rcv 函數已經注冊好了,就等待數據包的到來。最后通過 inet_create 函數根據具體協議類型和 inetsw 鏈表數組創建套接字來完成接收數據。

    二、網絡收包概述

    前面主要介紹了系統啟動時的初始化操作,接下來開始正式介紹網絡的詳細收包過程,從網絡接口層(L1)、網絡層(L2)、傳輸層(L3)、套接字(L3.5)再到應用層(L4)的整個過程。

    圖2 整體流程圖

    從硬中斷到協議棧的調用鏈:

    圖3 完整調用鏈

    關鍵詞:

    責任編輯:sdnew003

    相關新聞

    版權與免責聲明:

    1 本網注明“來源:×××”(非商業周刊網)的作品,均轉載自其它媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責,本網不承擔此類稿件侵權行為的連帶責任。

    2 在本網的新聞頁面或BBS上進行跟帖或發表言論者,文責自負。

    3 相關信息并未經過本網站證實,不對您構成任何投資建議,據此操作,風險自擔。

    4 如涉及作品內容、版權等其它問題,請在30日內同本網聯系。