• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: TCP_KEEPALIVE
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TCP_KEEPALIVE


  • Subject: Re: TCP_KEEPALIVE
  • From: Terry Lambert <email@hidden>
  • Date: Sun, 5 Nov 2006 13:35:46 -0800

On Nov 4, 2006, at 10:15 AM, Michael Ledford wrote:

Hello,

I have a network program that when used in the wild normally goes through commercially available broadband routers. The problem as I'm sure many people have had is after an unspecified and unconfigurable amount of idle time the router closes the route causing any traffic to fail.

Now I know we could implement a connection tickle in the application level to be sent down the line but since OS X and darwin appeared to support TCP_KEEPALIVE why not use what is already there? :-) The only problem is that appears TCP_KEEPALIVE doesn't actually do anything. So, I have cobbled together a sample socket client and server app from others so I didn't have to write much code. :-) In the client SO_KEEPALIVE is specified and TCP_KEEPALIVE is a ridiculously low value. When using tcpdump I do not see any tickle packets.

Keep-Alives are for servers, so if you are setting this on the connect socket rather than the accept socket, then don't expect it to behave like you want it to.


I really recommend:

	Unix Network Programming, Vol. 1: The Sockets Networking API
	W. Richard Stevens
	Addison-Wesley Professional
	ISBN: 0131411551

That said, if you change the code so that you are using it correctly, and things still fail...

RFC compliant routers don't do this, unless you've turned on an RFC- violating option, or they inherently violate RFC's; this is because intermediate routers that aren't trying to "outsmart" something don't know from connections, just packets, and their job is only to get a packet from one interface to another, based on destination IP address an ARP table entry.

The places this doesn't hold true are:

(1)	Some place along the path, you've firewalled off ARP packets, OR

(2) You have a Cisco PiiX firewall or other stateful firewall that tracks connection state, and has a connection timeout in order to prevent a DOS attack via connection table overflow over time (in which case, it's configurable, but you are likely either failing to configure it, or you don't have rights to configure it).

In case #1, setting a Keep-Alive will help you, but realize that the default Keep-Alive period mandated by RFC 1122 is *no less than 2 hours*. Any system participating in setting the Keep-Alive is therefore free to ignore your requested interval, and crank it up to 2 hours, unless the requested interval is less than two hours. Also, since implementing Keep-Alives is optional, they may choose not to implement them at all. This includes any stateful firewall in the middle dropping Keep-Alives that happen in under the RFC 122 interval.

In case #2, it's entirely possible that the firewall is filtering the Keep-Alive packets out and discarding them, since instead of a simple DOS, you could have a DOS with Keep-Alives set that gets around the firewall hard timeout. The firewall is probably (no probably about it, if it's a Cisco product) looking for actual data over the connection, rather than simply spurious ACKs designed to keep the connection up without necessarily doing any useful work.

Also note that in either case, the retry interval is such that, if you are over the timeout window such that it sends Keep-Alives, and there is no response in a set number of probe attempts, many systems will drop the connection (see also RFC 2525, "Known TCP Implementation Problems", section 2.9; I wasn't an editor, but I contributed to 2.15... 8-)).

-

Frankly, your best bet is an in-band tickle packet, but an even better approach would probably be to redesign your communications channel so that keeping a connection up for an ungodly amount of time with no data flowing over it becomes unnecessary to its proper operation.

-- Terry
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-kernel mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: TCP_KEEPALIVE
      • From: email@hidden
References: 
 >TCP_KEEPALIVE (From: Michael Ledford <email@hidden>)

  • Prev by Date: Re: pseudo-device pty >32
  • Next by Date: Re: pseudo-device pty >32
  • Previous by thread: TCP_KEEPALIVE
  • Next by thread: Re: TCP_KEEPALIVE
  • Index(es):
    • Date
    • Thread