网络编程--走出完成端口的误区文章来源网络 属于端口分类 电脑编程网整理 20091020 简介:这是网络编程--走出完成端口的误区的详细页面,介绍了和端口,有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处 网络编程--走出完成端口的误区
[2]完成端口在什么情况下是高效的选择?什么时候成为低能儿? 完成端口的高效是相对与SELECT的‘低效’而言的,但是,其实,有时候,完成端口会成为低能儿,这要看具体的应用,针对不限速度,在多连接情况下,希 望最高效率发挥网络带宽优势的应用[也就是不在乎CLIENT的公平处理],或者希望能够以接近实时速度处理网络变化的[例如在线播放],完成端口是很好 的选择,因为可以在第一时间处理网络事件。但是完成端口不是万能药,使用完成端口,和二进制协议,例如基于包的传输协议的处理很容易,效率也很高,但是对 主流的变长文本协议,例如HTTP服务,FTP服务,EMAIL服务等,完成端口的结合,则比较困难,在网络不好的情况下,效率直线降低,为什么呢?因为 TCP有个内部缓冲,在完成端口下,这个缓冲的作用被弱化了,只要有一个包到达,完成端口就执行一次从缓冲里读操作检测执行,而通常应用,一个数据段会由 很多包组成,这样,内核线程需要调度很多次,而如果使用非阻塞SOCKET读,通过定时检查机制,可以避免这种内部的频繁调度,但是,由于定时并且运行在 用户态而非核心态,因此无法在第一时间知道变化。这么理解呢?就好象你要发快件,在完成端口下,你只要发现有一封快件就绪,你就立即送到快递公司里去处 理,而SELECT下,你发现有快件就绪,则通知快递公司,让他们的快递员有空了上门,在定时检测机制下,则是不管有多少快件就绪,反正快递公司每天上门 一次。这里的快递公司,就是执行的调用者。 [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算法的作者吧 |
|