Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1177022
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-04 10:29:20

linux网络代码结构

linux网络代码结构:四层
1、设备驱动,Linux/drivers/net/3c501.c
2、网络核心,linux/net/core/dev.c,struct net_device,
3、网络协议族,包括tcp/ip、ipx等协议,linux/net/ipv4
4、网络接口socket层,linux/net/socket.c

1->2: 第一层调用netif_rx()(net/core/dev.c 1214行) 通过*dev_base指向的设备链,把数据传递给第二层。

3->2: 网络接口核心层通过dev_queue_xmit()(net/core/dev.c,line975)这个函数向上层提供统一的发送接口,也就是说无论是IP,还是ARP协议,通过这个函数把要发送的数据传递给这一层,想发送数据的时候就调用这个函数就可以了。dev_queue_xmit()做的工作最后会落实到dev->hard_start_xmit(),而dev->hard_start_xmit()会调用实际的驱动程序来完成发送的任务。例如上面的例子中,调用dev->hard_start_xmit()实际就是调用了el_start_xmit()。 
2->3: IP协议接收数据是通过ip_rcv()函数的,而ARP协议是通过arp_rcv()的,网络接口核心层只要通过这个数组就可以把数据交给上层函数了。 
 通过dev_add_pack注册第三层接收消息的函数。
3->4: 在linux/net/ipv4/protocol.c,往数组inet_protos[MAX_INET_PROTOS] 里面添加协议是通过函数inet_add_protocol()实现的,删除协议是通过 inet_del_protocol()实现的。在linux/net/ipv4/protocol.c的上部,我们可以看到其它协议层的处理函数是tcp_v4_rcv(), igmp_rcv(), udp_rcv(), icmp_rcv()。
4->3: ???

IP层处理方式:
1、本地
2、转发
3、不可能

dev_add_pack()是注册ip层内容的,及网络核心层在什么条件下把消息发给网络协议层;
inet_add_protocol()是注册传输层的,包含tcp、icmp、igmp;
socket_register()是注册socket的。

阅读(693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~