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

來源: 個人圖書館-漢無為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日內同本網聯系。