RFR: 7116990: (spec) Socket.connect(addr,timeout) not clear if IOException because of TCP timeout [v2]
Mark Sheppard
msheppar at openjdk.org
Thu Jun 12 10:21:28 UTC 2025
On Wed, 11 Jun 2025 21:16:40 GMT, Mark Sheppard <msheppar at openjdk.org> wrote:
>>> Alan @AlanBateman, do you suggest we continue with this text or would any update be necessary?
>>
>> I think it's helpful here to give some indication in this API note as what the timeout might be. It doesn't really matter if it says 60s or 75s, the point is that establishing a TCP connection is subject to a timeout imposed by the operating system. It helps for cases where someone calls connect with a timeout of say 300_000 (5 minutes) and is surprised to get ConnectException "Operation timed out" after a minute or so. This is exactly what prompted JDK-7116990, someone called connect with a timeout that is larger than the OS configured timeout.
>
> Looking at this on the 3 main OS platforms (Windows, OL and macOS) and running a simple test to trigger a connect timeout then finding are
>
> macOS the connect timeout is 75 seconds as this is derived from 4.3 BSD
>
> If OL linux has a syn retries set to 6 and an RTO == 1 sec then it’s connect timeout is 130 seconds approx
> That’s initial syn timeout of 1 seconds and then 6 retries totalling 127 seconds
>
> Windows by default connect timeout is 21 seconds
> RTT == 3 seconds and two connect retries
> Initial syn timeout 3 seconds + 2 retries at 6 and 12 seconds == 21 seconds
FWIW an possible alternative wording
Establishing a TCP/IP connection is subject to a connect timeout, determined by configuration settings
of the operating system, for example the number of connect retries together with an implementation’s back off strategy. Thus, TCP/IP Connect timeout values can vary across operating system, for example 75 seconds on macOS, with a default value of 21 seconds on Windows system. As such, the operating system TCP/IP Connect timeout may expire before that specified to the connect method. If the operating system Connect timeout expires
before the {@code timeout} specified to this method then an {@code IOException} is thrown. The {@code timeout}
specified to this method is typically a timeout value that is shorter than the operating system timeout.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/25690#discussion_r2142282586
More information about the net-dev
mailing list