(資料圖)
}
除了 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)的整個過程。
從硬中斷到協議棧的調用鏈:
關鍵詞:
版權與免責聲明:
1 本網注明“來源:×××”(非商業周刊網)的作品,均轉載自其它媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責,本網不承擔此類稿件侵權行為的連帶責任。
2 在本網的新聞頁面或BBS上進行跟帖或發表言論者,文責自負。
3 相關信息并未經過本網站證實,不對您構成任何投資建議,據此操作,風險自擔。
4 如涉及作品內容、版權等其它問題,請在30日內同本網聯系。