免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: scutan
打印 上一主题 下一主题

请教关于UDP的一个问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-08-26 16:23 |只看该作者
原帖由 Solaris12 于 2008-8-26 16:16 发表



不清楚Linux的实现,但我要说的是,所谓的协议栈的层,是抽象的概念,其实某层的code很可能就是一个个函数,UDP调用IP的函数就可以了。

所以所谓分层只不过是抽象和总结而已,在内核看,可能某一层不存 ...

同意,确实有的时候就是一个函数的调用,而且越是这样简单的接口,层的概念反到清晰
udp包大了,肯定是要分片的,不过这个地方tcpdump是无法区别在哪儿分片的

论坛徽章:
0
22 [报告]
发表于 2008-08-26 16:33 |只看该作者
原帖由 flw2 于 2008-8-26 16:23 发表

同意,确实有的时候就是一个函数的调用,而且越是这样简单的接口,层的概念反到清晰
udp包大了,肯定是要分片的,不过这个地方tcpdump是无法区别在哪儿分片的


嗯,还是没仔细看楼主的问题,tcpdump只能确定是否分了片。

不清楚systemtap可以观察MIB2的counter, 如果可以的话,可以也可以利用systemtap来找到分片的函数。

呵呵,现在我遇到问题首先考虑用工具,然后才看代码。

论坛徽章:
0
23 [报告]
发表于 2008-08-26 16:38 |只看该作者
找到了下面这个链接, 讲ip_append_data的
http://hi.baidu.com/linux_kernel ... 363343fbf2c0dc.html

论坛徽章:
0
24 [报告]
发表于 2008-08-26 16:51 |只看该作者
原帖由 scutan 于 2008-8-26 16:38 发表
找到了下面这个链接, 讲ip_append_data的
http://hi.baidu.com/linux_kernel ... 363343fbf2c0dc.html

果然

论坛徽章:
0
25 [报告]
发表于 2008-08-26 16:59 |只看该作者
小结一下, UDP协议不会进行分包, 传送的数据会放到同一个UDP头部进行发送, 但是在Linux内核的实现中, 它会在UDP层进行分包, 但是之后会进行合并, 并加上唯一的UDP头部传送给IP层进行处理.

论坛徽章:
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
26 [报告]
发表于 2008-08-26 17:28 |只看该作者
原帖由 scutan 于 2008-8-26 16:59 发表
小结一下, UDP协议不会进行分包, 传送的数据会放到同一个UDP头部进行发送, 但是在Linux内核的实现中, 它会在UDP层进行分包, 但是之后会进行合并, 并加上唯一的UDP头部传送给IP层进行处理.


呵呵,自己解决了。。。

论坛徽章:
0
27 [报告]
发表于 2009-02-18 23:26 |只看该作者
原帖由 scutan 于 2008-8-26 16:59 发表
小结一下, UDP协议不会进行分包, 传送的数据会放到同一个UDP头部进行发送, 但是在Linux内核的实现中, 它会在UDP层进行分包, 但是之后会进行合并, 并加上唯一的UDP头部传送给IP层进行处理.


更正一下:

之前的理解有一点错误,应该为:在UDP层进行了分包之后,不会再进行合并了

解释:
对于UDP协议来说,在发送的时候会调用函数ip_append_data,在该函数中会根据MTU的大小,对数据包进行分片,除第一个sk_buff外,将其余每个在MTU大小内的数据加上sk_buff头部,全部挂接到第一个sk_buff的frag_list链中。如下图所示:


然后将数据包传送到了IP层时,会调用函数ip_fragment。该函数的其中一个功能就是对本机发送的已经经过了分片的数据包进行发送。
但是在之前的内核中,所有的分片工作都是在IP层作的,IP层可能会收到很大的一个数据包,然后将其分成若干个小包,并发送。其中的拷贝就对性能产生了一定的影响。
因此在新的内核中就在将数据从第四层传送到IP层的时候提前将这个分片的工作给完成了。也即是像上图那样,每个sk_buff所包含的数据包的大小都在MTU的范围内,因此,现在在IP层的任务就是为每个数据包建立一个IP头。所以说在发送UDP数据包的时候,会在UDP层提前对数据包进行分片(因为现在不分,以后到了IP层也仍然会分片的)。然后在IP层,只对分了片的数据包添加头部即可了。通过这种方式,提高了传输的性能。

所以,在了L4层的提前分片的功能,使得ip_fragment函数的功能就分成了两个大的方面:快速分片与慢速分片。由于只在本地发送UDP包的时候才会提前进行分片。所以有很多包的大小还是大于MTU的。所以在慢速分片的情况下,会将sk_buff中的数据根据MTU的大小来分片,并添加上IP头部。对于在UDP层已经进行分片了的数据(可以通过frag_list来判断),则使用快速分片的方式,在每个sk_buff中加上IP头部即可。

对于ip_fragment函数更详细的解释在《深入理解Linux网络内幕》中第22章有讲解,我也是最近看到那么才发现之前的想法是错误的。

评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 我很赞同

查看全部评分

论坛徽章:
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
28 [报告]
发表于 2009-02-19 09:26 |只看该作者

回复 #27 scutan 的帖子

scutan兄的钻研精神值得学习啊。
BTW,已经看到第22章了啊。进展很快啊。

论坛徽章:
0
29 [报告]
发表于 2009-02-19 09:45 |只看该作者
原帖由 Godbach 于 2009-2-19 09:26 发表
scutan兄的钻研精神值得学习啊。
BTW,已经看到第22章了啊。进展很快啊。


发现<深入理解Linux网络内幕>这本书确实很全, 除了Netfilter, QoS, L4层没怎么讲之外, 其它的都很详细. 有点像百科全书啦. 哈哈

论坛徽章:
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
30 [报告]
发表于 2009-02-19 09:53 |只看该作者

回复 #29 scutan 的帖子

是吧。一定要好好看。你看的这么快,而且还是英文的,实力很强啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP