From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.74]) by sourceware.org (Postfix) with ESMTPS id 602AC3857007 for ; Wed, 1 Jul 2020 19:50:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 602AC3857007 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=cygwin.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=corinna-cygwin@cygwin.com Received: from calimero.vinschen.de ([217.91.18.234]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M1YpJ-1jpL2W2hEB-0039t3 for ; Wed, 01 Jul 2020 21:50:27 +0200 Received: by calimero.vinschen.de (Postfix, from userid 500) id 0BE83A80926; Wed, 1 Jul 2020 21:50:27 +0200 (CEST) Date: Wed, 1 Jul 2020 21:50:27 +0200 From: Corinna Vinschen To: cygwin@cygwin.com Subject: Re: TCP_KEEPINVTL and TCP_KEEPIDLE - Socket Keep Alives not working Message-ID: <20200701195027.GL3499@calimero.vinschen.de> Reply-To: cygwin@cygwin.com Mail-Followup-To: cygwin@cygwin.com References: <20200630111215.GE3499@calimero.vinschen.de> <20200630165358.GG3499@calimero.vinschen.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20200630165358.GG3499@calimero.vinschen.de> X-Provags-ID: V03:K1:IU8qrUkMYDlPPTfQwTyEWIqAaaDqtpRgvN+rALSnMTRM0OxKhr5 lLGCw+RvEWDytu5NMwvQ/v/INoHE/VruYwp2W2hT2iwz9Q4Sl0SfH3HXDRPNyIWVsaC67HY u5/SK8u++cDP4yyIif1tlW6qCHmodDfmLmeRkdsnK1wQUzhvAW6n+MEUXElxSGwyaHXghD9 pLk2lz1MgXX6XTTW8IrBg== X-UI-Out-Filterresults: notjunk:1;V03:K0:gm/zpnEiePo=:Gxa5NpKtDUhRvnnZOXRVaQ vHr0NOLLN5pkB16HwTBJ6LAti/chKPdGzIjQNlLLd4tEJv66Onbzvsu7WCxKjOwbbEimNujgt HhfwBSV4RxRYWYZpHJDBQm8RT10OUrsYfVGXFIRaJM9np2comTBrRh2E17sgXynv6A1I4ANiG nhAtZSdXDhT+gnIvKzSRttueX55ELc25cAcMlgKr69fQJfxNqjJPRAQkGxM2uoU6uXde1uC7o BZI2+cTU1b5dR7jychCcFJuUWUogpxB7NihKJWvGbdK02Ht45TaXnx/5Qi23XKHKwLlQNYM3/ ZfTHQRNPZLXyFzMUa/P33iNP4+4YiCHSdV9GTUcoU4htObe+6hH7oZMGfC/kokGcYCBTAdV9p UOk3SLk3Ma/aJi4BzdH/XqZI2+ZIkv+VeOOgNPXOaCb5ZBhI8vVCQUfVAJg1YbkVFWQznUWjr ECchPS2tjE+A7n6GU0vR+M+euHjwRCCUlF6thzCl166NdCdZ7twb0pPbMXvKyYj03dSUcQJFf B4dEYA9LFI1g30nh+wawnj/hzArmo44jSCU+Q3oZJNlYK+RXNniKk2K2+SiYFjpwd/vPs6WCp WwG1UuvO2TAUQ12BAWmW4OQoFblbGqfMsir/natmFbv9n1EIqeGLu3XFxRH4qAHQLo9+pfCCP mnFXVh6Impb5RQ32Hj0/PlbomCoZBMm18D4UP6ThYbXZGl559XPE+ITiIxCGR6mvteLcqCrLT 5hXZQW80/DSniLOob09fOHLSkDIt8zEjKuf5a/GFm7KPG3Nb7eHel5FkoE3x/LU8u8GqmsIBy 9PzbKNIWsfUaaV54XJWWCC5dvPyJIMmvMzOZI0bIcc6FEyoEps5ezOQuIBrQKU59tcjgFoO X-Spam-Status: No, score=-99.0 required=5.0 tests=BAYES_00, GOOD_FROM_CORINNA_CYGWIN, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NEUTRAL, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Jul 2020 19:50:31 -0000 On Jun 30 18:53, Corinna Vinschen wrote: > On Jun 30 09:46, Cary Lewis via Cygwin wrote: > > Thanks for the reply. The answer to your question is that the 2 hour keep > > alive was not sufficient for a particular use case I encountered. > > > > I was trying to use curl under cygwin to access a very slow REST endpoint > > that was taking up to 8 minutes to generate download before any data flowed > > back to the client. This caused the server to abort the socket. > > > > Accessing the endpoint in chrome or firefox revealed that they set a > > keepalive to 45 seconds, which kept the server happy. > > > > Attempting to set --keepalive-time=45 in cygwin's curl didn't work, and > > wireshark revealed that no keepalives were being sent. > > > > I will attempt to patch cygwin, I got the build to work. Can you point me > > in the right direction, in terms of where the socket calls get mapped to > > the winsock calls? > > Actually, while I'm usually happy to take contributions, you don't have > to dig into that yourself. I already have a few local patches in the > loop changing some of the affected code. I have a good idea what's > required to add the keep-alive socket options to that code, so just lay > back and stay tuned for now. Ok, so I added support for a couple more IPPROTO_TCP socket options. First of all I fixed TCP_MAXSEG which was using the BSD value, rather than the WinSock value. Then I added TCP_FASTOPEN, TCP_KEEPIDLE, TCP_KEEPCNT, TCP_KEEPINTVL, TCP_QUICKACK and TCP_USER_TIMEOUT: - TCP_FASTOPEN is supported since W10 1607, it's just faked on older systems. - TCP_KEEPIDLE, TCP_KEEPCNT, TCP_KEEPINTVL are using the options of the same name since W10 1709, WSAIoctl(SIO_KEEPALIVE_VALS) on older systems. But here's a problem: Older systems didn't allow to change TCP_KEEPCNT. It is always fixed to 10. Mulling over that problem in the shower, I came up with the following solution: The max keep-alive timeout is TCP_KEEPIDLE + TCP_KEEPCNT * TCP_KEEPINTVL. This should stay the same from a user space perspective. So the current code tweaks the TCP_KEEPINTVL given to WinSock so that TCP_KEEPCNT * user space TCP_KEEPINTVL == 10 * WinSock TCP_KEEPINTVL Example: user space TCP_KEEPCNT 4, TCP_KEEPINTVL 5 (4 * 5 == 20) ==> WinSock TCP_KEEPCNT 10, TCP_KEEPINTVL 2 (10 * 2 == 20) I hope that makes sense. - TCP_USER_TIMEOUT is supported with msec granularity since W10 1607 (called TCP_MAXRTMS), with 1 secs granularity on older systems (called TCP_MAXRT). Use the latter on older systems under the expected loss of precision. - TCP_QUICKACK is supposedly supported on Windows as a socket option but it's still not clear if the net got that right so far. However, there's WSAIoctl(SIO_TCP_SET_ACK_FREQUENCY) doing the same. I uploaded developer snapshots to https://cygwin.com/snapshots/, please test. For testing, you'll need at least the DLL, plus the changed headers cygwin/socket.h and netinet/tcp.h from the complete tar file cygwin-20200701.tar.xz. Or, just take the DLL and fetch the headers right from the git repo. Thanks, Corinna -- Corinna Vinschen Cygwin Maintainer