OT: limit number of connections from browser to my server?
Grant Edwards
grant.b.edwards at gmail.com
Mon May 16 18:09:26 EDT 2016
On 2016-05-16, Steven D'Aprano <steve at pearwood.info> wrote:
> On Tue, 17 May 2016 02:06 am, Grant Edwards wrote:
>
>> This is not Python specific, though I'm turning to Python to do some
>> experimentation and to try to prototype a solution.
>>
>> Is there any way to limit the number of connections a browser uses to
>> download a web page?
>
> Well, you control the server. It's your own server, right? Can you not tell
> the server to limit how many connections it accepts from any one client?
I tried two approaches on Linux using a Python server prototype that
has some code I wrote that accepts connections and then calls
SimpleHTTPRequestHandler. For starters I'm sticking with HTTP (no
SSL) and just stuck a 2-second (delay to simulate SSL startup time)
between the accept() returning and the call to the request handler .
1) Refuse to accept more than one connection at a time by closing the
listening socket while there is an active connection. On both
Firefox and Chrome, this gets you the initial HTML page and
perhaps one addition file (css, js, png, whatever). The files
that the browser normally requests using the addition 4-5 requests
simply fail (broken img, missing css and js files). The Chrome
network monitor thingy shows those as "failed". In my test case,
only allowing a single connection resulted in 7 failed files out
of the 9 which are loaded for the page.
2) Limit the listen() backlog to 0. On Linux, a 0 backlog doesn't
prevent the stack from sending back a SYN/ACK in response to a
SYN. It just prevents the connection from ACKing anything else
that's sent by the client. This makes the client think the
connection is open. In my tests, the browser then sits there
waiting for a response on what it _thinks_ is an open TCP
connection. It eventually times out and fails.
It looks to me like the browsers decide how many connections to use
(in my test case it's usually around 5), assigns individual files to
each connection, and then presses "go". If any connection fails,
stalls, or falls over, the files assigned to that connection are
failed rather than fetched from an extant working connection.
Next I'll try adding the SSL layer -- perhaps stalling the connection
after the accept() and before the SSL handshake will have a different
affect on the browser that stalling a plaintext TCP connection before
responding to the request.
--
Grant Edwards grant.b.edwards Yow! PARDON me, am I
at speaking ENGLISH?
gmail.com
More information about the Python-list
mailing list