Мои знания о стеке TCP / IP немного устарели, так что потерпите меня ...
У меня есть сервер CentOS 5.7 с SendMail, и я наблюдаю периодические проблемы с тайм-аутом при отправке электронной почты (особенно электронной почты большего размера) в другие удаленные домены. Это происходит не со всеми вложениями или доменами получателя. Лишь некоторые. После некоторого расширенного устранения неполадок, я думаю, я сузил его до не подтверждаемых последовательностей TCP.
Вот разбивка TCP-сеанса из захвата пакета, который я собрал непосредственно на моем MTA (fooMTA):
Packet 1 - 11: Standard TCP handshake followed by initial SMTP conversation. No errors.
Packet #12 Recipient MTA: TCP sequence 231. Ack 91.
Packet #13 FooMTA: TCP sequence 91. Ack 305.
Packet #14 FooMTA: TCP sequence 1115. Ack 305.
Packet #15 Recipient MTA: TCP sequence 305. Ack 2495.
Packet #16 FooMTA: TCP sequence 2495. Ack 305.
Packet #17 FooMTA: TCP sequence 5255. Ack 305.
Packet #18: Recipient MTA: TCP sequence 305. Ack 5255.
Packet #19: FooMTA: TCP sequence 6635. Ack 305.
Packet #20: FooMTA: TCP sequence 8015. Ack 305.
Packet #21: Recipient MTA: TCP Sequence 305. Ack 8015.
Packet #22: FooMTA: TCP Sequence 10775. Ack 305.
Packet #23: FooMTA: TCP Sequence 13535. Ack 305.
Packet #24: Recipient MTA: TCP sequence 305. Ack 10775
Packet #25: FooMTA: TCP Sequence 14915. Ack 305
Это продолжается, когда мой сервер все еще думает, что не получил последовательность 305 ... в ответ удаленная сторона в конечном итоге повторно передает свои предыдущие данные, думая, что они так и не прибыли. В конце концов разрыв становится настолько большим, что новые данные не отправляются, а удаленный MTA продолжает повторно передавать старые данные. Это способствует экспоненциальному откату, и в конечном итоге удаленная сторона сдается.
Что для меня странно, так это то, что я вижу «отсутствующую» TCP-последовательность (в данном случае 305), возвращающуюся на мой сервер (посредством захвата пакетов, собранных непосредственно из fooMTA), поэтому я не понимаю, почему мой сервер продолжает ее запрашивать.
Может ли это быть связано с брандмауэром? Что будет следующим шагом в устранении неполадок?
Попробуйте это: в вашем /etc/sysctl.conf добавьте следующие строки внизу:
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_window_scaling = 0
Затем от имени root выполните sysctl -p
Если это сработает, проблема будет решена. Это не решает. Причин может быть множество: от маршрутизатора, который не обрабатывает масштабирование окна TCP должным образом, до коммутатора, который также страдает от этого, и даже до неисправных кабелей. В некоторых случаях я замечал странную комбинацию драйвера устройства сетевого интерфейса и всего вышеперечисленного.