[Network 09. 28]05. Chapter5 UDP
2010. 9. 28. 11:08ㆍNetwork
반응형
UDP의 개념
UDP(User Datagram Protocol )란?? 사용자 데이터 그램 프로토콜의 줄임말로써 정보를 보낸다 받았다 라는 신호절차를 거치지 않고 그냥 일방적으로 보내면 받고 하는 통신 방식으로 이러한 서비스를 무관계서비스라고 하며 이 무관계서비스의 통신규약을 UDP라고 한다.
따라서 UDP는 TCP와 달리 데이터의 수신에 대한 책임을 지지 않으므로 안정성 측면에서는 UDP가 TCP에 비해 안성성은 떨지지만 확인하는 부분이 없으므로 바이트를 줄일 수 있고 그로 인해 얻을 수 있는 이점으로 데이터가 빨리 전송할 수 있다는 장점이 생긴다.
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주소 문자열과 포트번호를 인자로 가짐 |
디폴트 원격 호스트??
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 |