刚刚做socket通讯,最多同时连接200个左右的socket使用什么I/O模型最好!!!提供示例者加分!!!

解决方案 »

  1.   

    最多200多用户,如果是我首先排除成端口,然后考虑是否要和用户发送大量的数据,如果是则使用重叠IO,如果不是则使用 select 或者 WSASelectEvent 之类的,因为这样可以降低开发的复杂度。
      

  2.   

    在这里我发了一个重叠IO+完成例程的例子程序(写的比较简陋当时为了测试) http://221.8.31.55/bbs/read.php?tid=83 (需要先注册一个论坛的账号)
      

  3.   

    可以考虑WSAAsynSelect或者WSAAsynEvent,如果对IOCP比较熟的话当然是iocp了
      

  4.   

    同意ProgrameMan才两百个连接,不应选择IOCP.
      

  5.   

    完全没必要iocp,用select就完全可以,也好控制
      

  6.   

    才200啊,随便找一个
    200个就上IOCP,真是大材小用
      

  7.   

    呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!
    不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。
      

  8.   

    如果我来选择,我会选择Overlapped I/O
      

  9.   

    呵呵,使用重叠I/O反映很快?假如带宽就是使用1M 的adsl做服务器是否可以?最大连接数是多少?请有经验的告诉我!!!答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:操作系统:  xp  
    处理器:  AMD3000+  
    内存:  1GB  
    硬盘:  80GB  
    网络:  100MB  局域网
    网络模型: 重叠IO连接数量 = 51000
    *******************************************************************************
    现在使用重叠I/O来实现,在2M的adsl上网的机器做服务器最大连接数是多少才能发挥最好的性能!!!答:这取决与网络数据的交互量,得根据交互量来计算。****************************************************************************
    不要小看这个,假如是IOCP涉及的知识很多很多,线程池、内存等等。答: 重叠IO要想做好同样涉及和多知识,线程池、内存池等等。
      

  10.   

    答:重叠IO 是很快的,可以使用ADSL作服务器,但是个人认为应该解决动态域名的问题,不然每次拨号客户端都要修改服务器的IP。最大连接数我做过测试(就是基于论坛上的例子),具体数据如下:操作系统:  xp  
    处理器:  AMD3000+  
    内存:  1GB  
    硬盘:  80GB  
    网络:  100MB  局域网
    网络模型: 重叠IO连接数量 = 51000
    ---------------------------------------------------------
    我没看走眼吧,51000个连接,1GB内存? 你不会光连接然后什么都不做吧?
    51000 ,算你每一个连接平均缓冲只用4KB,51000*4KB=?,SOCKET本身缓冲R+W是多少?
    windows 32位系统能分配多少空闲物理内存资源给SOCKET? 不会超过50%吧,能上51000?
    严重怀疑你这51000连接的意义,操作系统竟然还 XP,我不知道你是怎么测试的,
    一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
    开51000个连接,不管你什么模型,除非连了就断,否则
    根本就是在扯淡
      

  11.   

    to danscort2000(带鱼丝考) 首先我的测试的确是光测试连接,服务器和客户端并没有进行数据的收发,因为我就是要测试服务器能够支持的最大连接数。对于你所说的,我不想和你进行什么辩论,虽然你说我是在扯淡。我想给你一个建议就是你搭建一个同样的测试环境看看是否可以达到这个数字,如果不可以那我就什么也不说了。还有希望你能在批评一个人之前先确认自己观点的正确性,关于我测试的数据是有一些证据的,你可以看一下之前我的帖子。http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.8761255无论对与错,感谢你多我的批评。
      

  12.   

    to danscort2000(带鱼丝考) 纠正你一点,按你所说的“算你每一个连接平均缓冲只用4KB,51000*4KB=?”51000 * 4k = 204000K = 199.21875MB难道1G的内存不够吗?
      

  13.   

    to danscort2000(带鱼丝考) 操作系统竟然还 XP,我不知道你是怎么测试的,
    一个WIN32进程,就算你开启大内存支持,也最多能使用3GB虚拟内存
    开51000个连接,不管你什么模型,除非连了就断,否则
    根本就是在扯淡
    答: 我还真就是 xp 的(关于内存我上面说过了), 而且客户端连接上以后没有断开。另外告诉你我这个不是在扯淡。
      

  14.   

    那我告诉你
    我自己写了一整套服务器软件和配套软件,
    使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
    我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的
    上面确实是我计算错误,我算成2GB了,这个SORRY
    我的4KB指的是每个连接的缓冲大小,按每个连接你只分配4KB
    51000*4KB,200000KB,大约200M
    那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?
    XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
    不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。
      

  15.   

    如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
    这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
    握手是IP层是事情,我们根本还来不及也无法进行参与,
    所以你做的测试==......
      

  16.   

    那我告诉你
    我自己写了一整套服务器软件和配套软件,
    使用过线程池模型,IOCP模型,SELECT模型,到最后自己开发的非阻塞模型
    我做过这种带数据的测试,我可以负责任的告诉你,WIN32系统下,带数据收发的正常服务,不可能达到这个数字的答: 带数据的测试我也做过,我也可以负责任的告诉你,最初我没有使用1G内存的时候(512MB)我达到了32300,而且个客户端连接以后都发送数据给服务器,服务器也去接收了,这也是经过我实际测试的,我不知道你是怎么做的居然达不到这个数量。******************************************************************
    XP系统里,有个限制,我想你应该知道,虽然你连接了这么多,但是实际上,大部分都是假死状态的,有一些还处于等待队列,最新版本XP系统SP补丁下,即使你修改TCP参数,也没用,连接是假死的,你的测试得到了连接成功,实际上根本没有连接完成或者被挂起了,相当部分还需要服务器端从等待队列到内存的过程,但是你没有进行数据收发操作,你无从知道是真连接还是假连接答: 在本次恢复的最上面我已经回答了。*********************************************************************************8
    那SOCKET R+W需要多少? 至少4+4KB吧,去掉400M,正好在这个极限内核分配内,别的不说,系统资源已经基本吃掉一大半,如果一个WIN32服务器软件,什么都不做,就一些连接要干掉这么多,你认为有意义吗?你说这话的时候经过成熟的思考吗? 1G可以达到 51000,按你所说去掉 400MB 还剩多少呢?如果2G内存呢(在64位机上内存可以更大)? 你说这没有意义我感觉很奇怪,在一些环境下是需要这种大量连接数的,比如客户端要连接到一个服务器并且大部分的时间是空闲的,因为他们是否要接收数据取决于服务器是否有他们的数据(简单的例子,服务器是广告服务器,也就是说当要有广告的时候服务器才发送给客户户端,当没有广告示保持空闲,这只是一个例子,当然可以不这么做,但怎么做取决于具体产品的构架)******************************************************************************我建议你再做个测试,不管什么模型,使用WINSOCK 2。2,服务器端只LISTEN,队列设置为MAX,
    不执行ACCEPT,你再测试能成功连接的个数是多少?是不是很吓人,速度太快了,服务器端什么都不做,客户端就能连接成功这么多!! 你就会发现你的实现是不是正确。
    答: 如果你真的不信我可以把我的测试代码发给大家,大家搭建环境测试一下,看看我是不是在扯淡,有要得请举手。 
    最后我可以对我所说的每一句话负责。
      

  17.   

    如果你做了我给你的那个连接,或者你已经通读了TCP/IP协议3卷,你就应该知道,
    这个连接的速度实际上和什么模型根本没关系,因为它只是操作系统的等待队列,
    握手是IP层是事情,我们根本还来不及也无法进行参与,*************************************************************************
    连接的速度和系统能够接受的连接数量是两个概念,当连接建立后是放到成功连接队列里的,等待队列中的元素应用层是无法发现的,只用党连接进入成功连接队列中,应用层的accept才会返回。
      

  18.   

    其实你说说的这么大连接没有意义,从我自身来讲我是同意的,因为在我的http://community.csdn.net/Expert/topic/5139/5139948.xml?temp=.423382 中我也说过,但是我为什么又说有意义了呢,是因为你非常不负责任的一个词 (“扯淡”),我非常气愤,我在回答任何一个人的问题时从来就没扯过淡,我知道的就知道,不知道的或者含糊的地方我都会加上 我认为或我个人认为,从来不会武断的阐述什么观点,这点大家可以看看我最近的回帖(我市最近2个月才总来CSDN的以前很少来),因此我会继续坚持我的观点 这么多连接数量是有意义的 呵呵
      

  19.   

    你的结果数据从表面上看是对的,可以相信,
    我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
    和你原来采用的模型对比,速度有什么差距,连接数有什么差距
    因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
    已经告诉你了,
    那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。
      

  20.   

    实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别答: 我也建议你去看看 unix 网络程序设计
      

  21.   

    你的结果数据从表面上看是对的,可以相信,
    我只是希望你按我说的方法,自己再做个测试,不要在服务器端ACCEPT,看能成功连接多少个,花费多少时间,
    和你原来采用的模型对比,速度有什么差距,连接数有什么差距
    因为你从客户端连接上看,确实成功了,但是关键的一步就在那里,你的CONNECT返回成功,实际上你的连接还没有完全完成,只是躺在系统的等待队列里面,这就是区别
    已经告诉你了,
    那个是等待队列的速度和连接数,而不是什么模型的速度和连接数,从根本上就是没有意义的。******************************************另外我说的连接成功不是在客户端统计的,使服务器的accept返回后才增加的计数器
      

  22.   

    错是答: 我也建议你去看看 unix 网络编程
      

  23.   

    不过我还是希望你或者看这个帖子的各位动手测试下我的假连接不ACCEPT方法...UNIX和TCP协议,我早就看过也写过里面的代码了,正是因为我所有32BIT的测试,所有的实现都无法达到你说的数字,
    正因为这样,我才知道这里面的关键问题所在
    一个32位进程能做出51000个TCP连接,我是非常非常非常佩服,
    我老实的承认,在我所有的32位服务设计下,单进程我无论如何都做不到
    所以很佩服很佩服
      

  24.   

    如果你认为很快,那好,
    我给你个最简单的对比,
    使用阻塞SOCKET
    开启一个线程
    执行
    while(1)
    {
     s_new=accept(s_server,...);
     if(s_new==INVALID_SOCKET)
    {
    //error
    }
     else
    {
     ::InterlocketIncrement(&mi_total);
     //add something you want
    }}和你的模型对下速度吧,谁快?差距多少?
      

  25.   

    to danscort2000(带鱼丝考) 刚刚我言辞有点过激还望海涵,主要是你说“扯淡”我比较气愤,现在平息了 呵呵,大家出发点都是好的,讨论技术嘛!这样吧,你留下邮箱我把我的代码发给你,你测测看我是不是在扯淡好吗? 呵呵
      

  26.   

    抱歉,我说话比较直接,也冲了点,SORRY代码不用测试了,这个结果是可以相信的,因为你除了连接没有其他代码,我确信可以做到
    用最基本阻塞SOCKET也能做到[email protected]我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的
      

  27.   

    to danscort2000(带鱼丝考)我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们。***************************************************************************
    我的意思是,32位下,单进程实现这么多TCP连接,除非测试连接用,否则是不现实的绝大部分的情况下的确不现实,但是说句实话,我正在公司新产品的构架中引进了这种机制,具体出于什么原因在这里就不方便说了 呵呵,代码我马上给你发过去
      

  28.   

    to danscort2000(带鱼丝考)代码我已经发过去了,请查收另外更正一点我刚刚为了确认我以前的测试结果又测试了一下, xp + 512mb memory + amd3000+ 连接了 32530 个用户,每个用户连接成功后发送1024字节的数据,服务器接收他们(都成功的接收到了)。
      

  29.   

    再问一句,
    你发送完1024字节后,是断开连接,还是继续挂着?你的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?默认下 8+8KB * 32530=520480KB,也就是你的物理内存几乎全部被SOCKET吃光了,我觉得......
      

  30.   

    你发送完1024字节后,是断开连接,还是继续挂着?继续挂着*********************************************的SERVER SOCKET有没有在LISTEN前修改过SOCKET参数?没有修改过,你看一下源代码就知道了
      

  31.   

    to boyplayee() 以经发给你了。
      

  32.   

    这是一个服务器:
    CPU: 至强2.6G X 4
    Physical memory:4G
    Other:......(不说了)
    测试过服务器接受连接:>6W个,客户端随机选择500个socket发送一次(2K)再随机选择500个发送,而服务器接收到后返回数据,运行非常良好!
      

  33.   

    up up
    [email protected]
      

  34.   


    转移个话题,我觉得难度不再是使用I/O,还是Overlapped,还是WSAEventSelect来实现,而在于对报文的处理逻辑。
    至于模型就那么几种,框架例子也就那么1/200行代码,问题是以什么逻辑来处理收发和报文的应用层处理,以及输入输出的效率,才真正体现架构的合理和技巧性。
    比如:各位处理每个连接的收发是不是放两个队列来循环投递的,也就是说每个连接最多占用两个收发的buffer。
    又比如:收到一个完整的报文是放在独立的线程还是放在IO处理线程里面处理为好呢?
    。。
    希望各位高手也能向上面那样讨论下,让俺们再张点知识!!
      

  35.   

    我先抛砖吧,希望能引出好玉来:我可能采用下面的处理方式:对于每个连接来说,接收不使用队列,而是要保证每个连接始终有一个未返回的WSARecv(需要在协议的设计上保正客户端始终是以线性的方式发送请求),而对于发送来说是需要实现一个队列的。另外对于报文的处理我认为可以把每个报文所对应的任务按执行的时间长短分成两类来处理,一类是可以在IO处理线程里直接处理的(时间很短就能完成的且不会阻塞的),另一类是在独立的线程中处理(例如访问数据库等消耗时间比较长的任务)
      

  36.   

    [email protected]
    谢谢!研究一下
      

  37.   

    各位老大:
    线程池如何设计,不用WSAWait...函数他是有限制的,如何做到连接达到几万个。那得启动多少个线程???
      

  38.   

    [email protected] 学习。劳烦了。
      

  39.   

    [email protected]
    学习,谢了!
      

  40.   

    to boyplayee() 由于地震原因给你发的邮件失败了。
    [email protected] 其它要代码的朋友我现在在家代码得明天发了,不好意思
      

  41.   

    [email protected] 
    学习,谢了!
      

  42.   

    大家好,源代码我已经发出了,但是有几位可能收不到,因为 hotmail 和 gmail 的服务器在国外,由于地震的原因无法发送到。
      

  43.   


    转移个话题,我觉得难度不再是使用I/O,还是Overlapped,还是WSAEventSelect来实现,而在于对报文的处理逻辑。
    至于模型就那么几种,框架例子也就那么1/200行代码,问题是以什么逻辑来处理收发和报文的应用层处理,以及输入输出的效率,才真正体现架构的合理和技巧性。
    比如:各位处理每个连接的收发是不是放两个队列来循环投递的,也就是说每个连接最多占用两个收发的buffer。
    又比如:收到一个完整的报文是放在独立的线程还是放在IO处理线程里面处理为好呢?
    。。
    希望各位高手也能向上面那样讨论下,让俺们再张点知识!!----------------------------------------------------------------------------我是这样写SERVICE的 结构是多线程 WINNT SERVICE 进程
    两个监听SOCKET,阻塞,分别由两个线程负责,称为ACCEPT线程
    数目可根据需要改变的主引擎线程,一个负责协议A,一个负责协议B,可以根据需要分别开启1-N个线程(根据CPU数,如果要限制资源占用,全部设置为1,默认为1)
    数目可变的数据处理线程,专门负责处理检索和分解整理等需要耗费大量CPU时间的任务,根据CPU数来设置
    数目可变的数据库处理线程,负责处理用户数据,例如登录,参数修改等
    系统守护线程,用来检查系统目前的运行状态并记录,数字为1两个线程执行阻塞的SOCKET ACCEPT,专门负责新连接的接收,并在接收的时候检测进程内存使用是否已经达到危险程度,是就丢掉,否则再检查系统限制数,所有一切都正常,放入全局结构(预先一次性分配,防止碎片,大约需要0.2KB/连接),由指令处理线程来执行处理两个指令处理线程,分别处理针对两个协议的连接的指令,这才是真正的核心引擎,之前曾使用过线程池模型,速度快,但是内存消耗实在太大,也尝试过IOCP,但是遇到攻击代码,出现攻击性数据消耗了系统大部分资源,我无法用自己的代码进行控制,由于安全问题同样被我放弃,最后使用的是非阻塞SOCKET API,这样可以控制每秒执行的指令数,并可以控制网络传输速度,做到公平性。为什么不使用WSA函数,因为这系列函数,无法利用WIN2K的IP层防护,老外的资料里有的,针对IP FLOOD攻击有问题(WSAACCEPT),我没有查到MS是否解决了这个问题,所以干脆不用,直接使用SOCKET函数写的,没有使用一次SELECT 64个,和64次READ或者PEEK代码的执行速度比快是快了点,但是在我的引擎中很难处理,所以没有使用SELECT 64个,而是首先检查ACTIVE状态,活跃的才调用READ或者SELECT,如果处于任务中,则调用任务处理函数。 所以随便CLIENT怎么攻击,服务器的处理速度是恒定的,大流量攻击数据都被阻塞在TCP层上,也不管你发送的包是否符合要求,或者将N个协议指令一次性打包发送过来,或者发送半个包,都能安全并准确识别。 这里涉及到的主要问题是对不完整指令的处理上,也就是假如一个指令完整应该是 1234567890\n,现在CLIENT只发送了123456,没下文了,如何处理? 其实很简单,我是使用状态指示和SOCKET时间来控制的,如果我的引擎在指定时间内,例如120秒,无法收到完整的指令,那么对不起,我BAN你,该连接结束,这没什么好对不起或者死等待的,最大的可能是用户物理断路了或者服务器遭遇了碎片式的慢攻击,坚决踢掉。还有一个就是应该是一个指令一个指令来,但是用户如何一下发了N个指令怎么办?不合法,这就看你怎么认识,我认为是合理的,所以我在服务器端,不管它发送N个指令,我只是将它接收到有限缓冲,然后按每秒处理规定指令数进行处理,尽管在协议上来说是不正确的,但是我是这么处理的。还有一个概念是安全,100%的安全是做不到的,但是至少保证50%的安全,我看到楼上有人几万个连接,同时500个CLIENT发送几K数据做测试,这是不合适的,那是你基于人性本善来看待你的用户,不去说通过代理服务器进行并发攻击,要是万一几万个合法用户同时发送几KB数据,你怎么办?测试这东西不能做假设的,需要用极限数据来测试,你有几万个连接,你就必须确保能及时安全处理几万个数据的并发; 有个笑话,做同一个程序,我花了三天,IBM用了一个月,运行开始,三天后,我的程序崩溃,IBM的运行了一年。 
                                
      

  44.   

    to danscort2000(带鱼丝考) 你的解决方案我认真地看了2遍,觉得你所说的使用完成端口、重叠IO什么的都是可以解决的啊,另外你说WSA类的api 针对 IP FLOOD 有问题我不能很好的理解你可以详细的说说吗,我不明白你用 socket api 就能避免 IP FLOOD 攻击吗? IP FLOOD 是位于传输层的,而WSA 或者 SOCKET API 都是应用层的,ACCEPT是怎么处理 IP FLOOD 的,这不是防火墙的职责吗?
      

  45.   

    WSAACCEPT函数存在问题,无法和WIN 2000系统的IP协作,也就是无法利用WIN 2K的IP层操作系统级防护,这个问题在国内大多数情况下被忽略了,可以在老外的一本 安全编程 的 大块头书中找到,MS没有解决该问题,问题出在MS 的WSA系列函数的实现上,WINSOCK API没问题,我在MS最新的资料中没有找到该问题说明,但是该问题以前是存在的,国内无人重视罢了模拟100000000个半指令也没问题,因为大部分都被阻塞在CLIENT端的了,我的引擎直接控制了SOCKET的缓冲和接收,所以这样的攻击对我的引擎不起作用的,长指令,空指令,非法指令,多指令这些都测试过了,因为引擎已经考虑了各种问题,不采用SOCKET消息机制,可以确保避免TCP层的攻击,IP层我们够不到完成端口什么的在我们的引擎测试中不适合,淘汰掉了,因为我要直接控制和监督SOCKET传输,不能让操作系统来代理
      

  46.   

    我的理解:如果wsa命令不能为用户提供解决服务器的安全性问题(当然,用户自己的设计是必要的)。那么也就没有那么多人推荐用io complete port 来处理大并发量的服务器了。berkly socket的函数就可以提供ip层的防御?不都是要OS的内核来支持,wsa和asy的区别无非就是系统提供给用户的这些读写操作的方式以及数据的缓冲处理不同。你所谓的组赛accept,我觉得用acceptex也未尝不可啊。每次注册的FD_ACCEPT事件被触发的时候,说明系统分配的Accept队列和你自己投递的Accept已经不够用了,那么这个时候用户也可以先检测系统的资源,如果不够,就不再额外投递Accept给系统就可以了啊。至于Recv和WSARecv我不觉的本质上有什么区别,无非就是一个接收和数据报文的处理方式而已,从任何角度讲,WSARecv都要比Recv的效率高很多,除非用户自己不能很好的使用它。
    楼上所谓的我要直接控制和监督SOCKET传输,这种,难道WSASend的不能控制吗?你也可以用WSASend来实现Send的效果啊?
    当然,这是我个人的理解,呵呵,希望能在讨论中取得进步。
      

  47.   

    不是的,因为这个问题本身就不显眼,国内看过那本书并注意到那个内容的,估计很少,
    为什么不被重视,是因为主流的例如MAIL,FTP,WWW的开发都是基于BSD SOCKET开发的,并没有使用WSA系列函数,一般不存在该问题,而使用WSA编写的服务器软件,也许加了第三方防火墙,或者在路由层使用了什么技术来防止IP FLOOD,很少有直接暴露的,即使有,估计也没几个人会用FLOOD 来攻击
    你说的这个IP安全性问题,应该从两个方面来理解,一种本身可以利用操作系统级别的IP防护,还有一种就是通过第三方软件来防护,但是很遗憾,至少我知道,在WIN2K下,WSAACCEPT函数存在这个问题,虽然很隐蔽,但是确实存在,而BSD的实现是可以直接受WIN2K IP层防护的,至于为什么,我也没搞明白,到今天都不明白,但是只要有安全问题,我就不会采用WSA。你没有理解我的非阻塞SOCKET的意思,不是ASY,ASY立即返回,而非阻塞将发送到全部被发送或者缓冲满,ASY方式将立即返回然后采用事件通知,这个方式对我来说时间无法预测,我不会采用的。 因为这里有一个防止碎片攻击和碎片接收以及指令传输时间控制的问题,我必须监督从反馈信息的开始发送时间到目前时间的时间差,不能等到有消息了才去检查至于为什么采用阻塞ACCEPT,因为这个最简单了,没必要使用系统消息的方式来进行,这个相对来说效率也是最高开销也最小,因为引擎的需要,这部分必须被独立出来执行,所以就用了两个线程来执行
      

  48.   

    to danscort2000(带鱼丝考) BSD的实现是可以直接受WIN2K IP层防护的?
    我认为这不可能,试问 FLOOD攻击最早是什么时候出现的? 那时候还没有WSA呢!-----------------------------------------------------------------------------
    你没有理解我的非阻塞SOCKET的意思,不是ASY,ASY立即返回,而非阻塞将发送到全部被发送或者缓冲满,ASY方式将立即返回然后采用事件通知,这个方式对我来说时间无法预测,我不会采用的。 因为这里有一个防止碎片攻击和碎片接收以及指令传输时间控制的问题,我必须监督从反馈信息的开始发送时间到目前时间的时间差,不能等到有消息了才去检查怎么可能不知道呢,任何一种网络IO都可以在应用层实现啊? 如果按你的理解启不使不用BSD 的都无法预测时间了?这怎么可能,我想不明白
      

  49.   

    模拟100000000个半指令也没问题,因为大部分都被阻塞在CLIENT端的了,我的引擎直接控制了SOCKET的缓冲和接收,所以这样的攻击对我的引擎不起作用的,长指令,空指令,非法指令,多指令这些都测试过了***********************************************************************************
    呵呵 大部分都被阻塞在 client 端了,你怎么知道的?我想说的是任何一个服务器遇到这种问题都是无能为力的,包括你的模型,因为这些数据在ip层是无法发现并过滤得都得交到你的应用层,经过你的检测你才能发现,但是如果这样的数据大量涌入你的ip 层,然后ip层交给你的应用层,你说你处理的是不是都是错误的数据,那你还那里有时间处理正常的用户请求了
      

  50.   

    BSD的实现是可以直接受WIN2K IP层防护的?
    我认为这不可能,试问 FLOOD攻击最早是什么时候出现的? 那时候还没有WSA呢!汗,解释不清楚,FLOOD是IP层,我们引擎够不到的,只能有操作系统去负责对吧?
    你就这么理解吧,BSD 和WSASOCKET的实现是通过操作系统的TCP层,然后操作系统负责的IP层,然后数据链路,然后物理层来进行,[以下是我的假设推论,事实是否如此我不知道]
    现在WSA的实现在IP层 FLOOD时出现了问题,也就是当操作系统遇到IP FLOOD攻击的时候,操作系统能够识别BSD SOCKET的ACCEPT实现提供防护[例如自动拒绝或者关闭什么的],但是不知道为什么,它不会为WSAACCEPT提供防护也就是说MS的 WSAACCEPT的实现存在问题,它遇到IP层的FLOOD攻击的时候,无法象ACCEPT实现那样自动被NT操作系统保护,原因别问我,我也不知道关于时间的监督和控制,从安全角度来理解可能更加容易,假如SOCKET SEND-BUFF为0,现在你必须在60秒内将响应消息发送给CLIENT,而CLIENT是个恶意的CLIENT,它每秒只接收1个字符,RECV-BUFF也是0,1600个字符,1600秒,应该在60秒时就识别出是恶意的CLIENT,如果安全级别提高,那么因该在30秒左右提前识别出是个恶意的CLIENT
      

  51.   

    我想,主流的服务器当然是运行在unix内核的机器上,当然不会有WSA这种模式了。基于unix内核的机器使用的基本都是berkely socket,这个不假,不能说原始套接字不强大,只不过和os绑定了,windows提供了一种更好的处理机制来使用原始套接字。这就位用户提供了更方便的选择。至于说到安全,我觉得这和用原始套接字来实现和用重叠模式实现都没有关系。这只和你的网络环境以及你的传输协议以及对客户端的访问策略来实现的。我只知道使用AcceptEx有个拒绝攻击需要注意的,我很少从一个软件角度去考虑服务器的安全策,我只会在我的协议里面来处理不合法的数据访问的处理问题。至于那种其它的那种攻击,我想应该是nat、网关或者防火墙来考虑的吧。我不觉的我的软件能对那种ping之类的攻击能处理的很好。
      

  52.   

    模拟100000000个半指令也没问题,因为大部分都被阻塞在CLIENT端的了,我的引擎直接控制了SOCKET的缓冲和接收,所以这样的攻击对我的引擎不起作用的,长指令,空指令,非法指令,多指令这些都测试过了***********************************************************************************
    呵呵 大部分都被阻塞在 client 端了,你怎么知道的?我想说的是任何一个服务器遇到这种问题都是无能为力的,包括你的模型,因为这些数据在ip层是无法发现并过滤得都得交到你的应用层,经过你的检测你才能发现,但是如果这样的数据大量涌入你的ip 层,然后ip层交给你的应用层,你说你处理的是不是都是错误的数据,那你还那里有时间处理正常的用户请求了
    //------------------------我理解错了,你说的是IP层的SYN FLOOD或在错误IP包,不是我们协议层的不完整指令吧
    我把你的话理解为协议层的不完整指令恶意攻击了,IP层我们够不到,听天由命了如果是协议层(TCP),我们的引擎将确保将大部分连续指令阻塞在客户端,因为我控制的SOCKET缓冲只有4KB,超过4KB的部分,不等到我们的引擎处理掉这缓冲里的数据并读取新数据,TCP窗口为0,CLIENT根本无法进行这种攻击的,只能被阻塞。这和IP层错不错没关系的。我只能确保TCP层,IP层神仙也保证不了,我们又不是写防火墙软件。
      

  53.   

    碎片式攻击??
    呵呵,说说我的理解,客户端发送1个字节的报文给服务器,服务器肯定会通知Recv事件的,我觉得这个只有到应用层才可以处理,只有用户处理过了才知道是不是合法数据,我不认为有什么机制可以在内核层就能判断这个为非法数据或者因为缓冲区不满就不通知。。
      

  54.   

    wsaRecv和recv的区别就是如果一个接收事件发生,〔wsarecv的空间如果够用,是否这么可以这么说〕,系统则直接把数据复制到用户的缓冲区,而不是先放置到套接字的缓冲区,然后在通知用户曾从内核心copy到用户层。。至于通知我想是一样的吧。。
      

  55.   

    碎片式攻击??
    呵呵,说说我的理解,客户端发送1个字节的报文给服务器,服务器肯定会通知Recv事件的,我觉得这个只有到应用层才可以处理,只有用户处理过了才知道是不是合法数据,我不认为有什么机制可以在内核层就能判断这个为非法数据或者因为缓冲区不满就不通知。。不是IP层的碎片,是TCP层慢攻击导致的小包,现在很流行的,XX服务器被攻击,就是使用的大量代理服务器发送这种包导致的合法攻击,可以通过引擎的时间判断来提前识别这种攻击的,操作系统识别不了这种攻击的。
      

  56.   

    我给你连续发送1800次,每次1个CHAR,
    你通知1800次,处理1800次
    我的引擎,执行300次检测,处理300次
      

  57.   

    to danscort2000(带鱼丝考) 我觉得你说的问题真的不是非BSD所不能解决的啊,什么网络模型都可以解决。另外个人认为你可能是陷入到什么误区了,思路受到某些因素的影响,当然也可能是我考虑的不够周到,不过不管怎样谢谢你分享你的方案和想法。
      

  58.   

    我给你连续发送1800次,每次1个CHAR,
    你通知1800次,处理1800次
    我的引擎,执行300次检测,处理300次****************************************************
    你是怎么做到的,在解释解释
      

  59.   

    你可能不知道,我以前一个版本的服务器软件被国内某组织给攻击了,
    连通知都没有,我找上门去才说SORRY,忘记通知了,所以现在非常重视安全
    网络模型对我的实现来说是次要的,没必要搞的很复杂,因为我的是面向公网的开放协议,数据流量很小,只有协议层的数据,最简单最安全就行,
    但是我必须面对各种攻击,所以很大部分的代码和逻辑函数都用在了安全方面
    客户端才考虑效率优先。
      

  60.   

    我很早就解决了。用的是重叠I/O,windows 网络编程技术上的例子进行改造的。
    也发现很多问题:
    1.假如客户端使用非阻塞方式连接服务器段,使用重叠i/o时:WSARecv函数执行失败(可能socket没有真正连接上,只有执行下面的select才开始连接)
    2.重叠I/O模式不能使用WSAWaitForMul...函数来等待事件的触发,如何能使连接的数量很大,靠增加线程数量?这不是玩笑话!!!
    3.控制协议中:没有接全一条指令如何处理?
      

  61.   

    [email protected],学习一下,谢谢