免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2484 | 回复: 9
打印 上一主题 下一主题

[网络子系统] raw socket问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-15 18:54 |只看该作者 |倒序浏览
内核是如何将网卡收到以太网帧放入row socket中的,是将新收到帧不断的往后填充缓存直到满还是缓存中只存放一个帧,以后到达的帧将被丢弃或者覆盖前面的帧?
我像这样创建了一个sockfd:sockfd = socket(PF_PACKET, SOCK_RAW, htons(0xffff));,后面在这个sockfd上调用recvfrom时:recvfrom(sockfd, buffer, 2048, 0, NULL, NULL),存在丢包问题?请问一下为什么会丢包,内核是如何丢包的,如何解决丢包问题?

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
2 [报告]
发表于 2013-07-16 15:45 |只看该作者
个人理解可以通过增大套接字接收缓冲区来缓解丢包问题,但是不能杜绝。内核在接收到数据包时会做缓冲区上限检测,如果超过上限,会丢包。回复 1# whxlovehy
   

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
3 [报告]
发表于 2013-07-16 15:45 |只看该作者
个人理解可以通过增大套接字接收缓冲区来缓解丢包问题,但是不能杜绝。内核在接收到数据包时会做缓冲区上限检测,如果超过上限,会丢包。回复 1# whxlovehy


   

论坛徽章:
0
4 [报告]
发表于 2013-07-17 17:20 |只看该作者
回复 2# zhanglin496


    那内核是如何存储接收到的以太网帧的呢,是以块缓存的模式还是以链表的模式?我个人觉得是链表的模式,因为我调用recvfrom从raw socket读取帧时,接收到的都是一个帧,而不会是多个帧。如果以链表模式存储,那设置缓冲区大小又是如何影响到链表的呢?

论坛徽章:
0
5 [报告]
发表于 2013-07-17 20:14 |只看该作者
内核是如何将网卡收到以太网帧放入row socket中的


1.设备/内核交互现在一般都是用DMA机制将数据填入缓存(rx-ring,也可以理解为链表)并发送硬件中断通知,之后由NAPI轮询
2.进入socket过程:netif_recieve_skb->packet_type[PF_PACKET]->packet_rcv->数据入列,然后 sk->data_ready 唤醒recvfrom所在线程

如何解决丢包问题?


你得看看你系统什么配置,内核版本多少,驱动如何实现的,数据流量如何/分布如何,这个很复杂……

论坛徽章:
0
6 [报告]
发表于 2013-07-18 15:48 |只看该作者
回复 5# 卖萌犯法


    好吧,谢谢大神,我表示我还看不懂你在说什么。慢慢学习吧!

论坛徽章:
0
7 [报告]
发表于 2013-07-18 22:53 |只看该作者
回复 6# whxlovehy

呃,抱歉,我尽量说通俗点。

所谓recvfrom,就是上层应用为接受数据而放置的一个篮子而已。
程序停在这,等着有人往里放东西,放什么东西,由socket的协议族和协议类型指定。

可是网卡驱动并不知道谁在等着接受报文,所以它将会处理所有它所接收到的报文,并传递给网络层。
网络层会按照协议族和协议类型,查找对应的接收者,也就是你所创建的socket,并将报文内容填入你所分配的缓存
(填充的过程实际上是异步的,但你不需要这么想)。

对于驱动与硬件:
驱动会创建一个缓冲块链表,这个缓冲块在内里叫sk_buff,链表叫做rx_ring
(你理解的没错,那确实是个链表,实际上,所有向上传递的过程中用的都是链表,直到装入你分配的缓存之前)。

驱动会将他所分配的缓冲块传递给硬件,硬件通过DMA方式,去填充这个缓冲块。

这就是接收的全过程,最先开始的部分写在了后面。

对于缓存上限和丢包:
由于系统资源是有限的,为了不让资源耗尽,对于来不及处理的报文就要丢弃,所以会产生丢包(不考虑硬件本身的性能问题),
这个确实取决于缓存大小,但不是单个缓存块的大小,因为它只跟MTU相关。
所谓的缓存大小是指系统配置的缓存队列长度,这个可由ethtool配置。

论坛徽章:
0
8 [报告]
发表于 2013-07-19 09:00 |只看该作者
千兆网卡的盛行,如果网络链路不是瓶颈,那么可以想象,终端必然成为制约网络速度的极大阻碍,
缓冲池用空,导致网络丢包很正常,所以才需要上层通过网络协议来保证整个端对端数据的一致性

论坛徽章:
0
9 [报告]
发表于 2013-07-19 10:43 |只看该作者
回复 7# 卖萌犯法


    很通俗,很易懂!感谢感谢,瞬间明白了!虽然没接触过sk_buff,但是看过《TCP/IP详解 卷2》中的mbuf,相信原理应该差不多。非常感谢。
    对这个linux的内核网络栈挺感兴趣的,还想麻烦大神给推荐点相关的学习资料吧!

论坛徽章:
0
10 [报告]
发表于 2013-07-19 13:51 |只看该作者
回复 9# whxlovehy

你可以看看这本书:
《understanding-linux-network-internals.pdf》
这本书已经包括了linux内核网络子系统的大部分内容了,如果不深入研究驱动的话,这本书讲已经足够用了。

不过好像没有中文版。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP