Start C# Socket Programming!

1. 소켓이란 무엇인가?

소켓이란 “네트워크상의 가장 끝에 있는 플러그”라고 표현할 수 있다. 일상 생활에서 전기를 이용할 때 여러단계 즉, 전기선, 변압기 등을 거쳐 우리가 최종 이용할 수 있는 콘센트까지 전달됩니다. 그리고 우리는 이를 이용하기 위해서는 콘센트에 플러그를 꽂으면, 전기를 이용할 수 있게 됩니다. 

2. C# System.Net

C#에서는 네임스페이스를 통해 해당 모듈을 사용할 수 있습니다. 네트워크 프로그래밍을 위해 사용되는 대표적인 네임스페이스는 바로 System.Net 네임스페이스입니다. MSDN의System.Net 네임스페이스에서는 다음과 같이 확인할 수 있습니다.

http://msdn.microsoft.com/ko-kr/library/sb27wehh.aspx

해당 페이지에 있는 원문을 인용합니다.

System.Net 네임스페이스는 다양한 네트워크 프로토콜에 대한 간단한 프로그래밍 인터페이스를 제공합니다. Access, Update, Caching for WEB Resources, Mail, Present MIME Header, Access Network Traffic data and Network Address Information, Peer to Peet Network Function과 같은 기능을 제공합니다.

System.Net 하위 네임스페이스는 다음과 같습니다.

  • System.Net.Cache – WebRequest, HttpWebRequest 클래스를 사용하여 가져온 리소스의 캐시 정책을 정의하는데 사용되는 형식과 열거형을 정의
  • System.Net.ConfigurationSystem.Net 네임스페이스의 구성 설정에 프로그래밍 방식으로 액세스하고, 업데이트하기 위해 응용프로그램에서 사용하는 클래스를 포함
  • System.Net.Http – HTTP 응용 프로그램의 프로그래밍 인터페이스를 제공
  • System.Net.Mail – SMTP(Simple Mail Transfer Protocol)서버에 메일을 보내는데 사용되는 클래스를 포함
  • System.Net.Mime – System.Net.Mail 네임스페이스의 형식과 함께 사용되는 MIME 헤더를 사용하는데 필요한 형식을 포함
  • System.Net.PeerToPeer – Peer 네트워킹 기능을 접근할 수 있는 기능을 포함
  • System.Net.Socket – Window Socket 인터페이스의 관리되는 구현을 위한 기능을 포함
  • System.Net.WebSockets – Web Socket 인터페이스의 관리되는 구현을 제공
  • System.Net.Security – 호스트간의 보안 통신을 위한 네트워크 스트림을 제공
  • System.Net.NetworkInformation – 로컬 컴퓨터에 대한 주소 변경 알림, 네트워크 주소 정보, 트래픽데이터 접근 등에 대한 기능을 제공하는데 사용

즉, System.Net 네임스페이스는 C# .Net Framework을 사용하여 Network Programming을 하는데 있어 필요한 대부분의 기능을 제공해주는 모듈이다.

3. TCP/IP Protocol

TCP는 Transmission Control Protocol, IP는 Internet Protocol의 약자이다. TCP는 데이터의 “흐름”을 관리하고 데이터가 “정확”한지 검사하는 역활을 담당하고, IP는 패킷을 네트워크나 원거리에 있는 호스트로 옮기는 역활을 한다.

서로 다른 네트워크에 연결되어 있는 여러가지 다른 디바이스간에 서로 통신을 할 수 있도록 하는 프로토콜의 집합으로, 전송방식은 데이터를 같은 크기의 “패킷”으로 나누어서 전송한다. 각 패킷에는 연속적인 일련번호와 받는 사람의 주소가 추가되어 있다.

TCP/IP는 OSI 7계층에서 3계층과 4계층에 해당되며 OSI 7계층에 대한 내용은 아래에서 자세하게 다루도록 하겠다. 여러 프로토콜 중 신뢰성이 가장 높은 통신 방법이다.

자세한 내용은 다음 URL을 참고하자.

http://jsblab.com/30023986110

4. UDP/IP Protocol

UDP는 Universal Datagram Protocol의 약자, IP는 위에서 설명했으므로 생략한다. RFC 표준 프로토콜이다.

데이터의 흐름을 신뢰할 수 없고, 비연결지향성이라는 특징이 있다. 비연결지향성이라함은 TCP와는 달리 Session을 맺는 작업을 하지 않는다. 단지 보내고, 받기만을 하기 때문에 보내는 측에서는 메세지의 도착 여부를 알 수 없다. 별도의 추적 기능이 없기 때문에 불특정 다수를 대상으로 패킷을 발송하는 브로드캐스트나 멀티캐스트와 같은 기능을 수행하는데 주로 사용된다.

UDP는 데이터를 전송할 때 마다 “연결-해제”를 반복한다. 예를 들어 전송해야 할 데이터가 10개 있다면, UDP는 데이터를 전송할 때 마다 연결을 맺었다, 끊었다를 반복하게 된다. “연결”이라고는 하지만, 실제 연결되진 않는다. 

UDP 헤더의 경우 Source/Destination Port, Length, Checksum만 포함한다. 송신측에서는 패킷 전송에 대한 검증이 불가하나, 수신측에서는 Checksum을 통한 유효성 검증이 가능하다. 하지만 패킷의 순서는 알 수 없다.

5. TCP vs UDP

TCP와 UDP는 패킷헤더가 구조적으로 차이를 보인다. 이는 TCP와 UDP의 여러가지 특성에 의해서 차이가 발생한다.

Connection(TCP) vs Connectionless (UDP) : TCP는 서로 통신하기 전 Session을 맺는 작업을 한다. 데이터는 Session을 통해 전송된다. 하지만 UDP는 Session을 연결하지 않고 단지 보내고, 받기만 한다. 이러한 이유로 UDP가 TCP보다 1회에 대한 속도는 빠르다. 하지만, 통신이 잦은 상태에서는 UDP가 느릴 수도 있겠다.

Reliable(TCP) vs Unreliable(UDP) : Reliable은 데이터 전송의 신뢰성을 뜻한다. TCP는 Reliable을 보장하기 위해 문제가 있을 때는 데이터를 재전송 한다. 반대로 UDP는 문제가 생겨도 재전송을 하지 않는다.(Question. UDP는 데이터 전송 중 문제가 생기는 것을  확인할 수 없다?)

TCP는 다음과 같은 특성을 갖는다.

  • Connection Oriented
  • Reliability in delivery of messages(Reliability is must)
  • Splitting messages into datagrams
  • Keep track of order(or sequence)
  • Use checksums for detecting errors

UDP는 다음과 같은 특성을 갖는다

  • Connectionless
  • No attempt for fragment messages
  • No reassembly and synchronization
  • In case of error, message is retransmitted
  • No acknowlegement

위 내용은 아래 URL을 참고 하였다.

http://www.laynetworks.com/comparative%20analysis_tcp%20vs%20udp.htm

6. Server Process

이제 코드 레벨에서 Network Programming을 위한 Process를 살펴보도록 하자.

TCP/UDP를 처리 하기 위한 Server Process는 아래의 첨부한 그림과 같다.

Image

첨부한 이미지와 같이 Server에서 TCP/UDP 처리를 위한 프로세스는 아래의 순서를 유지한다.

MSDN의 Synchronous Server Socket Example을 참고 하였다.

  1. socket : TCP 또는 UDP ProtocolType과 Stream(for TCP)또는 Dgram(for UDP) SocketType을 파라미터로 Socket을 생성해준다. Socket 생성과 관련된 도큐먼트는 MSDN을 참고하면 보대 자세한 내용을 확인 할 수 있다. (Using Client Sockets

    // Create a TCP/IP socket.
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  2. bind :  Local End-Point을 소켓에 연결한다.
    // Bind the socket to the local endpoint
    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress,11000);
    listener.Bind(localEndPoint);
  3. listen : Incomming Connection을 위해 기다린다.
    listener.Listen(10);
  4. accept : 프로그램은 Incomming connection을 위하 대기를 중단한다.
    Socket handler = listener.Accept();
  5. Get a blocked client
  6. read
  7. process request
  8. write

7. TCP Process with Server Process 

8. UDP Process with Server Process

I will develop TCP/UDP Client with Server Application.