(资料图)
}
除了 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日内同本网联系。