rein's world

IPv6 를 대비한 코드를 짤 때 가끔 보는 실수

현재 인터넷의 주소 체계는 IPv4다. 이 IPv4로 쓸 수 있는 주소는 곧 동이 난다.1

그래서인지, 요즘 네트웍 쪽 코드를 읽다보면 몇 가지 방법으로 IPv4 –> IPv6 전환하기 위한 대비를 해둔걸 보게 된다. 크게 두 가지 방식을 보게 된다.

문자열로 주소를 전달한다 – IPv4 or IPv6 인지는 신경쓰지 않고, 그 밑의 네트웍 라이브러리나 코드 단에서 처리하게 한다.

미리 IPv6 일 때 사용할 인자 혹은 메모리 등을 예약(reserve)해 둔다 – IP 주소를 특정 데이터 타입으로 전달한다고 할 때, 추가로 공간을 할당한다면 여기에 IPv6 주소를 넣어서 보낼 수 있다.

하지만 요즘 본 코드 중 하나는 실소를 금할 수가 없더라. 두번째 형태로 IPv6를 대비한 것으로 보이는데, _예약한 공간이 4 bytes_이다… 이게 왜 문제냐하면, IPv4에서 IPv6로 넘어갈 때, 주소로 사용하는 크기는 32bits에서 128bits으로 늘어난다는 점 때문. 64bits이 아니라… 그래서 추가로 공간을 예약한다면 char[12]를 쓰거나, 아예 주소 전달할 때 16bytes를 쓰고, IPv4쓰는 동안 4bytes을 쓴다.

이러면 예약해두나 마나 허망한 짓. 나중에 IPv6처리하려면 결국 8bytes를 추가로 넣어야한다. 이게 일종의 프로토콜 명세의 일부라서, 나중에 고치려면 모든 이해 당사자들에게 이걸 얘기하고, 수정해가야 한다는 점인데… 내가 나중에 수정도 하게 될텐데, 무진장 귀찮구만… 개인적인 선호(?)는, 아예 첫번째 방법으로 문자열을 쓰는 것. 이러면 프로토콜 자체에 영향을 줄 일은 매우 적고, 대부분의 Network Library/API에서도 문자열로 된 주소를 쉽게 인식한다는 크나큰 장점이 있다.

여튼 세 줄 요약

  • IPv6는 128bits을 쓴다. 메모리에 나타내려면 IPv4 주소에 비해 4배의 공간이 필요하다
  • 네트웍 주소처리는 가장 밑 단에 해당하는 코드가 아니고서야 문자열 기준으로 하는게 편하다. 실수할 여지도 적고.

  1. 2010년 9월 19일 현재 추정치로, IANA 기준으로는 내년 5월 22일, 각 지역별 레지스트리 기준으로는 내후년 6월 12일이면 주소가 바닥난다. 2023년 8월 현재, IPv6를 쓸 수 있는 비율은 40% 정도다. 위키백과 IPv6 deployment 참고 ↩︎