免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 数据发送时为什么要先在IP层分片再在MAC层线性化SKB [复制链接]

论坛徽章:
3
巳蛇
日期:2014-04-24 17:25:352015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-15 10:13 |只看该作者 |倒序浏览
如题

linux在进行数据包发送时,在ip曾用ip_fragment对大于MTU的数据包进行分片,在MAC层用dev_queue_xmit发送。dev_queue_xmit中先根据硬件网卡特性判断是否支持GSO,如果不支持则进行线性化处理,即把fraglist中的数据合到第一个SKB 数据区域中,如果支持GSO,则直接交给网卡处理。

我的问题是,为什么要先进行分片,再进行组片?

因为水平有限,理解只能理解到这部分,请大虾解惑,或者给个提示。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2014-12-15 22:38 |只看该作者
网络这块不精通,简单回复一下。有错请大家指出。
这两处的目的是不一样的,ip_fragment是分包,是在不支持GSO,TSO等特性时,按IP协议的要求分包。

而对说dev_queue_xmit对包进行全并,考虑的却是硬件层面的事情,skb_needs_linearize函数的说明说得还是很清楚的:
/*
* Returns true if either:
*        1. skb has frag_list and the device doesn't support FRAGLIST, or
*        2. skb is fragmented and the device does not support SG, or if
*           at least one of fragments is in highmem and device does not
*           support DMA from it.
*/


从两个角度去看事情,得出不一样的结论,一个词来形容:事与愿违。

论坛徽章:
3
巳蛇
日期:2014-04-24 17:25:352015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03
3 [报告]
发表于 2014-12-16 10:19 |只看该作者
回复 2# Tinnal


    ip_fragment 和skb_linearize单独的作用很容易理解,疑惑在于为什么内核会先分片又紧接着组片? 处于什么样的考虑这样做的?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-12-16 15:59 |只看该作者
ip层分片和线性化应该是两个不同的概念,如Tinnal所说,分片是考虑mtu和gso(TSO),将不能一次发送的数据分成多个ip报文。
而线性化,是因为硬件不支持frag_list和SG,所以需要线性化,如果硬件支持,是不需要线性化的,通常的硬件都支持。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
5 [报告]
发表于 2014-12-17 14:19 |只看该作者
回复 3# 紫柳
疑惑在于为什么内核会先分片又紧接着组片

个人理解
红色的分片主要是MTU,处于Ip层(不考虑内存是否连续,只考虑包的大小)
蓝色的组片主要考虑的是将不连续的内存,组织成连续的内存,处于mac层




   

论坛徽章:
3
巳蛇
日期:2014-04-24 17:25:352015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03
6 [报告]
发表于 2014-12-17 17:59 |只看该作者

以上几位说的都有些道理,我的疑惑就是 为什么内核会先分片又紧接着组片,这样分分组组的不是浪费资源吗?

现在我认为是为了提高性能,当然是在支持聚合分散I/O的前提下。如果不支持聚合分散I/O,才需要在二层线性化处理,才会出现分了又组的情况。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
7 [报告]
发表于 2014-12-17 21:08 |只看该作者
回复 6# 紫柳


一方面,不能因为个别极端情况,去**良好的架构,IP层不应去直接看硬件的差异,软件设计本身应该不断的屏蔽细节,给上层提供更抽象的接口。否则,还不如你在用户态自己去看看硬件情况,该分包就分,不分包就不分呢。
另一方面,因为支持这个特性的硬件是主流,对于非主流的硬件,只能自己去适配。这也符合社区观。因为内核,特别Linux内核,是一个通用系统。

如果你用了这么极品的老网卡,代表你平来对速度要求就是不很苛刻(因为老硬件本身能力就不强)。如果你还是这么难伺候,非要把你家的老爷车开到最快,请自己去改内核代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP