Hi Bernd and Alan, I had initially the same question about the socket connects, especially since it works so much better on Unix’s.
The reason why Windows can’t change the implementation is app compatibility. They have implemented an ECN (Explicit Congestion Notification) related mitigation in the stack for handling RSTs sent in response to SYNs. They tried to exempt loopback from this mitigation because ECN doesn’t really apply. However, this resulted in various apps breaking, because those apps have made assumptions that loopback connect failure will actually take longer on Windows. It appears that this timeout has become an undocumented contract in various Windows apps and a change of behavior breaks multiple of them :(. The team responsible for the network stack attempted to change the default behaviour, but were unable to after receiving pushback from various app owners. I'm working on the suggested changes to the webrev. If it makes sense, I can include a comment in the code itself on the history of the timeout? Thanks! Nikola From: Alan Bateman <alan.bate...@oracle.com> Sent: July 16, 2020 2:59 AM To: Bernd Eckenfels <e...@zusammenkunft.net>; net-dev@openjdk.java.net; Nikola Grcevski <nikola.grcev...@microsoft.com> Subject: Re: RFR(s): Improving performance of Windows socket connect on the loopback adapter On 16/07/2020 05:37, Bernd Eckenfels wrote: Hello Nikola, Can you explain why timeouts play a role here at all? Normally when connecting to a non existing socket it should immediately respond with a TCP RST and that should not cause a retry or delay. Nikola mentioned that he is in contact with someone working on Windows networking and it would be useful to know why this isn't changed in Windows and it would avoid a workaround in the JDK or anywhere else that attempt to establish a connection to the loopback. We initially started to see issues on Windows 10, Michael has more on this in JDK-8234823 [1]. I should say that I have no objection to Nikola's proposal, I think it's great to know that there is an ioctl to change this. I suspect we might have to do the equivalent in the JDWP socket transport although probably low priority as the shared memory transport is the default there. -Alan [1] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugs.openjdk.java.net%2Fbrowse%2FJDK-8234823&data=02%7C01%7CNikola.Grcevski%40microsoft.com%7Cdc732e9b27df4c8d6a6c08d829560ced%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637304796845600565&sdata=QemEEB2koJBLaeOtPZqJDzOmhsz7GV2CYqzOG6sEqVc%3D&reserved=0