На сервере develop у меня стоит apache.
Делаю telnet на 80 порт, немного жду и закрываю соединение
вообще без передачи каких-либо данных.
olimpico_work ~ # telnet develop 80
Trying 192.168.70.201...
Connected to develop.
Escape character is '^]'.
^]quit
telnet> quit
Connection closed.
olimpico_work ~ #
Вот что показывает при этом tcpdump на клиентской стороне:
olimpico_work ~ # tcpdump -i eth1 host develop and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:23:44.187263 IP krivenok.41234 > develop.http: S 2779819717:2779819717(0) win 5840 <mss 1460,sackOK,timestamp 1348338 0,nop,wscale 7>
11:23:44.187387 IP develop.http > krivenok.41234: S 107518013:107518013(0) ack 2779819718 win 5792 <mss 1460,sackOK,timestamp 15521524 1348338,nop,wscale 2>
11:23:44.187423 IP krivenok.41234 > develop.http: . ack 1 win 46 <nop,nop,timestamp 1348338 15521524>
11:23:57.346185 IP krivenok.41234 > develop.http: F 1:1(0) ack 1 win 46 <nop,nop,timestamp 1349652 15521524>
11:23:57.346368 IP develop.http > krivenok.41234: F 1:1(0) ack 2 win 1448 <nop,nop,timestamp 15524815 1349652>
11:23:57.346405 IP krivenok.41234 > develop.http: . ack 2 win 46 <nop,nop,timestamp 1349652 15524815>
6 packets captured
6 packets received by filter
0 packets dropped by kernel
olimpico_work ~ #
Вроде все правильно и логично - сначала 3-этапное установление
соединения, а затем его завершение.
При этом на сервере develop видел, что соединение установлено:
develop ~ # netstat -na | grep "70.198" | grep 80
tcp 0 0 192.168.70.201:80 192.168.70.198:41234 ESTABLISHED
develop ~ #
Пока все хорошо.
А теперь делаем то же самое с сервером develop2 на котором тоже
стоит apache.
olimpico_work ~ # telnet develop2 80
Trying 192.168.70.205...
Connected to develop2.
Escape character is '^]'.
^]quit
telnet> quit
Connection closed.
olimpico_work ~ #
Вот что показывает tcpdump:
olimpico_work ~ # tcpdump -i eth1 host develop2 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:30:53.644916 IP krivenok.49819 > develop2.http: S 2776473031:2776473031(0) win 5840 <mss 1460,sackOK,timestamp 1391155 0,nop,wscale 7>
11:30:53.645069 IP develop2.http > krivenok.49819: S 874752337:874752337(0) ack 2776473032 win 5792 <mss 1460,sackOK,timestamp 6177317 1391155,nop,wscale 7>
11:30:53.645104 IP krivenok.49819 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1391155 6177317>
11:30:57.245167 IP develop2.http > krivenok.49819: S 874752337:874752337(0) ack 2776473032 win 5792 <mss 1460,sackOK,timestamp 6177677 1391155,nop,wscale 7>
11:30:57.245214 IP krivenok.49819 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1391515 6177677,nop,nop,sack 1 {0:1}>
11:31:03.247796 IP develop2.http > krivenok.49819: S 874752337:874752337(0) ack 2776473032 win 5792 <mss 1460,sackOK,timestamp 6178277 1391515,nop,wscale 7>
11:31:03.247837 IP krivenok.49819 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1392114 6178277,nop,nop,sack 1 {0:1}>
11:31:15.255559 IP develop2.http > krivenok.49819: S 874752337:874752337(0) ack 2776473032 win 5792 <mss 1460,sackOK,timestamp 6179477 1392114,nop,wscale 7>
11:31:15.255603 IP krivenok.49819 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1393312 6179477,nop,nop,sack 1 {0:1}>
11:31:39.466169 IP develop2.http > krivenok.49819: S 874752337:874752337(0) ack 2776473032 win 5792 <mss 1460,sackOK,timestamp 6181897 1393312,nop,wscale 7>
11:31:39.466216 IP krivenok.49819 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1395728 6181897,nop,nop,sack 1 {0:1}>
11:31:46.678079 IP krivenok.49819 > develop2.http: F 1:1(0) ack 1 win 46 <nop,nop,timestamp 1396448 6181897>
11:31:46.678314 IP develop2.http > krivenok.49819: F 1:1(0) ack 2 win 46 <nop,nop,timestamp 6182618 1396448>
11:31:46.678353 IP krivenok.49819 > develop2.http: . ack 2 win 46 <nop,nop,timestamp 1396448 6182618>
14 packets captured
14 packets received by filter
0 packets dropped by kernel
olimpico_work ~ #
При этом если смотреть на сервере, то соединение находится
в состоянии SYNC_RECV:
develop2 EQ-scripts # netstat -na | grep "70.198" | grep 80
tcp 0 0 192.168.70.205:80 192.168.70.198:49819 SYN_RECV
develop2 EQ-scripts #
То есть обмен пакетов следующий:
-> SYN
<- SYN/ACK
-> ACK
<- SYN/ACK
-> ACK
<- SYN/ACK
-> ACK
...
...
Насколько я понимаю состояние SYN_RECV говорит о том, что
получен SYN и отправлен SYN/ACK.
После получения ACK на SYN/ACK соединение должно перейти
из SYN_RECV в ESTABLISHED.
Но этого не происходит.
Такое ощущение, что TCP сервера вообще не получает последний
ACK и поэтому постоянно перепосылает SYN/ACK клиенту.
На что клиент честно отвечает ACK'ом как показано выше.
В чем может быть проблема?
P.S.
Я запустил tcpdump и на сервере (все то же самое, только
номера эфемерных портов другие):
develop2 EQ-scripts # tcpdump -i eth0 host 192.168.70.198 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:44:40.458868 IP krivenok.internal.44560 > develop2.http: S 896196718:896196718(0) win 5840 <mss 1460,sackOK,timestamp 1473788 0,nop,wscale 7>
11:44:40.461384 IP develop2.http > krivenok.internal.44560: S 959167485:959167485(0) ack 896196719 win 5792 <mss 1460,sackOK,timestamp 6260093 1473788,nop,wscale 7>
11:44:40.459054 IP krivenok.internal.44560 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1473788 6260093>
11:44:44.255015 IP develop2.http > krivenok.internal.44560: S 959167485:959167485(0) ack 896196719 win 5792 <mss 1460,sackOK,timestamp 6260473 1473788,nop,wscale 7>
11:44:44.255231 IP krivenok.internal.44560 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1474167 6260473,nop,nop,sack 1 {0:1}>
11:44:50.257519 IP develop2.http > krivenok.internal.44560: S 959167485:959167485(0) ack 896196719 win 5792 <mss 1460,sackOK,timestamp 6261073 1474167,nop,wscale 7>
11:44:50.257738 IP krivenok.internal.44560 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1474766 6261073,nop,nop,sack 1 {0:1}>
11:45:03.592464 IP develop2.http > krivenok.internal.44560: S 959167485:959167485(0) ack 896196719 win 5792 <mss 1460,sackOK,timestamp 6262273 1474766,nop,wscale 7>
11:45:03.592679 IP krivenok.internal.44560 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1475963 6262273,nop,nop,sack 1 {0:1}>
11:45:27.794962 IP develop2.http > krivenok.internal.44560: S 959167485:959167485(0) ack 896196719 win 5792 <mss 1460,sackOK,timestamp 6264693 1475963,nop,wscale 7>
11:45:27.795178 IP krivenok.internal.44560 > develop2.http: . ack 1 win 46 <nop,nop,timestamp 1478379 6264693,nop,nop,sack 1 {0:1}>
11:45:38.087399 IP krivenok.internal.44560 > develop2.http: F 1:1(0) ack 1 win 46 <nop,nop,timestamp 1479406 6264693>
11:45:38.087487 IP develop2.http > krivenok.internal.44560: F 1:1(0) ack 2 win 46 <nop,nop,timestamp 6265722 1479406>
11:45:38.087688 IP krivenok.internal.44560 > develop2.http: . ack 2 win 46 <nop,nop,timestamp 1479406 6265722>
^C
14 packets captured
38 packets received by filter
0 packets dropped by kernel
develop2 EQ-scripts #
Видно, что ACK приходит.
>>>