2013-12-18 6 views
5

인기있는 자습서를 사용하여 IPv6을 지원하는 응용 프로그램을 포팅했습니다. 두 프로토콜 모두에 하나의 소켓 수신기 만 사용하기로 결정했습니다. 이제 IPV6_V6ONLY을 제대로 설정해야한다는 것을 깨달았습니다. (이는 내 x86 리눅스에서만 작동하지만 내 ARM에서는 작동하지 않습니다.)IPv6 및 IPv4 용 소켓 리스너

정말이 방법이 맞습니까? 일부는 IPV6_V6ONLY이 사용되어서는 안된다고 말합니다. (분명히 유선을 통한 IPv4 매핑 때문에 구식입니다.) 두 프로토콜 모두에 대해 하나의 소켓을 사용하는 것이 좋습니다.

그래서 혼란 스럽습니다. 이 문제에 대한 현재 상태는 무엇입니까? 나는 그 문제를 오해 했습니까?

+0

설명 비트 : V6ONLY는 소프트웨어가 패킷을 처리하는 방법에 영향을 미칩니다. 그것은 전선의 비트에 영향을 미치지 않습니다. 소프트웨어 측면에서는 모든 것이 IPv6 패킷처럼 보입니다. 유선상에서 실제로 IPv4 패킷 인 경우 소프트웨어 측은 IPv6 패킷처럼 보이게하고 IPv4 주소를':: ffff :'뒤에 오는 IPv6 주소와 32 비트의 IPv4 주소로 매핑합니다. V6ONLY는 소프트웨어에서만 이것을 변경합니다. 유선에서는 정상적인 IPv4 및 IPv6 패킷입니다. ':: ffff :'주소는 절대로 전선에 표시되지 않습니다. –

+0

아, 설명을 위해 thx. 그래서 유선상에서만 사용이 중단되고'IPV6_V6ONLY '를 사용할 수 있습니다. 그것이 지원되는지 아닌지를 다루는 방법은 다른 토론이다 :) – duedl0r

답변

4

IPv6 소켓을 IPV6_V6ONLY으로 묶어 두 소켓을 항상 명시 적으로 바인딩해야합니다.

왜? 플랫폼 간 호환성.

기본적으로 Windows는 IPv4와 IPv6에서 명시 적으로 바인딩해야합니다. IPv6에만 바인딩하면 IPv4에도 암시 적으로 바인드되지 않습니다.

net.ipv6.bindv6only sysctl이 0으로 설정된 경우에만 기본적으로 Linux가 IPv6에서 바인딩 할 때 암시 적으로 IPv4에 바인딩됩니다. 데비안과 같은 배포판에서는이 기본값을 1으로 변경하여 가정을 깨 버립니다.

여기서 맥 오에스텐이 무엇을했는지 기억하지 못한다. (의견에 짹짹이 짹짹 달린 사람이 있겠는가?)하지만 요점은 두 프로토콜에 명시 적으로 바인딩하면 아무런 놀라움이 없다는 것이다.

+0

'net.ipv6.bindv6only'는 setsocket으로 설정하지 않으면 기본값을 정의한다. 소켓에 IPV6_V6ONLY를 설정하면 덮어 쓸 수 있습니다. 나는 이것이 사악한 것인지 아닌지 궁금해한다. 나는 단지 리눅스를 겨냥한 순간을 가정한다. – duedl0r

+1

@ duedl0r 기본값을 사용하지 않는 것이 가장 좋습니다. 변경할 수 있거나 시스템 관리자가 변경할 수 있습니다. 항상 명시 적으로 바인딩하거나 사용자가 설정할 수있는 구성 가능한 설정을 갖는 것이 가장 좋습니다. –

2

어느 쪽이든 상관 없습니다.

v4 및 v6을 명시 적으로 바인딩하는 경우 IPV6_V6ONLY을 설정해야합니다. 그렇지 않으면 지울 필요가 있습니다. 기본 설정은 플랫폼에 따라 다릅니다.

일부 플랫폼은 v6 소켓에서 v4 연결을 수락하지 않으므로 호환성을 극대화하기 위해 "두 소켓"접근 방식을 사용합니다.