这种情况下, 只能根据你收到的逻辑包大小来收剩下的内容, 由于TCP流传输的特点, 你没法判定后面还会不会给你发剩下的包, 所以,
接收操作是比较被动的, 尽管这个内容可能并不是你想的合法的内容. 而这个包的具体格式和数据内容到底非法还是合法, 并不由网络层来处理,
交给逻辑层处理会更为合适.
对待恶意攻击, 你的网络底层应该足够强壮, 主要是一些边界值处理好就行了, 比如:当确定的逻辑包长度小于你指定的逻辑包最小长度时,
这个包明显是错误的, 要丢弃或关闭当前连接; 同理, 如果你定义了逻辑包最大长度, 那这个边界值也要检验.
网络层只负责处理这些边界值并负责把属于边界值以内的逻辑包接收下来即可, 具体的包内容判断交给上层去作.
--
Best regards
大宝(sodme)
Msn : sod...@hotmail.com
Email : sodm...@gmail.com
在 06-3-2,大宝(sodme)<sodm...@gmail.com> 写道:
1. 逻辑包大小根本就是一个非法值: 太小且小于最小逻辑包长度比如1或2(总之就是你用来定义逻辑包长度的那个字节数),
太大且大于最大逻辑包长度(拼包算法进行操作时, 可能会用到所谓的拼包缓冲区, 而这个缓冲区如果是静态的,不是new出来的,
你就得预计最大包可能是多大, 超过这个大小的包要进行异常处理)
2. 逻辑包的包类型根本不是游戏所允许的包类型
3. 逻辑包的包类型是允许的包类型, 但包内容却是错误的, 比如一个说话包, 虽然类型也是说话包的包类型,
但说话者ID这个字段的值却是一个根本不存在或根本不在线的玩家, 那这个包也是异常包.
针对于前两种情况, 我们都可以在网络层处理掉, 但针对于第3种情况, 只有在逻辑层去作了,
网络层是没法知道或根本不用知道第3种错误的处理的. 网络层与逻辑层各司其职就OK了.
至于BrillyWu说的在逻辑层也作一次边界检查, 这个, 我不知道指的是什么意思, 如果仅指基于数据格式方面的长度边界检查,
我认为没必要, 因为这个数据是由网络层提交给你逻辑层的, 网络层已经作为这个长度边界检查.
而如果BrillyWu说的是象前面说的"说话包里的说话内容长度"这样类似到具体包内容的字段里所含的长度边界检查, 那逻辑层自然是要作的.
Email : sodm...@gmail.com
|
|
>>重新定位并非难事, 呵呵. 当发现当前包格式有误时, 只要重置拼包缓冲区首指针就可以>>继续收后面的数据并完成拼装. sunway应该指的是这样的重新定位吧? :) Web : http://www.GhostSoft.net
--
sodme
2006/3/3, 大宝(sodme) <sodm...@gmail.com>: