十年码农内功:收包(一)

来源: 个人图书馆-汉无为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日内同本网联系。