TCP fight! HP-UX B.11.11 vs Microsoft Windows 2000 Server SP4

Две системы. Два компьютера. Один (srv2) – новенькая рабочая станция c8000 с HP-UX B.11.11, другой (srv4) – персоналка с 4-м пнём и Microsoft Windows 2000 Server SP4. С первого на второй передаётся поток телеметрии с РС МКС в реальном времени. Картина следующая:

(до этого момента всё нормально)
16:53:26.405046 IP srv2.64735 > srv4.5005: P 350579:350629(50) ack 1 win 49152
16:53:26.416337 IP srv2.64735 > srv4.5005: P 350629:352089(1460) ack 1 win 49152
16:53:26.416386 IP srv2.64735 > srv4.5005: P 352089:353417(1328) ack 1 win 49152
16:53:26.416867 IP srv4.5005 > srv2.64735: . ack 352089 win 65535
16:53:26.486529 IP srv2.64735 > srv4.5005: P 353417:354877(1460) ack 1 win 49152
16:53:26.486579 IP srv2.64735 > srv4.5005: P 354877:356301(1424) ack 1 win 49152
16:53:26.487061 IP srv4.5005 > srv2.64735: . ack 354877 win 65535
16:53:26.494222 IP srv2.64735 > srv4.5005: P 356301:357761(1460) ack 1 win 49152
16:53:26.494263 IP srv2.64735 > srv4.5005: P 357761:359221(1460) ack 1 win 49152
16:53:26.494284 IP srv2.64735 > srv4.5005: P 359221:360681(1460) ack 1 win 49152
16:53:26.494307 IP srv2.64735 > srv4.5005: P 360681:361131(450) ack 1 win 49152
16:53:26.494750 IP srv4.5005 > srv2.64735: . ack 357761 win 65535
16:53:26.494986 IP srv4.5005 > srv2.64735: . ack 360681 win 65535
16:53:26.606171 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.606220 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:26.626830 IP srv2.64735 > srv4.5005: P 362143:363603(1460) ack 1 win 49152
16:53:26.626884 IP srv2.64735 > srv4.5005: P 363603:365063(1460) ack 1 win 49152
16:53:26.626905 IP srv2.64735 > srv4.5005: P 365063:366153(1090) ack 1 win 49152
16:53:26.627352 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.627470 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.627569 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.627590 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:26.696555 IP srv2.64735 > srv4.5005: P 366153:367613(1460) ack 1 win 49152
16:53:26.697093 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.697114 IP srv2.64735 > srv4.5005: . 367613:369073(1460) ack 1 win 49152
16:53:26.697624 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.697644 IP srv2.64735 > srv4.5005: P 369073:370213(1140) ack 1 win 49152
16:53:26.698054 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.714500 IP srv2.64735 > srv4.5005: P 370213:371673(1460) ack 1 win 49152
16:53:26.715039 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.715087 IP srv2.64735 > srv4.5005: . 371673:373133(1460) ack 1 win 49152
16:53:26.715575 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.715599 IP srv2.64735 > srv4.5005: P 373133:374421(1288) ack 1 win 49152
16:53:26.716061 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.766965 IP srv2.64735 > srv4.5005: P 374421:375881(1460) ack 1 win 49152
16:53:26.767503 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.767524 IP srv2.64735 > srv4.5005: . 375881:377341(1460) ack 1 win 49152
16:53:26.767542 IP srv2.64735 > srv4.5005: P 377341:378497(1156) ack 1 win 49152
16:53:26.768023 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.768119 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.993149 IP srv2.64735 > srv4.5005: . 378497:379465(968) ack 1 win 49152
16:53:26.993188 IP srv2.64735 > srv4.5005: P 379465:380925(1460) ack 1 win 49152
16:53:26.993552 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.993572 IP srv2.64735 > srv4.5005: . 380925:382385(1460) ack 1 win 49152
16:53:26.993762 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.993782 IP srv2.64735 > srv4.5005: . 382385:383845(1460) ack 1 win 49152
16:53:26.994086 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.994114 IP srv2.64735 > srv4.5005: . 383845:385305(1460) ack 1 win 49152
16:53:26.994295 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.994315 IP srv2.64735 > srv4.5005: . 385305:386765(1460) ack 1 win 49152
16:53:26.994618 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.994637 IP srv2.64735 > srv4.5005: P 386765:387639(874) ack 1 win 49152
16:53:26.994873 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.994969 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:27.056645 IP srv2.64735 > srv4.5005: P 387639:389099(1460) ack 1 win 49152
16:53:27.056681 IP srv2.64735 > srv4.5005: P 389099:390559(1460) ack 1 win 49152
16:53:27.056705 IP srv2.64735 > srv4.5005: P 390559:391597(1038) ack 1 win 49152
16:53:27.057172 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:27.057301 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:27.057381 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:27.124203 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:28.164180 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:30.214165 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:34.294103 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:42.434172 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:58.693755 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:54:31.203298 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:55:32.162401 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:56:33.121478 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:57:34.080551 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:58:35.039617 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:59:35.998681 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
17:00:36.958225 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
17:01:37.917732 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
17:02:38.876971 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152

Для тех, кто плохо понимает протокол TCP, перевожу:
16:53:26.494222 IP srv2.64735 > srv4.5005: P 356301:357761(1460) ack 1 win 49152
16:53:26.494263 IP srv2.64735 > srv4.5005: P 357761:359221(1460) ack 1 win 49152
16:53:26.494284 IP srv2.64735 > srv4.5005: P 359221:360681(1460) ack 1 win 49152
16:53:26.494307 IP srv2.64735 > srv4.5005: P 360681:361131(450) ack 1 win 49152
16:53:26.494750 IP srv4.5005 > srv2.64735: . ack 357761 win 65535
16:53:26.494986 IP srv4.5005 > srv2.64735: . ack 360681 win 65535
16:53:26.606171 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
srv2 -> srv4: передаю тебе 1460 байт (с 356301 по 357761, последний не включая). В ответ ожидаю увидеть байты начиная с 1 общим количеством не более 49152. Последняя фраза не важна, так как в обратную сторону ничего не передаётся.
Примерно то же самое ещё 3 раза, затем:
srv4 -> srv2: потдверждаю приём байт вплоть до 357761 (не включительно), ожидаю увидеть ещё не более 65535 (пока).
Примерно то же самое ещё 2 раза: байты 357761-360681 потдвердились “одним махом”, это нормально (экономить на пакетах TCP не запрещает). И затем вдруг начинается чёрти-что:
16:53:26.606220 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:26.626830 IP srv2.64735 > srv4.5005: P 362143:363603(1460) ack 1 win 49152
16:53:26.626884 IP srv2.64735 > srv4.5005: P 363603:365063(1460) ack 1 win 49152
16:53:26.626905 IP srv2.64735 > srv4.5005: P 365063:366153(1090) ack 1 win 49152
16:53:26.627352 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.627470 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
16:53:26.627569 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
То есть на каждый пакет srv4 отвечает: “Эй мужик, это всё хорошо, но я пока ещё тот, 361131-й не получил!” Причём сам нужный пакет он проигнорировал. Ладно, допустим он потерялся, но:
16:53:26.627590 IP srv2.64735 > srv4.5005: P 361131:362143(1012) ack 1 win 49152
16:53:26.696555 IP srv2.64735 > srv4.5005: P 366153:367613(1460) ack 1 win 49152
16:53:26.697093 IP srv4.5005 > srv2.64735: . ack 361131 win 65085
srv2 послушно повторяет отправку злополучного пакета в 1012 байт и продолжает штатно передавать данные. Однако, srv4 отвечает опять тем же. Так продолжается несколько пакетов, и тут до srv2 доходит, что с тем пакетом что-то не так. Он приостанавливает дальнейшую отправку данных (не превышая размер окна – 65085 байт) и начинает пересылать злополучный пакет, постепенно увеличивая интервал (видимо, решив, что с сетью что-то не так). Интервал достигает примерно одной минуты, после чего через несколько минут он отчаивается и решает, что srv4 загнулся. Соединение рвётся по EPIPE (“Broken pipe”) – потеря канала связи. Со стороны srv2. Со стороны же srv4 оно продолжает висеть вечно (сутками) в состоянии ESTABLISHED, утверждая, что всё в порядке, только данные не поступают.

Теперь внимание! Вопрос: что может вызывать такое поведение, при условии что:
1. Оба компьютера находятся в одной подсети (подключены ли они при этом к одному свитчу или к разным – ни на что не влияет).
2. Такое наблюдается преимущественно по сеансам СМ, характерных большим потоком данных. Несчастная статусная, не смотря на свою уникальную круглосуточность, круглые сутки работает безотказно.
3. При подстановке вместо srv4 srv6, находящегося в другом сетевом сегменте, отстоящем на 2-3 маршрутизатора, эффект исчезает. На srv6 точно такая же операционная система и весьма схожее железо.
4. При включении между srv2 и srv4 дополнительного промежуточного звена srv-lan (srv2 -> srv-lan -> srv4), эффект также исчезает. На srv-lan та же самая HP-UX B.11.11, с идентичным составом патчей.
Из последних двух фактов можно сделать предположение, что критична задержка доставки пакетов. Потому промежуточные маршрутизаторы или srv-lan всё и спасают.

Однако, это не даёт ответ на самые главные вопросы: кто виноват и что делать? Виноват, наверное, Билл Гейтс, а делать – видимо, менять srv4 на “что-нибудь другое”, благо всё равно собирались этим заниматься. Но, однако, надёжнейший протокол TCP, блин…

Leave a Reply