35.5. MPTCP 하위 흐름 모니터링

다중 경로 TCP(MPTCP) 소켓의 라이프사이클은 복잡할 수 있습니다. 기본 MPTCP 소켓이 생성되어 MPTCP 경로가 검증되고 하나 이상의 하위 흐름이 생성되고 결국 제거됩니다. 마지막으로 MPTCP 소켓이 종료됩니다.

MPTCP 프로토콜을 사용하면 iproute 패키지에서 제공하는 ip 유틸리티를 사용하여 소켓 및 하위 흐름 생성 및 삭제와 관련된 MPTCP 관련 이벤트를 모니터링할 수 있습니다. 이 유틸리티는 netlink 인터페이스를 사용하여 MPTCP 이벤트를 모니터링합니다.

이 절차에서는 MPTCP 이벤트를 모니터링하는 방법을 설명합니다. 이를 위해 MPTCP 서버 애플리케이션을 시뮬레이션하고 클라이언트가 이 서비스에 연결됩니다. 이 예제의 관련 클라이언트는 다음 인터페이스 및 IP 주소를 사용합니다.

  • 서버: 192.0.2.1
  • 클라이언트(Ethernet 연결): 192.0.2.2
  • 클라이언트(WiFi 연결): 192.0.2.3

이 예제를 단순화하기 위해 모든 인터페이스가 동일한 서브넷에 있습니다. 이는 요구 사항이 아닙니다. 그러나 라우팅이 올바르게 구성되어 있고 클라이언트가 두 인터페이스를 통해 서버에 연결할 수 있는 것이 중요합니다.

사전 요구 사항

  • 두 개의 네트워크 인터페이스가 있는 RHEL 클라이언트(예: 이더넷 및ECDHE 포함)
  • 클라이언트는 두 인터페이스를 통해 서버에 연결할 수 있습니다.
  • RHEL 서버
  • 클라이언트와 서버 둘 다 RHEL 9.0 이상을 실행
  • client와 server 둘 다에ECDHE tcpd 패키지를 설치하셨습니다.

절차

  1. 클라이언트와 서버 모두에서 연결별 하위 흐름 제한을 1 로 설정합니다.

    # ip mptcp limits set add_addr_accepted 0 subflows 1
  2. 서버에서 MPTCP 서버 애플리케이션을 시뮬레이션하려면 TCP 소켓 대신 적용된 MPTCP 소켓을 사용하여 netcat (nc)을 수신 모드에서 시작합니다.

    # mptcpize run nc -l -k -p 12345

    -k 옵션을 사용하면 처음 허용된 연결 후 nc 가 리스너를 닫히지 않습니다. 이는 하위 흐름의 모니터링을 보여주는 데 필요합니다.

  3. 클라이언트에서 다음을 수행합니다.

    1. 가장 낮은 메트릭으로 인터페이스를 식별합니다.

      # ip -4 route
      192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.2 metric 100
      192.0.2.0/24 dev wlp1s0 proto kernel scope link src 192.0.2.3 metric 600

      enp1s0 인터페이스에는 wlp1s0 보다 낮은 메트릭이 있습니다. 따라서 RHEL은 기본적으로 enp1s0 을 사용합니다.

    2. 첫 번째 터미널에서 모니터링을 시작합니다.

      # ip mptcp monitor
    3. 두 번째 터미널에서 서버에 대한 MPTCP 연결을 시작합니다.

      # mptcpize run nc 192.0.2.1 12345

      RHEL은 enp1s0 인터페이스와 관련 IP 주소를 이 연결의 소스로 사용합니다.

      모니터링 터미널에서 ip CloudEventtcp 모니터 명령이 로그됩니다.

      [       CREATED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345

      토큰은 MPTCP 소켓을 고유 ID로 식별하고 나중에 동일한 소켓에서 MPTCP 이벤트를 연관시킬 수 있습니다.

    4. 서버에 대한 nc 연결이 실행 중인 터미널에서 Enter 를 누릅니다. 이 첫 번째 데이터 패킷은 연결을 완전히 설정합니다. 데이터가 전송되지 않은 한 연결이 설정되지 않습니다.

      모니터링 터미널에서 ipECDHEtcp는 이제 로그를 모니터링합니다.

      [   ESTABLISHED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
    5. 선택 사항: 서버의 포트 4.6.145 대한 연결을 표시합니다.

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345

      이 시점에는 서버에 대한 하나의 연결만 설정되었습니다.

    6. 세 번째 터미널에서 다른 끝점을 생성합니다.

      # ip mptcp endpoint add dev wlp1s0 192.0.2.3 subflow

      이 명령은 이 명령에서 클라이언트의 IRQ 인터페이스의 이름 및 IP 주소를 설정합니다.

      모니터링 터미널에서 ipECDHEtcp는 이제 로그를 모니터링합니다.

      [SF_ESTABLISHED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3

      locid 필드에는 새 하위 흐름의 로컬 주소 ID가 표시되고 연결이 NAT(네트워크 주소 변환)를 사용하는 경우에도 이 하위 흐름을 식별합니다. saddr4 필드는 ipECDHEtcp 엔드포인트 add 명령의 끝점의 IP 주소와 일치합니다.

    7. 선택 사항: 서버의 포트 4.6.145 대한 연결을 표시합니다.

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345
      tcp ESTAB  0  0  192.0.2.3%wlp1s0:53345 192.0.2.1:12345

      이제 명령은 다음 두 개의 연결을 표시합니다.

      • 소스 주소 192.0.2.2 와의 연결은 이전에 설정한 첫 번째 MPTCP 하위 흐름에 해당합니다.
      • 소스 주소 192.0.2.3 이 있는 wlp1s0 인터페이스를 통한 하위 흐름에서의 연결입니다.
    8. 세 번째 터미널에서 끝점을 삭제합니다.

      # ip mptcp endpoint delete id 2

      ipECDHE tcp 모니터 출력의 locid 필드에서 ID를 사용하거나 ipECDHEtcp 엔드포인트 show 명령을 사용하여 끝점 ID를 검색합니다.

      모니터링 터미널에서 ipECDHEtcp는 이제 로그를 모니터링합니다.

      [     SF_CLOSED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
    9. nc 클라이언트가 있는 첫 번째 터미널에서 Ctrl+C 눌러 세션을 종료합니다.

      모니터링 터미널에서 ipECDHEtcp는 이제 로그를 모니터링합니다.

      [        CLOSED] token=63c070d2