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일이면 주소가 바닥난다. []

Published by

rein

나는 ...

8 thoughts on “IPv6 를 대비한 코드를 짤 때 가끔 보는 실수”

    1. IPv6가 64bits이라고 생각한다거나(…)

      제가 그냥 동어 반복으로 써놨네요(…).
      밑의 오스카님 댓글처럼, 그냥 두 배라고 생각하기인 듯 하네요 ~_~

  1. IPv6 준비하시는군요 곧 바닥나는데 레가시코드 고친다는 이야기를 듣기 어렵네요 후배한테도 지금 공부해두면 인정받는데 도움이 덜 거라 말해두긴 했는데 어쩌련지 흠

    1. 아이디가 바뀌셨네요 :$ (그래서 잠시 pending-queue에 들어가 있었습니다).

      IPv6 준비는 사실 각 팀(회사?) 마다 한 두명만 하면 어떻게든 되긴해서, 실제로 정말 필요해질 순간(…각 지역에 할당된 것 까지 실제로 소진된 후) 전에는 어떻게든 될 것 같긴합니다;
      그래도 준비 하는 곳이 많다는 얘긴 아직 많이 못 듣긴했네요(…).

Leave a Reply