서버 IP 삭제 후 클라이언트와 서버 간 TCP 통신

서버 IP 삭제 후 클라이언트와 서버 간 TCP 통신

[IP1:PORT1]에서 수신 대기하는 TCP 서버를 만들고 [IP2]를 사용하여 클라이언트를 통해 연결했습니다. 클라이언트와 서버 모두에서 다음 구성 값을 사용하여 SO_KEEPALIVE 및 TCP_USER_TIMEOUT을 활성화합니다.

TCP_KEEPIDLE = 1
TCP_KEEPINTVL = 1
TCP_KEEPCNT = 4
TCP_USER_TIMEOUT = 5000

내가 캡처한 TCPdump에서 다음을 확인했습니다.

  1. 처음에는 클라이언트와 서버 간에 3번의 핸드셰이크(syn-synack-ack)가 발생합니다.
  2. 1초마다 클라이언트와 서버는 Keepalive 패킷을 생성하고 해당 피어는 이에 대한 응답으로 ack를 보냅니다.

모든 일이 내가 예상한 대로 정확하게 일어나고 있습니다. 하지만 이제 다음 명령을 사용하여 서버 IP(IP1)를 제거했습니다.

/sbin/ip addr del IP1 dev DEV

IP를 제거한 후 추적에서 다음을 관찰했습니다.

  1. Keepalive 패킷은 두 엔터티(클라이언트 및 서버) 모두에서 계속 전송됩니다. 놀랍게도 기본 IP가 제거되었음에도 불구하고 서버는 여전히 연결 유지 패킷을 보냅니다!

  2. 클라이언트는 승인을 통해 서버가 보낸 Keepalive 패킷에 응답합니다.

  3. 서버는 클라이언트가 보낸 Keepalive 패킷에 대한 승인을 보내지 않습니다.

  4. 약 4초 후 서버 IP(IP1)는 클라이언트에게 [RST,ACK]를 보내고 더 이상 패킷 교환이 발생하지 않습니다.

그래서 나는 위의 두 가지를 이해하지 못합니다.

  1. 서버 IP가 삭제된 후에도 일정 기간 동안 통신이 계속되는 이유는 무엇입니까?
  2. 서버가 클라이언트에 연결 유지 패킷을 보낼 수 있지만 클라이언트에 연결 유지 확인을 보낼 수 없는 이유는 무엇입니까?

운영 체제: Red Hat Enterprise Linux 버전 8.3

답변1

대답은 매우 모호하지만 이를 통해 올바른 방향으로 더 많은 조사를 할 수 있습니다.

TCP 연결이 설정되면 커널은 연결에 대한 데이터 구조를 설정합니다. 인터페이스에서 IP 주소를 제거한다고 해서 반드시 이 정보가 완전히 제거되는 것은 아닙니다. (아무도 이에 대해 신경 쓰지 않을 것으로 생각하기 때문에 일반적으로 IP 주소를 제거하기 전에 모든 서버가 종료되고 결국에는 정리됩니다.)

따라서 이러한 내부 데이터 구조는 분명히 연결 유지 교환을 수행하며 일부 이벤트가 발생하고(아마도 연결이 이제 끊어진 것으로 간주되기 때문에) 전체 연결 상태가 수집될 때까지 ACK 패킷이 생성되거나 전달되지 않습니다.

자세한 내용을 알고 싶다면 커널 코드를 읽고 어떤 데이터 구조가 구축되어 있는지 알아보고, IP ​​주소가 삭제되면 어떤 구조가 삭제되고 어떤 구조가 유지되는지 알아보세요.

그러나 모든 것은 학문적입니다. 실제 결과가 없는 극단적인 행동을 발견할 수 있습니다.

관련 정보