Alexander Pevzner ([info]pzz) wrote,
@ 2008-05-23 22:27:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Хозяйке на заметку
Представьте себе, у Вас есть 2 компутера, на них 2 программы, A и B, и они общаются между собой по TCP. Представили?

Теперь представьте себе, что один из этих компутеров - лабтоп, и ему закрыли крышку. Вместе с находящейся внутри программой.

Другой компутер рано или поздно заметит, что ему больше не с кем разговаривать, и бросит соединение. Но под крышкой-то все спят, и об этом не в курсе.

Теперь, скажем, прошла неделя и лабтоп открыли. А там внутри программа, а у нее - TCP соединение. Она, наверное, подергается и попробует туда чего-нибудь попосылать. Ну, там keepalive или данные, не суть важно.

Граждане, которые придумали TCP, они, между прочим, не напрасно решили, чтобы когда TCP стек получает TCP пакет, про который он не может понять, к кому он относится, он должен в ответ послать TCP RST. Вот именно для таких случаев, хотя в те времена и лабтопов-то не было. Гении, одним словом, на 20 лет вперед все предусмотрели.

Только это вот было до 11-го сентября. А после 11-го сентября у всех случилась коллективная паранойя и все обложились злобными фаирволами, чтобы там пакет плохой или боинг случайно не залетел. Несекурно в общем стало на непонятные пакеты отвечать ресетом. И отвечать ресетом на них перестали.

Поэтому никто на эти keepalive ресетом отвечать не будет. И вообще никак не будут, будут молчать в трубку. А TCP, он довольно цепкий протокол. Он может неделю слать keepalive и не расстраиваться на тему отсутствия ответов. Поэтому программа, та, которая была под крышкой, она так и не узнает, что ей больше не с кем разговаривать. Долго не узнает - достаточно, чтобы Вам позвонил заказчик и поинтересовался, что за ботва.

А говорят, TCP - надежный протокол...



(18 comments) - (Post a new comment)


[info]zhuzh
2008-05-23 09:27 pm UTC (link)
а если никаких фаерволлов нет, а просто второй комп у нас айфон, и мы с ним вышли из зоны действия вайфая? или тоже лаптоп, которому закрыли крышку? или просто пьяный тракторист переехал кабель? получается, наша бедная программа так и будет неделями свои кипалайвы слать?

(Reply to this) (Thread)


[info]pzz
2008-05-23 09:39 pm UTC (link)
Ну примерно так, да. Но если пьяный тракторист переехал зону вайфая, то есть некоторый шанс, что роутер где-нибудь подороге заметит, что ему некуда форвардить наш пакет, и расскажет нам об этом. А если пакет достигает тот хост, куда его отправляли, а там молчат, то надежды уже нет.

Это не очень затрагивает всякие там HTTP - у пользователя лопнет терпение и он нажмет reload или закроет страничку. А вот долгоживущие протоколы, за которыми не присматривает живой человек, могут пострадать.

(Reply to this) (Parent)


[info]metaclass
2008-05-24 06:24 pm UTC (link)
Keepalive-таймауты ж вроде настраиваются все, да, собственно говоря, они на этот случай и предусмотрены - обрывать забытые соединения.

(Reply to this) (Thread)


[info]pzz
2008-05-24 07:28 pm UTC (link)
Это я понимаю, да. Но надеялся, что мне удастся отмазаться от того, чтобы разбираться с их особенностями на 3-х разных системах. Похоже, не удастся. А у них разный и API, и дефолтовые сеттинги (совершенно безумные, кстати) и то, о чем реальное поведение отличается от написанного в тугаментации.

Но зато я теперь понимаю, откуда берутся TCP-соединения, болтающиеся открытыми по многу часов безо всякой видимой активности.

(Reply to this) (Parent)(Thread)


[info]metaclass
2008-05-26 03:34 pm UTC (link)
А вот что дефолтовые сеттинги безумные - это факт неоспоримый, типа 2 часа по умолчанию на виндах.

(Reply to this) (Parent)(Thread)


[info]pzz
2008-05-29 01:14 pm UTC (link)
Так, между прочем, в RFC 1122 написано. Мелкософт над нами издевается, и делает все строго по RFC. Хотя все знают, что TCP/IP надо делать не как в RFC, а как в BSD. Не первый раз, между прочим...

(Reply to this) (Parent)


[info]alexeilebedev
2008-05-28 09:46 pm UTC (link)
и клиент, и сервер, должны раз в Х секунд (минут) посылать хартбит.
два пропущенных хартбита -- предупреждение. три -- соединение сбрасывается.

(Reply to this) (Thread)


[info]pzz
2008-05-28 10:00 pm UTC (link)
Это довольно очевидная идея. Но у нее есть свои недостатки. Например:

1. Эти heartbeat'ы постоянно сосут траффик, даже если Вы не передаете никаких полезных данных. Причем у Вас получается tradeoff между тем, как быстро Вы замечаете потерю соединений и тем, сколько лишнего траффика Вы для этой цели порождаете

2. Вы теряете возможность использовать TCP-ный flow control. Если одна из сторон переполнена данными и не может их в течении какого-то времени потреблять, то и heartbeat'ы она не получит

3. Довольно обидно делать за TCP то, чем по идее должен он сам заниматься. Если продолжать в том же духе, рано или поздно начинает напрашиваеться идея использовать UDP, и всю reliability сделать руками.

(Reply to this) (Parent)(Thread)


[info]metaclass
2008-05-29 02:17 pm UTC (link)
Видел софт, который так и делает - реализует свой протокол поверх UDP.

(Reply to this) (Parent)


[info]dbg
2008-06-22 11:00 am UTC (link)
2. Хартбит флоуконтролу не помеха. Главное здесь - это считать данные валидным heartbeat'ом, а heartbit посылать только когда реальных данных нет. Если sender переполнился и будет блокироваться, то тоже heartbeat не посылать, пока получатель не откроет окошко.

Так, кстати, себя ведет любая вменяемая реализация BGP. Нет, не все реализации BGP вменяемые.

(Reply to this) (Parent)(Thread)


[info]smalgin
2009-05-20 10:29 pm UTC (link)
+1

(Reply to this) (Parent)

Проблема крышки - надуманная, по-моему.
[info]ifp5
2008-05-30 07:18 am UTC (link)
При открытии крышки Windows всегда разрывает соединение, даже если ее открыли через полминуты после закрытия.

А если у пользователя не Windows, то такой фрик сам разберется с проблемой как ему удобнее (настроит fw, исправит программу, похачит ядро и пр).

(Reply to this) (Thread)

Re: Проблема крышки - надуманная, по-моему.
[info]pzz
2008-05-30 10:38 am UTC (link)
Проблема возникает на другой машине, на которой крышку не закрывали. Ей-то, бедолаге, забыли сказать про то, что соединение закрылось...

(Reply to this) (Parent)(Thread)

Re: Проблема крышки - надуманная, по-моему.
[info]ifp5
2008-07-11 08:38 am UTC (link)
Сложно что-то посоветовать не зная задачи. Из общих соображений можно посоветовать не держать сверхдлинных tcp-соединений. Если в сокет не пришло ничего в течении 10 секунд - дропать соединение и вся любоф.

(Reply to this) (Parent)

Добавление
[info]ifp5
2008-05-30 09:55 am UTC (link)
По поводу reliable протоколов. В ISO/OSI и пр. телекоме под reliable протоколом грубо говоря подразумевается протокол, когда после отправки некоего куска данных без ошибок отправитель уверен, что данные дошли все и в том порядке как посылались. Ничего больше (защиты от искажений, подделки и пр.) в виду не имеется.

(Reply to this) (Thread)

Re: Добавление
[info]pzz
2008-05-30 10:39 am UTC (link)
В этом смысле TCP тоже не reliable, т.к. send() возвращается в тот момент, когда данные помещены в локальный буфер. Дошли они или нет, от TCP (портабельным способом) узнать невозможно.

(Reply to this) (Parent)

Re: Добавление
[info]green_nsk
2008-07-10 06:16 pm UTC (link)
не совсем.

"если данные дошли, то в том порядке, как посылались". Все же протокол от пьяных трактористов вне зоны вайфай защитить не может.

(Reply to this) (Parent)(Thread)

Re: Добавление
[info]ifp5
2008-07-11 08:29 am UTC (link)
Ну я бы даже сказал, что если получатель принял данные то они получены полностью и в том порядке в котором посылались. Но исправить это в тот момент времени не мог. :>

(Reply to this) (Parent)


(18 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…