-1 UDP에 대한 이해
UDP의 이해
1. IP를 기반으로 데이터를 전송한다. : TCP는 IP 기반으로 확인 과정을 거치나 UDP는 확인 과정을 거치지 않음. TCP는 확인 과정을 거쳐 속도는 떨어지나 안정적. UDP는 빠르나 안정적이지 않음
2. 흐름제어(flow control)을 하지 않기 때문에 데이터 전송을 보장 받지 못한다.
3. 연결설정 및 연결 종료 과정도 존재 않는다.
4. 연결상태가 존재하지 않는다.
UDP의 역할 ( UDP의 패킷 = Datagram )
1. Port 정보에 의한 Process의 구분
UDP 소켓이 전송하는 데이터의 기본 단위를 Dategram이라 한다.(일반적으로 UDP 패킷이라는 용어를 더 많이 쓰기도 한다.)
6-2 UDP 기반 서버 / 클라이언트의 구현
1. 일반적으로 연결 설정과정을 거치지 않는다.
- UDP 클라이언트와 서버는 연결 상태가 존재하지 않음. 즉 TCP 클라이언트와 서버처럼 데이터를 주고 받기 위해서 서로 연결을 설정하는 과정을 필요로 하지 않는다.
2. 데이터를 주고 받기 위한 소켓은 하나만 생성한다.
- TCP에서는 소켓의 관계가 1:1이었다. 즉 서버에 열 명의 클라이언트가 연결되어 있는 상황이라면 총 열 개의 소켓을 생성했을 것이다. 그러나 UDP 서버는 오로지 하나의 소켓만 있으면 된다. 대신에 UDP 서버는 클라이언트에 대한 주소 정보를 명시해 주어야 함.
3. UDP기반의 데이터 입 출력 함수
1. 데이터 전송 함수
<리눅스>
int sendto(int sock, const void* msg, int len, unsigned flags, const struct sockaddr * addr, int addrlen) |
const struct sockaddr * addr, int addrlen는 목적지 주소 정보를 나타내기 위해 필요하다.
<윈도우즈>
int sendto(SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen) |
2. 데이터 수신 함수
<리눅스>
int recvfrom( int sock, int* buf, int len, unsigned flags, struct sockaddr* addr, int * addrlen) |
struct sockaddr* addr : 데이터를 전송한 호스트의 주소(받은 데이터가 온 주소)
<윈도우즈>
int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR *from, int FAR* fromlen) |
6-3 데이터 경계가 존재하는 UDP소켓
1. UDP소켓은 데이터를 송수신하는데 필요한 함수 호출의 수를 정확히 일치 시켜야 한다.
( 클라이언트에서 세 번 보내면 서버는 세 번 읽어야 한다. )
6-4 connect 함수 호출을 통한 성능의 향상
UDP 소켓에서의 connect함수의 의미
1. TCP 소켓에서의 connect 함수의 의미
- IP와 Port의 할당.
- 연결 요청 진행(Three-way handshaking)
2. UDP 소켓에서의 connect함수의 의미
- IP와 Port의 할당.
참고: connect 함수 호출을 하지 않으면 IP와 Port는 언제 할당 되는가? UDP기반 클라이언트 소켓에 IP와 Port가 할당되는 시점은 sendto함수가 제일 처음 호출되는 시점이다. 한번 할당되면 프로그램이 종료될 때까지 변하지 않는다. bind()로 클라이언트에 IP와 Port할당 할 수도 있다.
3. TCP/UDP 소켓 공통적으로 지니는 connect함수의 의미
- 커널(운영체제)과 소켓의 연결 생성
일반적인 UDP클라이언트
1. connect함수를 호출하지 않는 UDP 클라이언트의 데이터 송수신
커널과 socket이 연결되어 있지 않다. sendto, recvfrom 호출 할 때만 연결된다.
송․수신을 빨리 할려면 커널과 socket을 연결 시켜 놔야 한다. → connect함수를 호출
UDP에서는 커널과 소켓을 지속적으로 연결시켜야 한다는 부담도 가지고 있음.
결론! connect 함수 호출이 주는 이점.
1. 데이터를 주고 받는 속도가 빨라진다.
2. TCP 소켓 기반의 데이터 입출력 함수를 그대로 사용 할 수 있다. 예) read(),write()
이렇게 TCP 소켓 기반의 데이터 입출력 함수를 사용한다고 해서 TCP 기반의 송수신을 g하는 것은 아님. 단순히 TCP 기반의 입출력 함수를 사용한다는 것임. connect 함수를 호출하여 UDP 기반으로 통신하는 것임.
'SYSTEM PROGRAMMING' 카테고리의 다른 글
리눅스 쉘 (0) | 2015.08.05 |
---|---|
리눅스 파일 시스템의 활용 (0) | 2015.08.05 |
서버 프로그래밍 (0) | 2015.08.05 |
리눅스 단축키 모음 (0) | 2015.08.05 |
리눅스 (0) | 2015.08.05 |