Открытый сокет TCP не требует какой-либо связи между двумя сторонами (назовем их Алиса и Боб), если только не отправляются фактические данные. Если Алиса получила подтверждения для всех данных, которые она отправила Бобу, она не сможет отличить следующие случаи:
- Боб был отключен или недоступен Алисе.
- Боб был перезагружен или иным образом забыт об открытом TCP-сокете, который он установил с Алисой.
- Боб связан с Алисой и знает, что у него открытое соединение, но ему нечего сказать.
Если Алиса не получала известий от Боба некоторое время и хочет провести различие между вышеупомянутыми условиями, она может повторно отправить свой последний байт данных, обернутый в подходящий кадр TCP, чтобы его можно было распознать как повторную передачу, по существу делая вид, что она не услышал подтверждение. Если Боб отключен, она ничего не услышит, даже если она многократно отправляет пакет в течение многих секунд. Если Боб перезагрузил или забыл соединение, он немедленно ответит, что соединение недействительно. Если Боб доволен соединением и ему просто нечего сказать, он ответит подтверждением повторной передачи.
Тайм-аут указывает, как долго Алиса готова ждать ответа, когда она отправляет пакет, который требует ответа. Время Keepalive показывает, сколько времени она должна дать пройти, прежде чем она повторно передает свой последний бит данных и требует подтверждения. Если Боб пропадет, сумма значений Keepalive и Timeout укажет наихудшее время между Алисой, получающей свой последний бит данных, и ее решением, что Боб мертв.