Chinaunix

标题: tcp/ip协议是否真的一定需要缓冲块呢? [打印本页]

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

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


   
作者: true_casey    时间: 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 内核是怎么做的,知道是这么个方法就够了。
作者: 瀚海书香    时间: 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 内核是怎么做的,知道是这么个方法就够了。


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

   
作者: true_casey    时间: 2013-09-17 10:58
那请你告诉我一下,到底是怎么处理,不要丢给我这么一句不负责任的话,给出理由。
作者: guanglongxishui    时间: 2013-09-19 09:12
回复 5# true_casey


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



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




   
作者: 鬼鬼一哈    时间: 2013-09-19 10:16
回复 6# guanglongxishui
对网络不了解,不过我猜数据只要一出现在网卡的缓冲区中,应该就会有中断通知,系统分配sk_buff,然后数据的搬移应该也是用dma方式吧。

   
作者: guanglongxishui    时间: 2013-09-19 20:09
现在一般的网卡都使用DMA的方式把硬件缓存的报文存入内存,中断通知内核后驱动程序会给每个报文分配skb后送协议栈处理。


作者: true_casey    时间: 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. 你说的丢数据问题

这是我的拙见,说的不对的地方请指正。
作者: true_casey    时间: 2013-09-22 11:27
还有,我的问题是 ,是否每来一个帧,就分配一个 sk_buff 呢,谢谢各位了、、、




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2