가상화를 위한 준비 #2 – 네트워크

가상화를 위한 준비에서 네트워크 준비에 대해 고민을 많이 했다.

인터넷에서 찾아본 대부분의 문서들이 가정에서 공유기 밑에 ESXi를 설치하는 문서만 있었기에 거의 도움이 되지 않았다. 공유기 밑에서 DHCP 환경으로 ESXi를 설치하는 것은 별로 어려운 일이 아닐뿐더러, IP가 계속 할당되기 때문에 IP에 대해서도 고민할 필요가 거의 없다.

난 IDC에 서버를 넣어야하고 고정IP가 제한적으로 부여되기 때문에 어려움이 많았다.

[gads_468x60]

여기서 중요한 것은 ESXi를 관리하는데에 쓰이는 IP와 실제 서버에 사용될 IP, 즉 최소 2개 이상의 IP가 확보되어야만 ESXi를 사용할 수가 있다. 이 사실을 아주 오랜 시간과 실패 끝에 알아냈다. 인터넷에 있던 문서들은 공유기 밑에서 사용했으므로 이러한 문제를 하나도 겪지 않았을 것이다. IP 하나로는 ESXi를 운영할 수가 없는데 그 이유는 다음과 같다.

  1. ESXi 서버는 자체적으로 80, 443, 22번 등의 중요한 포트를 관리용 포트로 사용한다.
  2. 그 포트 번호를 다른 포트 번호로 바꿀 수 없다면 이 포트를 해당 IP의 서비스 포트로 사용할 수가 없다는 얘기가 된다.
  3. VMWare의 kb에는 이 포트번호들을 바꾸는 방법이 설명되어 있으나 실제로는 적용 되지 않는다.

결론적으로 3번을 시도하느라 엄청난 시도와 실패를 경험하고 VMWare에서 만든 문서가 잘못되어 있다는 결론이 났다. 아이피가 2개이면 이 모든 문제를 고민할 필요가 없어지게 된다.

그래서 IDC와 계약시 부여받은 IP는 3개였다. 하나는 ESXi의 관리용으로, 하나는 서비스용으로, 하나는 예비용으로 사용하고 있다. ESXi를 설치할 때 관리용 IP로 입력을 하고, ESXi 위에서 NAT와 방화벽을 담당할 서버에 서비스용 IP를 부여했다.

부디 ESXi를 실제 서비스에 응용하는 사람들은 나 같은 실패를 겪지 않기를.

C#에서 엔디안 변경

C#에서 네트워크 통신을 할게 있어서 바이트오더를 빅엔디안으로 해주려다가 알게 된게 있어서 정리한다.

일단 바이트오더링을 하기 위해 리틀엔디안-빅엔디안의 변환이 필요한데 C#에는 이를 지원하는 메서드가 이미 있었다.

http://msdn.microsoft.com/en-us/library/fw3e4a0f 에 있는 HostToNetworkOrder 와 NetworkToHostOrder 라는 메서드인데 이상한건 이 메서드들이 int16, int32, int64만 지원한다는 것이다. 난 uint16, uint32를 변경해야했기에 아무리 해봐도 이 메서드를 통해서는 바이트오더를 변경할 수 없었다. 강제로 형변환도 해봤지만 데이터가 잘못 들어가기만 했다.

구글을 한참 뒤져서 스택오버플로우에서 답을 찾았다.

http://stackoverflow.com/questions/11232594/c-sharp-reversed-ushort

위 링크의 리플처럼 다음의 코드를 사용하면 된다.

var arr = new byte[1];

arr = BitConverter.GetBytes(total_length);
Array.Reverse(arr);
arr.CopyTo(buffer, offset);
offset += Marshal.SizeOf(total_length);

원리는 바이트배열을 선언하고 비트컨버터를 통해 바이트를 구한다음 Array.Reverse()를 통해 바이트를 거꾸로 하는 것이다. 한마디로 바이트오더링을 직접 구현한 것이라고 보면 될 것 같다.

여튼 이 코드를 통해 테스트해보니 정상작동함을 확인했다.

IOCP에 대한 좋은 설명 문서

IOCP에 대해 검색하다가 발견하게 된 좋은 문서. 데브피아의 이기탁님이 쓰신 문서라고 한다. IOCP에 대하여 자세하게 잘 설명하고 있는듯하다. 나중에 다시 생각날 때마다 보기 위해 여기에 글을 쓰고 해당문서를 저장해놓는다.

이렇게 퍼와도 되는지 모르겠다. 내가 가져온 곳은 http://sweeper.egloos.com/2811340 (당연히 저작권은 이기탁님에게 있다.)