Socket performance
Navkirat Singh
navkirats at gmail.com
Sun Jul 25 08:50:32 EDT 2010
On 25-Jul-2010, at 5:52 PM, Roy Smith wrote:
> In article <4c4bd0b1$0$1624$742ec2ed at news.sonic.net>,
> John Nagle <nagle at animats.com> wrote:
>
>> 1. When writing to a TCP socket, write everything you have to write
>> with one "send" or "write" operation if at all possible.
>> Don't write a little at a time. That results in sending small
>> packets, because sockets are "flushed" after each write.
>
> There's nothing that guarantees that a single write won't be split into
> multiple packets, nor that multiple writes won't be coalesced into a
> single packet. Or any combination of splitting and coalescing that the
> kernel feels like.
>
> That being said, for any sane implementation, what John says is true
> most of the time, and is indeed a reasonable optimization. Just don't
> depend on it being true all the time. The most common case where it
> will not be true is if you're trying to send a large amount of data and
> exceed the MTU of the network. Then you are certain to get
> fragmentation.
>
> Depending on what you're doing, this can be a point of networking
> trivia, or it can be the difference between your application working and
> not working. If you're just streaming data from one place to another,
> you don't have to worry about it. But, if you're doing some sort of
> interactive protocol where you send a command, wait for a respond, send
> another command, etc, you really do need to be aware of how this works.
>
> Let's say you're writing something like a HTTP client. You send a bunch
> of headers, then expect to get back something like "200 OK\r\n", or "404
> Not Found\r\n". You can't just do a read() on the socket and then
> examine the string to see if the first three characters are "200" or
> "404", because (regardless of how the server sent them), it is legal for
> your read() to return just a single character (i.e. "2"), and then for
> the next read() to get "00 OK\r\n". You need to do buffering inside
> your application which keeps doing read() until you find the "\r\n" (and
> stops there, even if the read() returned more data beyond that).
> --
> http://mail.python.org/mailman/listinfo/python-list
Thanks John, Roy. I really appreciate your valuable input. I have made a note of what you have said and will implement keeping the same in mind : )
Nav
More information about the Python-list
mailing list