Improved TCP syncookie implementation

Andre Oppermann andre at
Wed Sep 13 13:31:46 PDT 2006

Igor Sysoev wrote:
> On Wed, 13 Sep 2006, Andre Oppermann wrote:
>> Igor Sysoev wrote:
>>> On Sun, 3 Sep 2006, Andre Oppermann wrote:
>>>> I've pretty much rewritten our implementation of TCP syncookies to get
>>>> rid of some locking in TCP syncache and to improve their functionality.
>>>> The RFC1323 timestamp option is used to carry the full TCP SYN+SYN/ACK
>>>> optional feature information.  This means that a FreeBSD host may run
>>>> with syncookies only and not degrade TCP connections made through it.
>>>> All important TCP connection setup negotiated options are preserved
>>>> (send/receive window scaling, SACK, MSS) without storing any state on
>>>> the host during the SYN-SYN/ACK phase.  As a nice side effect the
>>>> timestamps we respond with are randomized instead of directly using
>>>> ticks (which reveals out uptime).
>>> As I understand syncache is used to retransmit SYN/ACK.
>>> What would be if
>>> 1) a client sent SYN,
>>> 2) we sent SYN/ACK with cookie,
>>> 3) the client sent ACK, but the ACK was lost
>> If the client sent ACK it will retry again after the normal retransmit
>> timeout.
> Well, suppose protocol similar to SSH or SMTP:
> 1) the client calls connect(), it sends SYN;
> 2) the server receives SYN and sends SYN/ACK with cookie;
> 3) the client receives SYN/ACK and sends ACK;
> 4) the client returns successfully from connect() and calls read();
> 5) the ACK is lost;
> 6) the server does not about this connection, so application can not
>    accept() it, and it can not send() HELO message.
> 7) the client gets ETIMEDOUT from read().
> Where in this sequence client may retransmit its ACK ?

Never.  You're correct.  There is no data that would cause a retransmit
if the application is waiting for a server prompt first.  I shouldn't
write wrong explanations when I'm tired, hungry and in between two tasks. ;)

This problem is the reason why we don't switch entirely to syncookies
and still keep syncache as is.

>> If our SYN-ACK back to client is lost we won't resend it with syncookies.
>> The client then has to try again which is does after the syn retransmit
>> timeout.
> Yes.


More information about the freebsd-net mailing list