TCP 상태가 어떻게 작동하는지, 특히 연결 종료 부분에 대해 읽고 있습니다.
내가 읽은 모든 책이나 온라인 자료에는 종료 프로세스의 경우 (활성) 연결 종료를 시작한 쪽에서 다음 상태를 따른다는 내용이 나와 있습니다.
개설됨, FIN-WAIT-1, FIN-WAIT-2, TIME-WAIT, 종료됨
이는 수신(수동) 측에서 제공됩니다.
생성됨, 긴밀히 대기 중, 최종 확인됨, 종료됨
이제 문제가 발생합니다. /proc/net/ip_conntrack의 연결 상태를 확인하기 위해 양쪽에서 nf_conntrack_ipv4 모듈을 모드프로브했습니다.
놀랍게도 연결이 종료되면 개시자(활성)와 수신자(수동) 모두 TIME-WAIT 상태에 들어갑니다.
나는 개시자만 이 상태를 경험하고 수신자는 연결을 종료하기를 원합니다.
왜 이런 일이 발생하는지 설명할 수 있나요?
업데이트: 이 테스트를 어떻게 수행합니까?
IP 10.0.0.1(Ubuntu 12.04)을 사용하는 VM이 있는데 여기서 10.0.0.2(Debian 6)에 대한 두 개의 SSH 연결을 시작했습니다(10.0.0.2도 VM임). 양쪽 끝에서 ip_conntrack을 확인했는데 이것이 내가 얻은 것입니다.
root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 431997 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp 6 431944 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2
root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=206 bytes=19191 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=130 bytes=18177 [ASSURED] mark=0 secmark=0 use=2
tcp 6 431947 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=16 bytes=4031 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=17 bytes=3741 [ASSURED] mark=0 secmark=0 use=2
지금까지는 모든 것이 좋아 보입니다. 이제 machine2에 대한 SSH 연결을 끊고 다음과 같은 결과를 얻습니다.
root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 431989 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp 6 117 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2
root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=211 bytes=19547 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=133 bytes=18925 [ASSURED] mark=0 secmark=0 use=2
tcp 6 115 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=31 bytes=5147 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=25 bytes=4589 [ASSURED] mark=0 secmark=0 use=2
답변1
Linux TCP 스택과 conntrack에는 TCP 연결에 대한 두 가지 다른 보기가 있습니다. 당신이 보는 것과 /proc/net/ip_conntrack
커널이 보는 것은 다릅니다. 커널 상태는 에 저장되어 /proc/net/tcp
표시 /proc/net/tcp6
될 수 있습니다 netstat
.
여기에서 볼 수 있듯이:https://serverfault.com/questions/313061/netstat-and-ip-conntrack-connection-count-differ-by-order-of-magnitude-why두 가지 수치가 다릅니다. 내 생각에 당신이 netstat
출력을 보면TIME-WAIT
답변2
이는 새 연결이 네트워크 주위에 여전히 떠다니는 오래된 연결에서 오래된 세그먼트를 가져와서 엉망으로 만드는 것을 방지하기 위한 것입니다.