文章来源网络 属于端口分类 电脑编程网整理 20091020
简介:这是网络编程--走出完成端口的误区的详细页面,介绍了和端口,有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处
网络编程--走出完成端口的误区
[版权所有:YuSheng E-mail: danscort#nbip.net #->@ ]
最近一段日子,可以有时间到论坛看看网络编程版块了,很多关于服务器网络模型的选择,几乎有一半的人看都不看人家的去需求,直接就回用完成端口吧,我在自己的代码里用了,速度有读快之类的,看了很无语,今天有点时间,写了点个人关于完成端口的看法。
[1]为什么要在WINDOWS平台推出完成端口模型?
我们知道,LINUX为了解决SELECT或者POLL函数调用效率不够高的问题,退出了一个内核调用函数EPOLL,而WINDOWS下的完成端口更进一步,EPOLL只是在有变化的时候通知投递者,而完成端口干脆连部分变化也一起给处理了。SELECT效率为什么不如EPOLL,这就需要操作系统知识了,因为操作系统对句柄的管理是全局的,而很多操作是通过驱动来完成的,SELECT的原理是,对SELECT指定的SOCKET队列进行循环扫描,直大发生指定变化或者超时,注意是循环,特例就是指定超时时间为0,这个时候,SELECT的效率同样是很高的,而当变化发生时,由于调度的关系,这个时候SELECT可能并没有被调度运行,导致了时间的延迟,具体请参考操作系统原理中CPU的分配策略。而引入完成端口,则通过在内核开启线程,在内核级别对需要监视的句柄进行监视,可以在驱动投递信息的第一时间发现,并立即使用内核线程进行处理,例如,TCP协议栈接收到了一个数据包,那么这个关联的句柄发生的变化会立即通知给内核对应线程,内核线程将立即处理。
和 "网络编程--走出完成端口的误区" 有关的 c#、asp.net、c++ 编程小帖士: strong>Trim()清除字串前后空格 |
[3]我为什么不采用完成端口?
我写的FtpAnywhere软件,在第三次重写底层代码的时候,曾经考虑使用完成端口,毕竟MAKEDOLLAR公司大力推荐这个,但是很快发现了问题,MS自己的IIS竟然用驱动,而不是完成端口?其次,如果使用完成端口,和协议很难结合,因为国际标准的FTP协议是以回车换行为结束标记,而且指令是变长的,如果我采用完成端口,那么会面临碎片攻击导致频繁调度,例如,一个1200个字符组成的命令行,别有居心的程序,可能按每次1到5个字符发送,这样的合法攻击一多,服务器性能立即直线降低,在完成端口通知机制下,可能为了一个连接的一个指令,需要调度几百次之多,而每次调度,除了接收,还需要执行结尾判断,服务器资源将被大量合法浪费,而WINDOWS下的消息开销同样昂贵,而且有最大消息队列限制,数量超极限就出现消息丢失。而如果使用非阻塞的定时机制,则可以借助TCP本身的缓冲,避免这个问题。
F .......
最后给各位推荐几本个人认为很经典的书籍
[1] UNIX网络编程 [RICHARD STEVENS版,最新版可以当参考]
[2] TCP/IP协议卷 1-3 [RICHARD STEVENS等]
[3] LINUX内核XX 名称可能不正确 作者是德国人还是美国人,忘记了,但是详细分析了LINUX下TCP/IP协议栈的实现和内核调度,看介绍就知道了,这个书很经典,分析的很详细
[4] 操作系统原理 英国MINIX作者编写的
[5] 安全编程 美国人写的,好象是什么PGP算法的作者吧
联系客服