加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

所谓网络协议栈

(2012-09-18 01:36:48)
标签:

it

分类: 操作系统
协议分层的用意很明确:
  • 让设备,尤其是路由和防火墙,能够明白每一个协议单元“是什么”。
  • 便于开发人员理解协议。
但协议分层也带来了一些缺陷
  • 不必要的数据包拆分
  • 额外的重复的数据头
  • 动不动就废弃的预定义字段
协议分层引来了协议栈,即从裸数据开始,不断的添加各层协议头,最后再按相反顺序送出整个数据。站在上层开发者角度来说,这是最自然的方式;然而,这样做,不但引发了多个问题,而且是完全没有必要的。
先说问题:
  1. 许多协议头都是变长的,因此在构造栈时,必须使用向高地址增长的栈,或者在低地址预留足够长度的空间供栈的增长用。前者在栈输出时就会产生性能问题,后者存在风险并且内存开销高。
  2. 许多协议头不易区分并识别。例如tcp包和udp包是基于ip包的,但在ip包中,协议类型装在第三个双字的第二个字节,ip包自身的版本却装在了第一个双字的前半个字节。。。。。。如果你是一个防火墙开发者,会对此无比厌恶。ipv6为了兼容ipv4,仍然使用了这种布局,我只能说愚蠢。
  3. 许多协议头的位定义太古老。现代网络硬件拥有大量的缓冲区和接口位的并发读写能力,一次读取十几个字节再处理,比一位一位读取处理要高效得多。然而,为了兼容,协议中仍然存在这种定义。对于使用32/64位处理器来处理协议的操作系统来说,这非常不经济。
然后是理想状况:
  1. 协议头应当是定长的,如果需要变长,则作为数据内容处理。如果一个包分片,则每个片段的数据内容都应该定长。而且,这个长度最好是存储设备的物理分块大小的整数倍/分数。
  2. 协议头应当可以立刻识别,而不论它是哪一层的。很难做到,但是必须做到。
  3. 协议头所有字段只使用字节定义。有可能的话,使用4字节或8字节倍数。
最后说解决方法:
  • 取消链路层(不含)以上的分层。那些都是毫无必要的。
  • 使用分配的特征串来指定协议类型并匹配协议,而不是版本号/协议号这些华而不实的东西。
  • 所有协议头定长,没有什么可选字段。协议参数均按1位定义,每个协议自己去解释参数作用。
  • 协议兼容性(例如tcp兼容ip)是通过替代,而不是扩展实现的。首先特征串会保证设备尽快匹配到兼容协议,然后兼容协议的参数位一致。
  • 协议数据长度固定,可以为128/256/512这样的长度,缺少补0。
  • 将ip协议的地址概念推广到其他兼容协议。不需要留空即可。
结果是:
  1. 协议分层的问题被彻底避免了。
  2. 协议头被规范化了。对于大部分包,去掉了诸如头长度、协议子类型、版本号这种字段,改为一个4字节的特征串。
  3. 参数只用0/1区分,事实上协议参数大部分都只需要true/false或者一个有限范围内的option/level。如果无法实现,那只能说该协议太烂。
  4. 协议头大概在8字节(4字节特征串+4字节参数)或64字节(4字节特征串+4字节参数+8字节数据内容长度+16字节source+16字节dest+16字节扩展参数),和现有协议相当。但对于应用来说,不要开心死了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有