IPv6 server와 IPv4 또는 IPv6 client 간의 연결
전에 졸업해서 나간 연구실 후배로부터 전화가 왔다. 'server에서 하나의 listening socket으로 IPv4 client로부터의 접속과 IPv6 client로부터의 접속을 모두 받아들일 수 있으려면 어떻게 해야 하느냐'는 것이었다. 의외로 잘 모르고 있던 문제라 제대로 대답해주지 못했었는데, 후에 UNP 2nd Ed.를 뒤져서 관련 내용을 찾아보았다.
우선 server는 다음의 조건을 만족해야 한다.
- server는 IPv4-IPv6 dual-stack host 상에서 동작해야 한다.
- server가 실행되는 host는 IPv4와 IPv6 주소를 모두 할당받아야 한다.
- server는 wildcard 주소(::0)에 바인딩된 IPv6 listening 소켓을 가지고 있어야 한다.
IPv6 client로부터의 접속은 IPv6 패킷을 통해 전송되기 때문에 IPv6 stack을 거쳐 들어온다. IPv4 client로부터 접속할 때는 다음과 같이 동작한다.
- IPv4 client는 gethostbyname() 함수를 통해 server의 A와 AAAA 주소 정보를 취득한다. (server가 dual-stack이므로)
- IPv4 client는 AAAA 레코드를 버리고 A 레코드에 있는 주소 정보를 사용하여 server에 IPv4 패킷으로 접속을 시도한다.
- server는 IPv6 socket으로 전송되는 IPv4 패킷을 수신할 경우, 패킷의 IPv4 주소를 IPv4-mapped IPv6 주소로 간주한다.
- IPv4-mapped IPv6 주소에 의한 연결은 IPv6 socket을 통해 연결하되, 패킷의 전송은 IPv4 stack을 사용한다.
— END OF POST.