sniffer抓包显示:
192.168.1.81 -> 61.188.39.199 TCP: D=80 S=1944 SYN SEQ=373691515 LEN=0 WIN=40960 62 0:00:00.000
192.168.1.81 -> 61.188.39.199 TCP: D=80 S=1944 SYN SEQ=373764808 LEN=0 WIN=40960 62 0:00:00.200注意这里同一个端口在200毫秒内连发两次SYN握手包,而且SEQ号变化了。结果导致对方服务器认为这是SYN攻击而忽略了包。我用的是异步套接字,EVENT模型,设置了收发缓冲区为40K。本人试过使用系统默认缓冲区,结果一样。只不过对方服务器对两个SYN请求都进行正确了回应,而本地对其中一个SEQ发送了RST关闭。这不是系统的问题,用IE连接服务器则不会出现该问题。
我对所有socket的函数设置了断点,只在一开始connect了一次。
谁遇到过这个问题?

解决方案 »

  1.   

    三次握手:
    SYN
    SYN + ACK
    ACK请求连接方不能连续发SYN的
      

  2.   

    这里只是连接时SYN请求不正常。
    是否能连接上并不重要,这要看对方服务器的TCP协议栈如何处理。连续发送SYN不是我控制的,而是本机的TCP协议栈搞出来的。
      

  3.   

    是想说明本机TCP协议存在这个问题?
      

  4.   

    操作系统TCP协议栈没问题,用IE连接就很正常。我想应该是我对SOCKET的某些设置导致了这个问题。
    会是什么设置呢?我仅仅设置了收发缓冲区大小,别的套接字参数都没管。
      

  5.   

    改了设置也不应该发两个连续的SYN阿不明白
      

  6.   

    如果你不是使用tcp的原始套接字来发送syn的话,你是不能通过设置断点来控制底层tcp协议栈的
    syn发送的如果第一个connect成功了,再一次connect服务器当然要拒绝了
      

  7.   

    印象中,连接不能建立的情况,TCP连接发起端需要发送三次SYN分节,在发送第一次SYN分节后,需要等待6秒,如果没有确认,才发送第二次,200毫秒似乎太少了。在TCP/IP详解中有解释,你看看吧。个人感觉你需要找到为什么间隔这么短就发送第二次SYN,看你的情况是200ms内没有收到Peer的ACK。
      

  8.   

    除了Sniffer本身的NDIS驱动以外