- .NET Framework System.Net.* 이름공간들에는 HTTP나 TCP/IP, FTP 같은 표준 네트워크 프로토콜을 이용해서 통신을 수행하는데 사용할 수 있는 다양한 클래스가 있다. 핵심 구성요소들을 요약하면 다음과 같다.
- HTTP나 FTP를 통한 간단한 다운로드/업로드 연산을 위한 퍼사드 클래스 WebClient
- 클라이언트 쪽 HTTP나 FTP 연산들을 저수준에서 제어할 수 있는 WebRequest 클래스와 WebResponse 클래스
- HTTP 웹 API와 RESTful 서비스의 소비를 위한 HttpClient 클래스
- HTTP 서버 작성을 위한 HttpListener 클래스
- SMTP를 통한 메일 메시지 작성 및 전송을 위한 SmtpClient 클래스
- 도메인 이름과 주소의 변환을 위한 Dns 클래스
- 전송 계층과 네트워크 계층에 직접 접근하는데 쓰이는 TcpClient, UdpClient, TcpListener Socket 클래스
- Windows 스토어 앱은 이 형식 중 일부에만, 구체적으로 말하면 WebRequest와 WebResponse, HttpClient 에만 접근할 수 있다. 그러나 Windows 스토어 앱은 Windows.Networking.Sockets에 있는 TCP 및 UDP 통신용 WinRT 형식들도 사용할 수 있다.
네트워크 구조
- 아래 그림은 .NET 프레임워크의 네트워킹 형식들을 해당 통신 계층별로 배치한 그림이다. 대부분의 형식은 전송 계층(transport layer)과 응용 계층(application layer)에 있다.
- 전송 계층은 바이트 송, 수신을 위한 기본 프로토콜들(TCP와 UDP)을 정의한다.
- 응용 계층은 구체적인 응용을 위한 고수준 프로토콜들을 정의한다. 이를테면 웹 페이지 조회(HTTP), 파일 전송(FTP), 메일 전송(SMTP), 도메인 이름과 IP 주소 사이의 변환(DNS) 등이 이 계층에 속한다.

- 프로그래밍을 하기에는 응용 계층이 가장 편하다. 그러나 전송 계층을 직접 다루어야 하는 때도 있다.
- 크게 두 가지인데 하나는 .NET Framework가 제공하지 않는 기존 프로토콜을 응용 프로그램이 사용해야 하는 경우이다. 예컨대 POP3으로 메일을 조회하는 응용 프로그램을 만들려면 전송 계층에서 작업해야 한다.
- 또 하나는 P2P(peer-to-peer) 클라이언트 같은 특별한 응용 프로그램을 위해 커스텀 프로토콜을 고안해야 하는 경우이다.
- 응용 계층의 프로토콜 중 하나인 HTTP는 흔히 생각하는 웹 프라우징 이외의 다양한 용도로 활용할 수 있다는 점에서 특별하다.
- HTTP의 기본 용법인 “이 URL에 해당하는 웹 페이지를 가져온다(get)”를 “이 인수들로 이 끝점(endpoint)을 호출한 결과를 가져온다”라는 용법으로 바꾸는 것은 간단한 일이다.
- HTTP에는 get 외에 put과 post, delete라는 동사들이 있다. REST 기반 서비스의 작동 방식은 이 네 동사에 기초한다.
- HTTP는 다층(multitier) 업무 응용 프로그램과 서비스 지향적 구조(SOA)에 유용한 여러 기능을 갖추고 있다.
- 이를테면 인증과 암호화를 위한 프로토콜들, 메시지 분할 전송, 확장 가능한 헤더와 쿠기, 그리고 여러 서버 응용 프로그램이 하나의 포트와 IP 주소를 공유하는 능력 등이 그러한 기능의 예이다.
- HTTP는 이처럼 유용하고 중요한 프로토콜이라서, .NET Framework도 HTTP를 잘 지원한다.
- 이번 장에서 설명하는 형식들을 통해서 직접 지원할 뿐만 아니라, WCG나 Web Services, ASP.NET 같은 기술들을 통해서 고수준에서 간접적으로도 지원한다.
- .NET Framework는 파일 송수신에 널리 쓰이는 인터넷 프로토콜인 FTP의 클라이언트 쪽 기능을 지원한다.
- 서버 쪽 기능은 IIS나 Unix 기반 서버 소프트웨어의 형태로 지원된다.
제목 없음
주소와 포트
- 통신이 작동하려면 컴퓨터 또는 장치에 주소가 있어야 한다. 인터넷에 쓰이는 주소 체계는 다음 2가지 이다.
- IPv4
- 현재 지배적으로 쓰이는 주소 체계이다. IPv4 주소는 32비트이다. IPv4 주소를 문자열로 표현할 떄는 십진수 4개를 마침표로 구분한 형태가 흔히 쓰인다. (101.102.103.104). 하나의 IPv4 주소는 전 지구적으로 고유하거나, 특정 서브넷(subnet, 부분망. 이를테면 회사 내부망) 안에서 고유하다.
- IPv6
- IPv4보다 새로운 128비트 주소 체계이다. IPv6 주소의 문자열 표현은 16비트 십육진수 여덟 개를 콜론으로 연결한 형태로 .NET Framework에서는 주소 전체를 대괄호 쌍으로 감싸야 한다([3EA0:FFFF:198A:E4A3:4FF2:54FA:41BC:8D31]
- System.Net 이름공간의 IPAddress 클래스는 IPv4 또는 IPv6 주소를 대표한다. 이 클래스에는 바이트 배열을 받는 생성자와 적절한 형태의 문자열을 받는 정적 Parse 메서드가 있다.
IPAddress a1 = new IPAddress (new byte[] { 101, 102, 103, 104 });
IPAddress a2 = IPAddress.Parse("101.102.103.104");
Console.WriteLine(a1.Equals(a2)); // True
Console.WriteLine(a1.AddressFamily); // InterNetwork
IPAddress a3 = IPAddress.Parse("[3EA0:FFFF:198A:E4A3:4FF2:54FA:41BC:8D31]");
Console.WriteLine(a3.AddressFamily); // InterNetworkV6
- TCP 프로토콜과 UDP 프로토콜은 하나의 IP 주소에 대해 65,535개의 포트(port)를 할당한다. 이 덕분에 한 주소의 한 컴퓨터에서 여러 응용 프로그램을 돌릴 수 있다.(각 응용 프로그램에 하나의 포트를 사용해서)
- 여러 응용 프로토콜에는 표준 포트 번호가 배정되어 있는데, 예컨대 HTTP는 기본적으로 포트 80을, SMTP는 포트 25를 사용한다.
- 49152에서 65535까지의 TCP, UDP 포트들은 그 어떤 표준 용도로도 배정되어 있지 않으므로 시험용이나 소규모 배치 상황에 적합하다.
- IP 주소와 포트 번호의 조합은 하나의 공유한 종점(endpoint)를 나타낸다. 이를 대표하는 .NET 프레임워크의 클래스는 IPEndPoint이다.
- 방화벽들은 포트들을 차단한다. 특히 기업환경에서는 포트 80(암호화되지 않은 HTTP용)이나 포트 443(보안 HTTP용) 같은 특정 포트 몇 개만 열어 두는 경우가 많다.