저는 IPv6 UDP 멀티캐스트 주소를 테스트하기 위해 Fedora에서 netcat을 사용하고 있습니다. 명령은
echo hi | nc -6 -u ff02::777:777:777 7777
netcat은 "인수가 유효하지 않습니다."라고 응답합니다.
실행 중인 추적 결과
connect(3, {sa_family=AF_INET6, sin6_port=htons(7777), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "ff02::777:777:777", &sin6_addr), sin6_scope_id=0}, 28) = -1 EINVAL
IPv6 없이 유사한 명령을 실행합니다.
echo hi | nc -u 192.168.255.255 7777
훌륭하게 작동합니다.
답변1
예비 설명: IPv4 네트워크는 192.168.0.0/16으로 설정되지 않았지만 192.168.0.0/24 또는 기타 /24 범위로 설정되었을 가능성이 높습니다. 따라서 192.168.255.255는 브로드캐스트가 아니며 그렇지 않으면 echo hi | nc -u 192.168.255.255 7777
실패합니다. IPv6에서는 지원되지 않고 IPv4에서만 지원되는 브로드캐스트의 경우 애플리케이션은 SO_BROADCAST
소켓 옵션을 사용해야 합니다. 이는 -b
netcat 옵션을 통해 달성됩니다. 실제로 네트워크 192.168.0.0/24(/16 아님)에 있다고 가정하면 다음과 같습니다.
nc -b -u 192.168.0.255 7777
브로드캐스트는 멀티캐스트가 아닙니다.
이 문제에 대해. 전체 ff02::/16
범위는로컬 링크멀티캐스트 범위. 이 범위의 경우 주소는 인터페이스가 연결되어 있는 경우에만 완전합니다.협회- 로컬 범위). 이 범위의 유효한 주소는 ff02::777:777:777
LAN 인터페이스가 호출된다고 가정할 때 eth0
에 ff02::777:777:777%eth0
정의된 대로 유효한 주소일 수 없습니다.RFC 4007:
nc -6 -u ff02::777:777:777%eth0 7777
nc
이는 명령 자체 가 아닌 라이브러리에 의해 자동으로 처리될 수 있습니다 . 인터페이스가 필요하지 않은 범위를 사용하면 인터페이스가 주소의 일부가 아니어야 하기 때문에 일반적으로 실패합니다.
이 인터페이스를 요구하지 않으려면 링크-로컬(또는 노드-로컬) 범위를 사용하지 마세요. site-local: ff05로 전환하면 인터페이스를 지정하지 않고도 작동합니다.
nc -6 -u ff05::777:777:777 7777
Linux에서는 다음 명령을 사용하여 이 두 명령의 차이점을 확인할 수 있습니다 ss
.
$ ss -aun dport == 7777
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 [2001:db8:900d:cafe:0:1:2:3]:58092 [ff05::777:777:777]:7777
ESTAB 0 0 [fe80::8c5f:87ff:fe50:d08a]%eth0:60937 [ff02::777:777:777]:7777
여기에 글로벌 주소가 있습니다이더넷 0링크 로컬 범위가 아니며 해당 주소가 소스로 선택됩니다. 링크-로컬 범위 주소의 경우 소켓이 인터페이스에 바인딩됩니다. Linux의 경우 IPV6_MULTICAST_IF
전송 시(사용하지 않을 때) 인터페이스 선택과 관련된 추가 고려 사항은 이 Q/A를 참조하세요.기본 IPv6 인터페이스를 설정하는 방법
최종 참고 사항: 다음으로 전환하는 것을 고려해야 합니다.소캇비율이 있음인터넷 고양이, 포함하다멀티캐스트 그룹에 가입IPv4의 경우. IPv6를 지원하지만 IPv6 멀티캐스트를 직접 지원하지는 않지만 setsockopt(2)
IPv6 멀티캐스트 처리를 포함하여 지원되지 않는 기능을 구현하기 위해 임의 호출을 사용할 수 있습니다. 그래도 이것보단 낫네인터넷 고양이이전 트래픽으로부터 멀티캐스트 트래픽 수신을 지원하지 않습니다.인터넷 고양이주문하다.
그래서소캇, 여기에 적어도 amd64(x86_64) 아키텍처를 사용하는 Linux에서 작동하고 다른 *nix에서도 작동할 수 있는 예가 있습니다. 가능하면 아래 값 20과 해당 대체( IPV6_ADD_MEMBERSHIP
/ IPV6_JOIN_GROUP
)를 변경하고 원래 setsockopt(2)
옵션을 사용하여 인터페이스를 활성화한 후 가능합니다. 인덱스 2(다음 첫 번째 인터페이스)루오), 먼저 보낸 사람인터넷 고양이주문하다:
socat udp6-recv:7777,setsockopt-listen=41:20:xff020000000000000000077707770777i2 -
이 옵션은 다음을 사용하여 디코딩됩니다 strace
.
setsockopt(5, SOL_IPV6, IPV6_ADD_MEMBERSHIP, {inet_pton(AF_INET6, "ff02::777:777:777", &ipv6mr_multiaddr), ipv6mr_interface=if_nametoindex("eth0")}, 20) = 0
여기서는 소위 "dalan" 형식을 사용하여 임의의 소켓 옵션을 전달합니다.ipv6_mreq구조: IPv6 주소( x
16진수 값의 경우 16바이트 IPv6 주소), 그 뒤에 인터페이스 인덱스( i
정수)가 옵니다.