First of all: heed David's [Schwartz] advice, especially in his last email.


This stuff is /not/ meant to fix broken designs but only to be used
when you absolutely have to:

what you can use, when you need to detect clients crashing or networks
failing, is add a 'heartbeat' (as was mentioned before by David
Richardson) to your TCP peer to peer connections, so you will get an
error message from your TCP/IP when the 'heartbeat' stops, i.e. the
communication path has broken down somewhere (in a cable, a router, a
switch or the client failing itself (power cycle or some other
causes).

You don't need special connections on the side for this, as TCP offers
a method for this: the SO_KEEPALIVE socket option. It's not precisely
standard, but all boxes I have been using, UNIXes, Linux, Windows, and
several embedded TCP/IP stacks, all offer this one. They don't have
to, though.

Before you run off shouting Yowza!, here's what W. Richard Stevens
(R.I.P.) has to say about it in one of his highly regarded books
(TCP/IP Illutrated Vol. 1, 1994, Ch.23, pp. 331-337):

"Keepalives are not part of the TCP specification. The Host
Requirements RFC provides three reasons not to use them: (1) they can
cause perfectly good connections to be dropped during transient
failures, (2) they consume unnecessary bandwidth, and (3) they cost
money on an internet that charges by the packet. Nevertheless, many
implementations provide the keep-alive timer."

Written in 1994, it is still 100% valid. Read the entire chapter
before you run off and say you solved matters.



By the way: grep the OpenSSL code to see it in use: BIO_s_connect()
delivers a socket connection with the KEEPALIVE heartbeat turned on
(unless your system does not support such an option) and, in the case
of SSL, this choice makes sense.

That means that (1) OpenSSL client-side connections created through
the use of BIO_s_connect() will have this option active from the very
start; (2) it also means the OpenSSL /client/ sets this option, while
you say you need it server-side, which means you'll have to do it
yourself at socket BIO level (but that's easy; the hard part is making
sure your process goals /require/ a design which includes this
'server-side initiated heartbeat' as a mandatory element, and can't
live without it).


I can't emphasize enough you should not jump to gun (pointy-haired
people come to mind ;-) ) and at least read Stevens' chapter on this.
Mark his words regarding fiddling with this timer. (It has nothing to
do with SSL, it's TCP protocol level stuff below that.) Because
heartbeats (and thus keepalive timers) are an area just /begging/ you
to screw it all up. And it may not even bother you, but there's
significant risk it'll bother quite a few other folks along your
network paths, including your clients themselves.




At the end, I'm still wondering if I should have written this, as it
makes it way too easy to 'just do it' and this bit requires /thought/,
particularly at protocol design level, not just a simple line of code
and 'presto!'






(And for those that are google-trigger happy: I'm sure 'keepalive'
will give you many, many hits. It's (almost?) all about a completely
different animal: HTTP KeepAlive. Which is a cute, cuddly fellow
living in an entirely unrelated, far off biotope.)

-- 
Met vriendelijke groeten / Best regards,

Ger Hobbelt

--------------------------------------------------
web:    http://www.hobbelt.com/
        http://www.hebbut.net/
mail:   [EMAIL PROTECTED]
mobile: +31-6-11 120 978
--------------------------------------------------
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to