免费注册 查看新帖 |

Chinaunix

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

[内核入门] tcp/ip协议是否真的一定需要缓冲块呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-16 15:11 |只看该作者 |倒序浏览
突然有一个疑问,tcp/ip 协议其实根本没有什么深的技术,但是对与设计协议的人来说是很复杂的,tcp/ip 协议栈就只遵照这个协议的规章制度,解包而已,我脑海里的印象是:
数据帧引发中断,然后获得数据,如果设计追求简单的话,只直接解包头(相对于当前层的包头),丢给上一级就OK,对于一帧一帧的处理过程来说,缓存根本就不是必要的,全部是在内存里操作,不存在速度的问题,那LINUX内核里的 SK_BUFF到底是起的什么作用呢?,(除了减少COPY次数之外的原因),小弟可能见识浅薄,但想知道SK_BUFF的具体作用是什么?
在此多谢了。。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2013-09-17 09:29 |只看该作者
回复 1# true_casey

那你可以先了解一下 sk_buff 的作用。


   

论坛徽章:
0
3 [报告]
发表于 2013-09-17 10:16 |只看该作者
我的粗浅的理解:
1. 数据帧引发中断,然后申请 sk_buff,然后进行一系列的检查后,将数据装入sk_buff,然后丢给上一级。
2. 每来一个帧都要申请一个 sk_buff ,然后在协议栈的处理过程里 free_skb,那么申请sk_buff 的函数必须十分高效,linux 内核的内存管理保证了这一点。

由以上两点,我认为,对于读来说,都是一帧一帧的操作,每一个帧对应一个sk_buff,读操作,sk_buff的作用仅仅在于减小拷贝次数,但是写却很有大作用,因为一个sk_buff可以对应大量的数据,底层的发送帧函数,只要从sk_buff 里读出来,再切成帧再发送出去即可(最大1518)。

> 请问,我的理解是否是正确的呢,你不要叫我看代码,这转移了我的注意力,我只想知道linux 内核是怎么做的,知道是这么个方法就够了。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-09-17 10:42 |只看该作者
回复 3# true_casey
我的粗浅的理解:
1. 数据帧引发中断,然后申请 sk_buff,然后进行一系列的检查后,将数据装入sk_buff,然后丢给上一级。
2. 每来一个帧都要申请一个 sk_buff ,然后在协议栈的处理过程里 free_skb,那么申请sk_buff 的函数必须十分高效,linux 内核的内存管理保证了这一点。

由以上两点,我认为,对于读来说,都是一帧一帧的操作,每一个帧对应一个sk_buff,读操作,sk_buff的作用仅仅在于减小拷贝次数,但是写却很有大作用,因为一个sk_buff可以对应大量的数据,底层的发送帧函数,只要从sk_buff 里读出来,再切成帧再发送出去即可(最大1518)。

> 请问,我的理解是否是正确的呢,你不要叫我看代码,这转移了我的注意力,我只想知道linux 内核是怎么做的,知道是这么个方法就够了。


既然你不想看代码,那就告诉你吧。你的读取理解错误;写也理解错误。。。

   

论坛徽章:
0
5 [报告]
发表于 2013-09-17 10:58 |只看该作者
那请你告诉我一下,到底是怎么处理,不要丢给我这么一句不负责任的话,给出理由。

论坛徽章:
0
6 [报告]
发表于 2013-09-19 09:12 |只看该作者
回复 5# true_casey


首先你的缓存和内存概念理解错了。网卡收报文时,报文首先是存在网卡芯片硬件的高速缓存里的。这块硬件缓存的大小是很小的。如果大量报文到达网卡,就会使
网卡上的硬件缓存填满,这时网卡就会丢报文。所有网卡驱动需要把报文从硬件缓存中拷贝到内存中。这时在内存中一个skb就代表一个报文。



同时linux 内核协议栈是运行在内存中的,直接在硬件缓存中读写报文是不可行的。这也是需要拷贝到内存的原因。如果是到本机的报文,还需要通过socket送到
应用层处理。这时报文还会从内核空间拷贝到用户空间。




   

论坛徽章:
0
7 [报告]
发表于 2013-09-19 10:16 |只看该作者
回复 6# guanglongxishui
对网络不了解,不过我猜数据只要一出现在网卡的缓冲区中,应该就会有中断通知,系统分配sk_buff,然后数据的搬移应该也是用dma方式吧。

   

论坛徽章:
0
8 [报告]
发表于 2013-09-19 20:09 |只看该作者
现在一般的网卡都使用DMA的方式把硬件缓存的报文存入内存,中断通知内核后驱动程序会给每个报文分配skb后送协议栈处理。

论坛徽章:
0
9 [报告]
发表于 2013-09-22 11:26 |只看该作者
谢谢各位,但你说的不全对,你说的是硬件缓存,我说的软件缓存,就是文件系统hash那一类,文件系统软件缓存的存在是为了抗波动(硬盘也有硬件缓存),这样不必频繁的读写磁盘,我觉得sk_buff存在的理由之一也是如此,磁盘写的时候先写到缓存中,当缓存满,或者刷新的时候,再由sync同步到设备,写设备就是写硬件缓存,因为写设备是IO操作,是计算机的瓶颈所在,开一个CACHE可以极大减小IO操作次数,而网卡操作也是IO,也是很慢的,所以得需要一个cache,我觉得sk_buff就充当了这个cache,当然这是其中一个理由,sk_buff存在的理由的确有你说的:如果大量数据到达,会丢数据。但是只是理由中的其中一个,我阅读过 TI C67的开源协议栈,人家就3个mbuf。TI C67上的协议栈实现验证了我的想法,缓存的存在不是必要的,存在是为了速度,我个人觉得网络协议栈缓存存在理由:

1. 减少IO次数
2. 减少COPY 次数
3. 你说的丢数据问题

这是我的拙见,说的不对的地方请指正。

论坛徽章:
0
10 [报告]
发表于 2013-09-22 11:27 |只看该作者
还有,我的问题是 ,是否每来一个帧,就分配一个 sk_buff 呢,谢谢各位了、、、
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP