C#

IP 주소와 호스트

여기서는 네트워크에 기본적으로 사용되는 IP 주소, DNS, IP 종단점에 대해 알아본다. 이러한 네트워크 기본 클래스들은 .NET의 System.Net 네임스페이스에 있는데, 이러한 기능을 구현한 IPAddress, Dns, IPEndPoint 클래스 등에 살펴보자.

IP 주소 (IPAddress 클래스)

IP 주소는 인터넷에 연결된 컴퓨터들의 주소로서 크게 가장 많이 사용되는 IP 버전4를 가리키는 IPv4 주소와 IPv4 주소가 모자랄 것을 대비해 만든 IPv6 주소가 있다. IPv4 는 32비트 주소를 사용하고 "191.239.213.197" 와 같이 4개의 숫자로 표기하며, IPv6는 128 비트 주소로서 "fe80::42a:545e:43be:6682%23"와 같이 좀 복잡하게 표기한다. 사실 이러한 표기는 사람들이 쉽게 알아보도록 한 표기이고 컴퓨터 내부에서는 32비트/128비트 숫자를 사용한다.

.NET에서 IP 주소를 사용하기 위해서는 System.Net의 IPAddress 클래스를 사용한다. 가장 일반적인 IPv4 주소를 예를 들면, 아래와 같이 IP 주소 문자열로부터 파싱해서 IPAddress 객체를 만들 수 있고, 바이트 배열 혹은 정수를 직접 IPAddress 생성자에 넣어 IPAddress 객체를 만들 수도 있다. IPAddress 객체로부터 ToString() 메서드를 호출하면 "192.168.1.13" 와 같은 표현으로 IP가 출력된다.

// using System.Net;

// 아래는 모두 동일한 IP 주소 표현
IPAddress ip1 = IPAddress.Parse("192.168.1.13");

IPAddress ip2 = new IPAddress(new byte[] { 192, 168, 1, 13 });

IPAddress ip3 = new IPAddress(218212544);
Console.WriteLine(ip3.ToString());  // "192.168.1.13" 출력     

// 유용한 IPAddress 메서드
IPAddress ip = IPAddress.Parse("216.58.216.174");

byte[] ipbytes = ip.GetAddressBytes(); // IP를 바이트배열로 

IPAddress ipv6 = ip.MapToIPv6();  // IPv4를 IPv6로 매핑    

DNS (Dns 클래스)

보통 IP 주소를 기억하기 힘들기 때문에 호스트명을 사용하여 어떤 컴퓨터인지를 표현하는데, 로컬 네트워크에서는 컴퓨터명을 호스트명으로 하고, 인터넷 상에서는 호스트이름과 도메인이름을 사용한다. 예를 들어, 로컬에서는 AlexPC 와 같은 호스트명을 사용할 수 있고, 인터넷 상에서는 www.google.com 과 같은 호스트명을 사용한다.

호스트/도메인명에서 IP 주소 얻기

호스트/도메인명을 IP 주소로 변경하기 위해서는 DNS (Domain Name Server)를 사용하는데, .NET 에서는 Dns 클래스를 통해 호스트 정보를 얻어 올 수 있다. Dns.GetHostEntry(호스트명) 메서드는 정적 메서드로서 호스트명에 대한 IP 정보, Alias 정보 등을 리턴하는데, 이렇게 리턴되는 정보를 IPHostEntry 객체에 담게된다. 해당 호스트에 대한 IP 주소는 복수 개일 수 있으므로 IPHostEntry 객체의 AddressList 속성에 IPAddress[] 배열의 형태로 저장된다. 아래 예제는 구글 호스트명에 대한 IP 정보를 보여주는 예인데, 이 호스트는 (현재) 6개의 IP 주소를 가지고 있다.

//// 호스트/도메인명에서 IP 알아내기

// 인터넷 호스트명 정보 얻기
IPHostEntry hostEntry = Dns.GetHostEntry("www.google.com");

Console.WriteLine(hostEntry.HostName);            
foreach (IPAddress ip in hostEntry.AddressList)
{
    Console.WriteLine(ip);
}

// 로컬 호스트명 정보 얻기
string hostname = Dns.GetHostName();
IPHostEntry localhost = Dns.GetHostEntry(hostname);      

IP 주소에서 호스트/도메인명 얻기

DNS가 호스트/도메인명으로부터 IP 주소를 가져오는 것이라면, Reverse DNS (rDNS)는 반대로 IP 주소로부터 호스트/도메인명을 가져오는 기능이다. rDNS가 사용되는 한 예로 이메일 스팸 차단 기능을 들 수 있는데, 어떤 IP로부터 도착한 메일을 필터링할 때 IP를 도메인명으로 변경한 후 타당한 호스트/도메인이지 검사하는 방식이다. (하지만 여러 문제점이 있음)

Reverse DNS가 동작하기 위해서는 DNS 설정에서 해당 서버를 PTR 레코드에 별도로 적어 주어야 한다. (통상 DNS 설정에서 A 레코드가 서버 IP를 등록하는 것임)
아래 예제는 IP 주소로부터 호스트/도메인명을 얻어내는 것으로서 보통 회사내 인트라넷에서는 잘 동작할 것이고, 인터넷 상에서는 DNS 설정에 따라 동작할 수도 있고 하지 않을 수도 있다.

// IP 에서 호스트명 알아내기

IPAddress ipaddr = IPAddress.Parse("10.11.8.124");
IPHostEntry hostEntry = Dns.GetHostEntry(ipaddr);
Console.WriteLine(hostEntry.HostName);           

EndPoint (IPEndPoint 클래스)

TCP나 UDP는 IP 주소와 함께 포트번호를 사용한다. 이러한 종단점(EndPoint)을 표현하기 위해 IPEndPoint 클래스를 사용한다. IPEndPoint는 IP주소와 포트를 받아들인 것으로 ToString() 메서드를 호출하면 "IP주소:포트" 형식으로 문자열을 리턴한다.

IPAddress ip = IPAddress.Parse("74.125.28.99");
IPEndPoint ep = new IPEndPoint(ip, 80);

Console.WriteLine(ep.ToString()); // "74.125.28.99:80" 출력

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print