Назад | Перейти на главную страницу

Что может заставить мой сервер SendMail не подтверждать получение последовательности TCP?

Мои знания о стеке 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 должным образом, до коммутатора, который также страдает от этого, и даже до неисправных кабелей. В некоторых случаях я замечал странную комбинацию драйвера устройства сетевого интерфейса и всего вышеперечисленного.