Chinaunix

标题: 请教大拿们一个多核的问题 [打印本页]

作者: frameyl    时间: 2008-12-12 14:09
标题: 请教大拿们一个多核的问题
在SMP上,有很多数据包要接收时,会在多个CPU上做负载分担。我的问题是:这样怎么保证数据包交给上层的顺序与数据包到达网卡的顺序一致?也就数据包怎样在SMP CPU上保序的问题。
作者: scutan    时间: 2008-12-12 14:31
1. 如果IP包被分成多个小包的话,在IP层会进行包的重组。
2. 在TCP层,有一个包的序列号,TCP协议会根据这个序列号重新组包。
作者: frameyl    时间: 2008-12-12 15:28
那对于UDP或者ICMP等包的话,不需要保序吗?
作者: baohuaihuai    时间: 2008-12-12 15:40
UDP协议自己都不需要保序,你给它保了序又有什么意义呢?
作者: frameyl    时间: 2008-12-12 15:47
是这样的吗?我再仔细看一遍内核的代码
作者: baohuaihuai    时间: 2008-12-12 16:00
其实数据包到达网卡的顺序本身就没什么意义,和这个顺序来比较就更没意义了。
作者: platinum    时间: 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 时间,超过了但还没收齐就会放弃)



因此,你不必关心这些顺序问题,除非你要在数据还原之前自己先要对即将还原的数据进行处理
作者: emmoblin    时间: 2008-12-22 01:20
有的不能保证顺序的需要在应用层做顺序。

其实在做smp的负载均衡时,是把同一个会话的数据包都放在一个cpu上处理。
这样就能保证顺序。至少intel网卡是这样干的




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