java – 防止TCP套接字连接重试
如何防止TCP进行多个套接字连接尝试?
背景 我试图粗略估计一下客户的往返时间.我必须使用的高级协议无法确定RTT,也没有任何类型的无操作请求/响应流程.所以,我试图直接从较低层获取信息.特别是,我知道客户端将主动拒绝特定端口上的TCP连接尝试. Me -> Client: SYN Client -> Me: ACK,RST 码 long lStartTime = System.nanoTime() / 1000000; long lEndTime; // Attempt to connect to the remote party. We don't mind whether this // succeeds or fails. try { // Connect to the remote system. lSocket.connect(mTarget,MAX_PING_TIME_MS); // Record the end time. lEndTime = System.nanoTime() / 1000000; // Close the socket. lSocket.close(); } catch (SocketTimeoutException|IOException lEx) { lEndTime = System.nanoTime() / 1000000; } // Calculate the interval. lInterval = lEndTime - lStartTime; System.out.println("Interval = " + lInterval); 问题 使用Wireshark,我看到对lSocket.connect的调用使得三次(失败)尝试在放弃之前连接套接字 – 显然是任意的尝试间间隔(通常为~300ms). Me -> Client: SYN Client -> Me: ACK,RST Me -> Client: SYN Client -> Me: ACK,RST 题 有没有办法让TCP在单个SYN / RST对之后放弃? 我查看了一些Java代码.当AbstractPlainSocketImpl上的评论说…时,我想知道我是不是赢了. /** * The workhorse of the connection operation. Tries several times to * establish a connection to the given <host,port>. If unsuccessful,* throws an IOException indicating what went wrong. */ …但遗憾的是,没有证据表明该函数或我所看到的任何其他(非本机)函数存在循环/重试. 这种重试行为实际上来自哪里?它怎么能被控制? 备择方案 我也可以接受替代方案,但不是…… >使用ICMP回应请求(ping).我知道许多客户不会回复他们. 解决方法
TCP连接重试是OS的套接字实现的一个功能.配置这取决于平台.有关这是什么以及为什么会发生这种情况的说明,请参见
https://security.stackexchange.com/questions/34607/why-is-the-server-returning-3-syn-ack-packets-during-a-syn-scan.
在Windows上,您应该能够修改注册表中的重试次数: > HKLMSYSTEMCurrentControlSetServicesTcpipParametersTcpMaxConnectRetransmissions 与RTT相关的设置也在该文档中详细说明. 在Linux上,链接的安全帖子中接受的答案讨论了如何配置此参数:
请注意,这是一个系统范围的设置. 您可以通过读取注册表设置(在Windows上)或读取特殊文件的内容(在Linux上)来读取当前值. 此外,MSDN有关于Windows上TCP连接RTT的说法:
顺便说一句,重新:原始套接字 – 是的,你将有一个非常困难的时间.此外,从Windows XP SP2,Windows won’t actually let you specify TCP protocol numbers for raw sockets under any circumstances开始(请参阅限制). 另外,请注意:确保TCP连接没有被客户端前面的单独防火墙阻止,否则您最终只能测量到防火墙的往返时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |