红联Linux门户
Linux帮助

linux网络整体认识

发布时间:2009-06-16 13:43:58来源:红联作者:xh_8998
开始看重博客了,总觉得写的不够好。但为了有一个开始,先传上来吧。这篇文章现在只有干巴巴的文字,有些方面描述的不是很清晰,希望大家看的时候能从中获取一些新的理解。

一、linux网络分层结构
linux的网络分层如下:
BSD socket(对应数据结构结构为socket->proto_ops,sock_iocb也包含在socket之中, 数据表示用msghdr结构)
Inet Socket 即传输层TCP、UDP(对应数据结构为sock数据结构,sock_common包含在其中;inet_sock->proto结构中包含了sock数据结构。数据包采用了sk_buff结构来表示)
IP层()
网卡驱动

二、linux network的全局变量
1. 通知结构全局变量, static struct notifier_block *netdev_chain;
当对某个nic调用ioctl时,应反应到每一个socket
2. 最上层协议全局变量static struct net_proto_family *net_families[NPROTO];
这个里面放置的都是af_unix, af_inet, af_packet这样的顶层协议结构
这一部分的内容,相当于BSD中提到的域的概念,用来支持不同的网络体系架构,例如iso和tcpip等等
3. 所有的proto类型的变量都要被链接到static LIST_HEAD(proto_list);中,当然这种类型的变量最终还是要被嵌入到sock结构体里面的。
4. packet_type类型的数据结构
该数据结构是用于在协议栈与网络设备之间构筑一个数据传递的桥梁。
有两个全局的变量:
static struct list_head ptype_base[16];
static struct list_head ptype_all;
调用函数dev_add_pack()可把packet_type类型变量添加到hash表中,
在接收数据时netif_receive_skb()函数遍历ptype_base链表,调用其中的每个rcv函数,并传入skb结构。
在文件net/ipv4/af_inet.c中静态定义了变量ip_packet_type,用来表示ip包结构
在文件net/ipv4/arp.c中静态定义了变量arp_packet_type,用来表示arp包结构
5. 网络设备接口常用的全局变量
在Linux内核中,用结构体struct net_device代表一个网络设备接口,内核函数register_netdev用于向内核注册一个网络设备接口。下面看几个网络设备注册相关的数据结构。
dev_base是一个struct net_device的全局指针,它指向的是一个包含当前系统中所有网络设备接口的链表,每次调用register_netdev注册一个新的网络设备接口时,都会在这个链表的尾部新添加一项。
dev_name_head是一个list数组,它实际上是一个哈希表,系统中所有的的网络设备都以它们的名字作为哈希键值放入这个哈希表,以提供诸如dev_get_by_name这样的接口,使得可以通过设备名找到设备。
dev_index_head也是一个list数组形式的哈希表,系统中的所有网络设备在注册时都会被分配给一个索引号,它是按照设备注册的顺序递增的一个值。所有的网络设备都以它们分配的索引号作为哈希键值放入这个哈希表,以提供诸如dev_get_by_index这样的接口,使得可以通过设备索引号找到设备。
netdev_chain是一个struct notifier_block的全局链表,当一个网络设备接口被注册或状态发生变化时,需要调用这个链表中每一项中的成员函数,以通知相关模块,设备发生了变化。如果某一模块需要得到网络设备发生变化的通知,它只需要定义一个struct notifier_block,提供一个通知回调函数即可。所以网络设备注册接下来要调用notifier_call_chain,通知所有相关的模块,有一个新的网络设备接口被注册进来了。
6. softnet_data对应的全局变量
每个CPU对应一个,它是一个结构体struct softnet_data类型,
struct softnet_data
{
struct net_device *output_queue;
struct sk_buff_head input_pkt_queue;
struct list_head poll_list;
struct sk_buff *completion_queue;
struct net_device backlog_dev;
};
成员input_pkt_queue是core层次的接收数据队列。结构体struct sk_buff_head的成员qlen记录接收队列的长度,内核中对接收队列的长度有一个上限限制mynetdev_max_backlog,其值定义为1000。

三、针对inet协议的数据结构和全局变量
1. 结构proto_ops是BSD Socket层的socket结构中定义的操作函数结构。这个结构的实现函数都工作在INET Socket层,实际指向的都是INET Socket层的具体函数。例如:tcp和udp分别指向inet_stream_ops和inet_dgram_ops。
2. 对应数据结构为sock数据结构,sock_common包含在其中;而inet协议自己做了一个数据结构inet_sock,它把数据结构sock作为自己的一个成员。结构proto是INET Socket层的控制函数,它定义不同的协议族,tcp和udp分别对应tcp_prot和udp_prot。
struct sock数据结构存放在文件include/net/sock.h中。
struct proto在文件include/net/sock.h中。
498 /* Networking protocol blocks we attach to sockets.
499 * socket layer -> transport layer interface
500 * transport -> network interface is defined by struct inet_protosw
501 */
3. 所有的传输层协议注册过程
类型net_protocol的作用是提供一个本协议的接收函数,网络层收到数据报后,根据IP首部中的协议字段确定是某一个协议的数据报,然后再到全局变量inet_protos中找到这个接收函数。
在文件include/net/protocol.h中定义该结构,在文件net/ipv4/protocol.c定义下面的全局变量,所有的传输层的协议TCP, UDP, ICMP, IGMP都要在其中注册下面的数组中。
struct net_protocol *inet_protos[MAX_INET_PROTOS];
#define MAX_INET_PROTOS 256
使用函数inet_add_protocol把协议protocol的编号加到hash表inet_protos中,
使用inet_del_protocol从hash表inet_protos删除某个协议。
在文件net/ipv4/af_inet.c中静态定义了协议变量tcp_protocol, udp_protocol, igmp_protocol, icmp_protocol。
4.数据结构struct inet_protosw 。
所谓结构struct inet_protosw是某些传输层协议所提供的服务类型,例如:SOCK_STREAM对应可靠数据流服务,SOCK_DGRAM对应不可靠数据报文服务,SOCK_RAW对应原始IP层服务。
在函数inet_protosw中即有struct proto的指针,也有struct proto_ops的指针。
对应静态全局变量static struct inet_protosw inetsw_array[] ={}
该静态全局变量静态定义了三种socket类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW。
针对ipv4的话实际上是一一对应的,SOCK_STREAM对应tcp, SOCK_DGRAM对应udp,SOCK_RAW对应raw ip。
在这种情况下,同一套接字类型在协议栈的数组inetsw_array中仅对应一项。同一套接字的不同协议类型用链表连接起来。
5. inet_protosw结构数组inetsw_array和net_protocol结构数组inet_protos的对应关系是: inet_protosw::protocol域是整数,这个数就是net_protocol结构类型的数组inet_protos[]的索引。
使用如下: inet_protos[inet_protosw::protocol]就得到了inet_protosw类型的变量。
文章评论

共有 6 条评论

  1. xh_8998 于 2009-06-23 20:18:09发表:

    你们有谁做过lfs啊!

  2. hanrui990233 于 2009-06-20 15:05:39发表:

    高手啊 !写的不错,有价值观念!

  3. xh_8998 于 2009-06-17 22:05:06发表:

    你们有谁做过lfs啊!

  4. wangfeng819 于 2009-06-16 19:54:56发表:

    关于编程方面的,暂时本人不涉及

  5. alexchang_2000 于 2009-06-16 16:12:40发表:

    高人啊~

  6. Songs 于 2009-06-16 15:22:10发表:

    有难度