|
楼主 |
发表于 2006-12-2 13:12:47
|
显示全部楼层
[quote:b8e8a568c0="zyzii"]sock本身是一个基类,对于TCP而言,(UDP也类似的)在分配sock时的大小是tcp_sock.但从tcp_sock到sock还要过几层才行,具体的情况是:
sock--->inet_sock-->inet_connection_sock-->tcp_sock.
这个实现是内核中面向对象的理念的体现。一个sk_buff只能是一个网卡的接收包。
sock和sk_buff的联系是这样的,以收包举例:
当网卡收到一个包时,分配一个sk_buff,然后将数据放到sk_buff->data指针指向的数据区。下面进行两个很重要的变量的初始化:
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
这两个变量在该sk_buff向上传的过程中起着重要的控制方向的作用。[/quote]
谢谢如此精彩的回帖,节省了我很多查阅资料的时间啊!!!但是~~~
本人愚钝啊,还是没弄明白:是不是数据链路层存取数据包的结构也是sk_buff?网卡收到一个包的过程可否再说的详细一些(小声说句:“谢谢!”),比如从网卡产生中断(ei_interrupt,ei_receive,block_input)到netif_rx(netif_receive_skb)到ip_rcv到tcp_v4_rcv,是不是从中断开始就产生了sk_buff结构(什么函数产生的sk_buff,将数据包复制到data内的?),然后依次上传(记得内核中好像有个标记可以控制内核对网卡接收上来的数据包是否进行处理,也就是是否走mac—>ip->tcp这个流程,是否和raw_socket有关连?直接将原始数据传到上层?)这个时候sock还没产生?
“当网卡收到一个包时,分配一个sk_buff,然后将数据放到sk_buff->data指针指向的数据区”,这个过程是什么层上的什么函数完成的?是中断函数吗?(我对中断不熟)
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
dev是数据包经过的net_device,protocol是ethenet协议类型,这些和sock类型又是怎么关联起来的?
在 tcp_v4_rcv()函数中,根据sk_buff的IP头中的地址等数据找到相应的sock结构:
sk = __inet_lookup(&tcp_hashinfo, skb->nh.iph->saddr, th->source,
skb->nh.iph->daddr, ntohs(th->dest),
inet_iif(skb));
__inet_lookup又调用了__inet_lookup_established函数,然后又调用了一堆sk_for_each,不过在__inet_lookup_established自己声明了sock类型,是不是在这才是最先出现的sock类型?从参数( __inet_lookup)上看sock需要ip的源和目的地址,sk_buff到sock只是需要地址吗?不需要net_device等信息吗?sock只是管理两个IP地址直接从两个接口(网卡)的所有数据包吗?
sk_alloc和sock_alloc也能分配新的sock?但是没有关联sk_buff是这样的吗?这样只是分配了协议,而没有地址是吗?
sk_buff是只管接收数据包不管发送数据包是吗?
《LINUX 内核2.4版源代码分析大全》和《 Linux Network Internals 》 有电子版吗?可否给个下载链接?
稀里糊涂的又产生了这么多的问题,真是不好意思~~ |
|