2015년 3월 16일 월요일

뇌자극 C# 5.0 - 21강

-네트워크 프로그래밍-

네트워크 프로그래밍은 전에 한번 열혈강의 시리즈로 공부한 적이 있다.
이 강에서는 파일 전송 프로그램을 하나 만드는 것으로 간단하게 기술하고 있다.

21.1 네트워크 프로그래밍에 앞서 알아둬야 할 기초


21.1.1 인터넷의 유래


네트워크 : 컴퓨터들이 상호 연결되어 있는 컴퓨터 통신 네트워크


21.1.2 TCP/IP 스택


컴퓨터끼리 네트워크에서 데이터를 주고받기 위해서는 
그 네트워크에서 통용되는 프로토콜을 따라야 한다
프로토콜은 규약, 규칙이라는 뜻의 낱말로 통신 규약을 뜻한다.

TCP/IP 는 사실상의 인터넷 표준 프로토콜이다.

TCP/IP 는 네 개의 계층으로 구성되어 있다.
(보통 7계층으로 설명하는데 여기선 4계층으로 설명한다….)

(1)   링크 계층
네트워크의 물리적인 연결 매체를 통해 패킷을 주고 받는 작업을 담당하는 부분
어떤 패킷이 네트워크를 통해 컴퓨터에 들어오면 물리적 데이터 전송에 사용되던 부분을 제거하고 인터넷 계층에 넘긴다.

(2)   인터넷 계층
패킷을 수신해야 할 상대의 주소를 지정하거나,
나가는 패킷에 대해서는 적절한 크기로 분할하고,
들어오는 패킷에 대해서는 재조립을 수행
이 계층에서 사용되는 규약이 IP .
IP는 패킷을 보내고 받기는 하지만 잘 가고 왔는지를 확인하지 않는다.
단지 인터넷 계층에서 주소를 지정하는 부분을 담당한다.

(3)   전송 계층
패킷의 운송을 담당하는 프로토콜들이 정의되어 있다.
TCP 는 전송 제어 프로토콜으로서 송신/수신간의 연결성을 제공하며, 신뢰성이 있는 패킷 전송 프로토콜이다.
TCP는 제대로 받고/보냈는지 확인하는 과정이 있어서 속도가 떨어지는 단점이 있다.
패킷이 빠르게 가야하고, 약간 손실되어도 크게 문제가 없는 경우에는
UDP를 사용한다.

(4)   애플리케이션 계층
각 응용프로그램의 나름의 프로토콜들이 정의되는 곳
웹 문서를 주고 받기 위한 HTTP, 파일 교환을 위한 FTP, 네트워크 관리를 위한 SNMP등이 애플리케이션 계층에서 정의된 프로토콜의 예다.

21.1.3 TCP/IP 주소 체계 : IP 주소


인터넷에서 패킷을 전달하려면 어디에서 보냈는지
어디로 보낼 것인지에 대한 정보가 필요하다.
이러한 정보를 “IP 주소라고 한다.

IP 주소체계는 부호 없는 8비트 정수 4개로 구성되어 있다.
8비트 정수는 0~255까지의 값을 가질 수 있으며
이 정수 네 개는 점(.)으로 연결하여 주소를 구성한다.

하지만 이 주소 체계도 전 세계적으로 쓰다보니 부족해졌다.
그래서 새로 생긴 주소 체계가 Iv6이다.
이 주소 체계는 128비트 길이의 주소 체계다.
IPv6 16비트의 수 8개를 콜론(:)으로 연결한다.

21.1.4 포트


큰 빌딩은 출입구가 여러 개 있듯이 같은 주소라도 입구가 여러 개인 경우가 많다.
IP 주소에도 출입문이 필요하다. 이 출입문을 포트(Port)라고 한다.

포트는 부호 없는 16비트 정수로써 0~65535 사이의 값을 이용한다.
보통 1~1024 까지는 전 세계적으로 합의된 값이 있는 포트를 사용함으로
개인적으로 사용할 것이면 이 값은 피하는 것이 좋다.

대표적인 포트 주소는 다음과 같다.

l  HTTP : 80
l  HTTPS : 443
l  FTP : 21
l  Telnet : 23
l  SMTP : 25
l  IRC : 194
l  IIOP : 535

21.1.5 TCP/IP 의 동작 과정


(1)   서버가 서비스를 시작, 클라이언트가 접속할 수 있도록 준비 하는 것
(2)   클라이언트는 서버에 접속을 시도 함
(3)   서버가 접속 시도를 수락하면 클라이언트와 데이터를 주고 받을 수 있게 됨
(4)   서버/클라이언트 간에 데이터 송/수신
(5)   클라이언트 접속 종료
(6)   서버 접속 종료

21. 2 TcpListener TcpClient


.NET 프레임워크가 TCP/IP 통신을 위해 제공하는 클래스다.
이 책에서는 Socket 클래스 대신 TcpListener / TcpClient 클래스를 이용한
네트워크 프로그래밍을 설명한다.
(Socket 클래스는 네트워크 프로그래밍 카테고리에 따로 적어뒀다)
서버와 클라이언트 각각이 갖고 있는 GetStream()이라는 메소드로 
NetworkStream 객체를 통해 데이터를 주고 받는다.

데이터를 보낼 때는 NetworkStream.Write( ),
데이터를 읽을 때는 NetworkStream.Read()를 호출한다.
서버/클라이언트 연결을 종료할 때는 Close() 메소드를 호출한다.

TcpListener / TcpClient 클래스의 주요 메소드

TcpListener 
-       -Start()  - 연결 요청 수신 대기를 시작한다.
-       -AcceptTcpClient() – 클라이언트의 연결 요청을 수락한다.
-       -Stop() – 연결 요청 수신 대기를 종료한다.

TcpClient
-       Connect() – 서버에 연결을 요청
-       Getstream() – 데이터를 주고 받는데 사용하는 매개체인 NetworkStream 을 가져옴
-       Close() – 연결을 닫는다.

21.3 흐르는 패킷


패킷을 요청한다고 바로 오는 것도 아니고 바로 가는 것도 아니다.
일정량의 버퍼에 담아놨다가 순차적으로 보낸다.
이유는 중간에 패킷이 손실되는 경우를 대비해서 일단은 버퍼에 저장해 놓았다가
손실되었을 경우에 재전송하기 위함이다.

21.3.1 프로토콜 설계와 네트워크 애플리케이션 프로그래밍 예제

TCP 네트워크 프로그래밍은 복잡하다.
내 컴퓨터에서 사용하던 객체를 바이트 스트림으로 바꿔 보내야 하고,
바이트 스트림으로 들어온 데이터를 다시 객체로 바꿔야 한다.

수신한 데이터가 정상인지도 검사해야 하고,
안정성을 위해 연결 상태도 수시로 점검해야 한다.

테스트를 할 때도 두 개의 프로그램을 띄워야 하고,
제대로 테스트 하려면 최소 두 대의 컴퓨터가 있어야 한다.
디버깅도 쉽지 않다.

이곳에 하나하나 기술하기에는 양도 너무 많고 이해하기도 힘들다.
역시 소스 코드를 다운 받아서 직접 실행해보는 것이 
가장 쉽게 터득하는 방법이 아닐까 싶다.

이 예제를 실행하려면 서버/클라이언트 프로그램을 각각 띄우고
자신의 컴퓨터의 IP와 상대 컴퓨터의 IP를 알아야 한다.


~ 드디어 뇌를 자극하는 C# 5.0 공부한 내용을 요약해서 블로그에 기재를 했다.
책으로 공부하고, 이곳에 요약하느라 또 한번 복습하게 되고
나중에 내가 필요하면 찾아보기도 위해서 이곳에 저장하는 것이다.
물론 다른 이들도 보면 좋겠지만 워낙 내 블로그는 접속하는 사람이 없으니
거의 다 나만 볼 것 같다 -_-;
당분간은 취업과 영어공부, 조직응용기사 실기에 집중 할 것이다.
그리고 만약 이곳에 기재를 한다면 디자인 패턴을 공부해 볼 생각이다.
그 다음은 리팩토리….;;
그 이후에는 작년에 사놓고 얼마 해보지도 못한 아두이노를 가지고 
이것저것 만들어 볼 예정이다.
회사를 다닌다고 해도 내 개인 프로젝트와 공부는 꾸준히 할 것이다.

요즘 허리가 많이 아퍼서 공부하는 것이 많이 느려졌지만 
꾸준한 노력만이 이 업계에서 살아 남는 길이라 생각한다.

댓글 없음:

댓글 쓰기