
Boost ASIO TCP 소켓을 사용하는 클라이언트/서버 네트워크 애플리케이션이 있습니다. 클라이언트는 여러 네트워크 인터페이스(WiFi, 셀룰러 등)를 사용할 수 있는 임베디드 Linux 시스템에서 실행 중입니다. 언제든지 하나의 네트워크 인터페이스만 작동되고 서명된 IP 주소가 있으며, 인터페이스가 다운되면 다른 인터페이스가 작동되고 서명됩니다. IP 주소. 내가 가진 문제는 응용 프로그램이 사용 가능한 하나의 인터페이스에서 TCP 소켓을 생성할 때 데이터를 원격 서버로 전송할 수 있지만 인터페이스가 다운되고 다른 인터페이스가 작동하면 클라이언트 응용 프로그램이 여전히 데이터를 원격 서버로 전송한다는 것입니다. 동일한 다운 인터페이스를 사용하면 서버가 데이터를 수신할 수 없습니다. 저는 Linux OS 경로가 네트워크 인터페이스 장애 조치를 처리할 수 있어야 하고, 사용자 TCP 애플리케이션은 네트워크 인터페이스 변경에 대해 걱정할 필요가 없어야 한다고 생각했습니다. 프로그램 수정에 대한 조언을 부탁드립니다.
이더넷과 WiFi가 모두 포함된 Ubuntu 18을 실행하는 노트북에서 볼 수 있는 것과 동일한 문제는 이더넷이 연결되어 있을 때 원격 사이트에 연결된 SSH를 실행하면 이더넷 케이블을 뽑았을 때 WiFi는 계속 연결되어 있지만 SSH는 정지되어 있습니다. OS 경로로 연결을 전환할 수 없습니다.
감사합니다.
감사합니다.
- 제이
하나의 인터페이스가 다운될 때 기존 TCP 연결 스위칭 인터페이스에 대해 이야기하고 있습니까? 이것은 작동하지 않습니다. TCP는 멀티 호밍이 아니므로 이는 Linux가 아닌 프로토콜의 결함입니다. TCP 소켓에서 수신 대기하는 OTOH는 기본적으로 TCP 연결을 열 때와 마찬가지로 모든 인터페이스를 사용합니다.
예, 하나의 인터페이스가 다운되면 기존 TCP 연결 전환 인터페이스가 작동합니다.
클라이언트-서버 애플리케이션에서 양쪽을 모두 제어하는 경우 SCTP 또는 다중 경로 TCP와 같은 멀티 호밍 프로토콜 사용을 고려하십시오.
예, 저는 클라이언트 서버 애플리케이션의 양쪽을 모두 제어합니다. Boost ASIO 소켓을 사용하여 Boost가 Multipath TCP를 지원하는지 여부를 확인합니다.
본딩과 같이 물리적 링크의 장애 조치를 처리하는 다른 방법도 있지만 이를 위해서는 양쪽을 모두 제어할 수 있어야 합니다.
예 또는 아니요, 저는 클라이언트 서버 애플리케이션의 양쪽을 모두 제어하지만 클라이언트 플랫폼 사이트가 아닌 서버 플랫폼 사이트만 제어합니다. 클라이언트 사이트에 네트워크 운영 변경을 제안할 수 있습니다. 작동할까요?
감사합니다.
답변1
하나의 인터페이스가 다운될 때 기존 TCP 연결 스위칭 인터페이스에 대해 이야기하고 있습니까? 이것은 작동하지 않습니다. TCP는 멀티 호밍이 아니므로 이는 Linux가 아닌 프로토콜의 결함입니다. 오토청취TCP 소켓에서는 기본적으로 모든 인터페이스를 사용합니다.열리는TCP 연결.
클라이언트-서버 애플리케이션에서 양쪽을 모두 제어하는 경우 다음과 같은 멀티 호밍 프로토콜 사용을 고려하십시오.SCTP또는다중 경로 TCP.
Linux OS 경로가 네트워크 인터페이스 장애 조치를 처리할 수 있어야 한다고 생각했습니다.
TCP 및 UDP의 다른 기존 구현도 마찬가지이며 결코 그렇지 않습니다. 마찬가지로 동시에 여러 ISP를 쉽게 사용할 수 없다는 것이 FAQ입니다.
본딩과 같이 물리적 링크의 장애 조치를 처리하는 다른 방법도 있지만 이를 위해서는 양쪽을 모두 제어할 수 있어야 합니다.
편집하다
서버와 클라이언트 사이에 무엇이 있는지에 따라 네트워크의 이 부분은 SCTP를 통과시킬 수도 있고 그렇지 않을 수도 있습니다(의심스러운 경우 테스트).
대부분의 임베디드 Linux 시스템의 경우 다중 경로 TCP에 필요한 커널을 다시 컴파일할 수 있어야 합니다.
이렇게 할 수 없다면 아마도 이 문제가 발생한 것입니다. 유일한 해결 방법은 인터페이스가 다운되었는지 감지하고 클라이언트에서 연결을 다시 여는 것입니다(서버에 알려진 IP가 있다고 가정).