[Network 09. 28]05. Chapter5 UDP

2010. 9. 28. 11:08Network


UDP의 개념


UDP(User Datagram Protocol )란?? 사용자 데이터 그램 프로토콜의 줄임말로써 정보를 보낸다 받았다 라는 신호절차를 거치지 않고 그냥 일방적으로 보내면 받고 하는 통신 방식으로 이러한 서비스를 무관계서비스라고 하며 이 무관계서비스의 통신규약을 UDP라고 한다.
따라서 UDP는 TCP와 달리 데이터의 수신에 대한 책임을 지지 않으므로 안정성 측면에서는 UDP가 TCP에 비해 안성성은 떨지지만 확인하는 부분이 없으므로 바이트를 줄일 수 있고 그로 인해 얻을 수 있는 이점으로 데이터가 빨리 전송할 수 있다는 장점이 생긴다.

송신측 포트번호는 선택사항이며 제공하는 유일한 신뢰성은 checksum이 있다.

TCP와 UDP의 차이점
 UDP TCP 
 접속 성립이 요구되지 않음  접속성립이 요구됨 
 데이터가 순서대로 도착하지 않음  데이터가 순서대로 도착함 
 낮은 신뢰성, Best-effort  높은 신뢰성 
 Datagram  Stream 
 브로드캐스트와 멀티캐스트 지원  유니캐스트만 지원 

UDP의 흐름
서버
소켓 생성->포트바인딩->포트바인딩 후 접속 요청에 대한 리스닝 과정 없이 즉시 데이터 전송 가능
데이터 송수신은 TCP와 차이가 없음

클라이언트
서버에 접속할 필요가 없음
소켓 생성 후 즉시 데이터 전송가능
서버와는 달리 포트 바인딩을 하지 않음

Net프레임워크에서는 UDP소켓을 이용하여 통신을 하기 위해 UdpClient클래스만을 가짐 UDPClient클래스을  이용하여 UDP 프로그램 구션 가능

UDP서버 프로세스의 흐름
UDP클라이언트 프로세서 흐름

UDPClient 클래스

포트바인딩이 없는 생성자
 public UdpClient()  IP4 주소지정 스키마를 포함한 객체를 생성 
 public UdpClient(AddressFamily)  IPv4외의 주소지정 스키마를 요구할 때에는 두번째 생성자 사용

포트 바인딩이 있는 생성자
 public UdpClient(int)   첫번째 생성자는 ipv4 주소지정 스키마를 가짐 
 public UdpClient(int, AddressFamily)  
 public UdpClient(IPEndPoint)  
 public UdpClient(string,int)  ip주소 문자열과 포트번호를 인자로 가짐
Ip주소는 디폴트 원격 호스트의 주소를 명시하는것으로 접속 성립을 위해 존재하는것이 아님

디폴트 원격 호스트??
Tcp의 접속 성립과는 다른 개념으로, 단지 데이터를 보내고자 하는 기본 호스트의 주소를 지정
UPD를 이용하여 특정 호스트에 계속 메시지를 보내고자 하는 경우, 이 디폴트 원격 호스트를 명시함으로써 따로 주소를 지정하지 않아도 디폴트 원격 호스트에 메시지를 보낼수 있다.
디폴트 원격 호스트는 생성자로 객체 생성시에 설정이 가능하며, Connect()메서드를 이용하여 설정 또는 변경이 가능하다.

UDP의 메소드
Connect메소드(접속)
 puclic void Connect(IPEndPoint)  
 puclic void Connect(IPAddress,int)  숫자로된 아이피 주소와 포트번호
 puclic void Connect(string,int)  문자열로된 아이피주소와 포트번호를 입력 

Send메소드(송신)
 public int Send(byte[],int)  byte와 int는 보낼 데이터와 길이
 public int Send(byte[],int,IPEndPoint)   
  public int Send(byte[],int,string,int)  

Receive(ref IPEndPoint) : 데이터 수신하게 되면 byte형태로 수신한다.

Socket클래스를 이용했을경우 다음과 같이 사용하면 된다.

데이터 송신
 public int SendTo(byte[], EndPoint)  
 public int SendTo(byte[], SocketFlags, EndPoint)  
 public int SendTo(byte[], int, SocketFlags, EndPoint)  
 public int SendTo(byte[], int, int, SocketFlags, EndPoint) 보낼데이터,시작위치, 데이터크기,소켓의동작을지정,원격호스트

데이터 수신
 public int ReceiveFrom(byte[], ref EndPoint)  
 public int ReceiveFrom(byte[],SocketFlags, ref Endpoint)  
 public int ReceiveFrom (byte[],int,SocketFlags, ref EndPoint)  
  public int ReceiveFrom(byte[], int, int, SocketFlags, ref Endpoint)  

브로드캐스팅
다수의 클라리언트에게 메시지를 전달 하는 방법으로 TCP에서는 가능하지 않다. 특수주소인 255.255.255.255 또는 IPAddress.Broadcast는 브로드캐스트 주소를 나타냄
IPv6에는 브로트캐스트 주소가 존재하지 않음
송신자와 같은 서브넷에 있는 수신자에만 브로드 캐스트 메시지가 전달됨
다음과 같이 서버쪽에서 작성하면 된다.. 단지 IPEndPoint에 IPAddress.Any 였던것을 IPAddress.Brocast로 바꿔주면 된다.
IPEndPoint endpoint=new IPEndPoint(IPAddress.Broadcast, 8888); 

멀티캐스팅
UDP에서만 가능 서브넷의 모든 호스트에게 메시지를 전달하는 브로트캐스트와 달리 멀티캐스트는 그룹에 가입된 호스트들에게만 메시지를 전달 하는 방식으로 메시지를 받기위해서는 멀티캐스트 그룹에 가입해야한다.
멀티캐스트 ipv4주소는 224.0.0.0~239.255.255.255이다.
여기서 잠깐...IPv4와 IPv6의 차이점!!
 구분  IPv4   IPv6 
 멀티캐스트 주소  224.0.0/4(D class)   FF00::/8
 브로드캐스트 주소  255.255.255.255 or 호스트주소의 모든 bit가 1인 경우  해당주소 없음
 미지정주소  0.0.0.0/32  ::/128
 루프백주소  127.0.0.1  ::1/128
 공인 IP주소  공인 IP주소  Global Unicast Address
 사설 IP주소  10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
 FEC0::/48
 링크 로컬 주소  169.254.0.0/16  FE80::/64

멀티캐스트 가입/탈퇴메소드

가입

 public void JoinMulticastGroup(IPAddress)  
 public void JoinMulticastGroup(int,IPAddress)   interface index, 멀티캐스트 그룹 IP주소
주소는 같은 링크에 있는 하드웨어를 식별하기 위해 사용한다.
  public void JoinMulticastGroup(IPAddress,int)  멀티캐스트 그룹 IP주소 ,TTL
 TTL(Time To Live)은 멀티캐스팅된 데이터그램에 허용되는 라우터 흡수를 의미, 데이터그램이 지정된 수를 넘어 라우터를 경우 한 경우에 폐기됨
  public void JoinMulticastGroup(IPAddress,IPAddress)  멀티캐스트구룹 IP주소 , 로컬 IP주소

실제 가입 코드

 UdpClient receiver=null; 
 IPEndPoint endpoint=null;
 IPAddress group=null; 
 
group=IPAddress.Parse("225.225.225.225");
endpoint=new IPEndPoint(IPAddress.Any,0);
receiver= new UdpClient(port);
receiver.JoinMulticastGroup(group);


탈퇴
 public void DropMulticastGrop(IPAddress)  
 public void DropMulticastGrop(IPAddress, int)   

실제 탈퇴 코드
 receiver.DropMulticastGroup(group);

마지막으로 UDP로 작성해보는 Echo프로그램이다.

1. 서버
첫째, 계속 해왔지만 using 으로 추가해준다.
 using System.Net.Sockets;

둘째, 객체를 생성해준다
 UdpClient client=new UdpClient(8888);
 IPEndPoint endpoint=new IPEndPoint(IPAddress.Any,0);

셋째, 받은 내용을 클라이언트에게 전송한다.
string msg="";
 do {
       byte[] buffer=client.Receiver(ref endpoint);
        message=Endcoding.Unicode.GetBytes(msg);
       client.Send(data,data.Length,endpoint);
}while(message.EqualsI("Exit"));

넷째, 닫는다.
 client.Close();

2. 클라이언트
UdpClient client= new UdpClient();
IPEndPoint endpoint= new IPEndPoint(IPAddress.Parse(127.0.0.1),8888);

다음은 기존의 프로그램과 별반 다를것이 없기 때문에 제외하겠습니다.

'Network' 카테고리의 다른 글

[Network] 닫기  (0) 2011.10.19
[Network 11. 03]07. 졸업시험정리  (0) 2010.11.03
[Network 09. 27]04. Chapter4 Mulit Threaded Socket  (0) 2010.09.27
[Network 09. 27]03. Chapter3 TCP  (0) 2010.09.26
[Network 09. 26]02. Chapter2 Socket  (0) 2010.09.26