免费注册 查看新帖 |

Chinaunix

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

请教大拿们一个多核的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-12 14:09 |只看该作者 |倒序浏览
在SMP上,有很多数据包要接收时,会在多个CPU上做负载分担。我的问题是:这样怎么保证数据包交给上层的顺序与数据包到达网卡的顺序一致?也就数据包怎样在SMP CPU上保序的问题。

论坛徽章:
0
2 [报告]
发表于 2008-12-12 14:31 |只看该作者
1. 如果IP包被分成多个小包的话,在IP层会进行包的重组。
2. 在TCP层,有一个包的序列号,TCP协议会根据这个序列号重新组包。

论坛徽章:
0
3 [报告]
发表于 2008-12-12 15:28 |只看该作者
那对于UDP或者ICMP等包的话,不需要保序吗?

论坛徽章:
0
4 [报告]
发表于 2008-12-12 15:40 |只看该作者
UDP协议自己都不需要保序,你给它保了序又有什么意义呢?

论坛徽章:
0
5 [报告]
发表于 2008-12-12 15:47 |只看该作者
是这样的吗?我再仔细看一遍内核的代码

论坛徽章:
0
6 [报告]
发表于 2008-12-12 16:00 |只看该作者
其实数据包到达网卡的顺序本身就没什么意义,和这个顺序来比较就更没意义了。

论坛徽章:
0
7 [报告]
发表于 2008-12-12 16:42 |只看该作者
原帖由 frameyl 于 2008-12-12 14:09 发表
在SMP上,有很多数据包要接收时,会在多个CPU上做负载分担。我的问题是:这样怎么保证数据包交给上层的顺序与数据包到达网卡的顺序一致?也就数据包怎样在SMP CPU上保序的问题。

我们平常接触的三层协议 IP 最多,我这里只说 IP 协议

1、对于不分片的 IP 包
UDP 是无序的,所有的“有序性操作”都是在应用层实现的
ICMP 分很多类型,只研究过 ping 包,ping 包在 ICMP 头是有序号的的
TCP 包更是由双向的 seq 及 ack 来维护其“顺序性”,这个你不用操心
其他四层协议没研究过
btw:个人认为 ICMP 实际应属于四层协议,数据包的结构足以说明问题了

2、对于分片的 IP 包
通过 IP 头部的 DF 和 MF 标记可以知道自己是不是分片,后面还有没有分片
通过 offset 可以得知本身是位于分片中的序号顺序
而且这些分片包拥有相同的 ID 号(IP 头部)
通过寻找相同的 SIP、DIP、L4PROTO、ID 来把属于同一个分片组的包集合,之后按照顺序去重组(有个 timeout 时间,超过了但还没收齐就会放弃)



因此,你不必关心这些顺序问题,除非你要在数据还原之前自己先要对即将还原的数据进行处理

论坛徽章:
0
8 [报告]
发表于 2008-12-22 01:20 |只看该作者
有的不能保证顺序的需要在应用层做顺序。

其实在做smp的负载均衡时,是把同一个会话的数据包都放在一个cpu上处理。
这样就能保证顺序。至少intel网卡是这样干的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP