UDP는 데이터의 경계가 존재하는 프로토콜

→입력함수의 호출 횟수와 출력함수의 호출 횟수가 완벽히 일치해야 송신된 데이터 전부를 수신 가능

→데이터 수신에 딜레이를 주더라도 TCP와 달리 한 번에 하나씩 읽어들임

 

Connected UDP 소켓

  • UDP 소켓은 TCP와 달리 연결이 없음

데이터 전송(sendto)의 단계

  • UDP 소켓에 목적지의 IP와 PORT 번호 등록
  • 데이터 전송
  • UDP 소켓에 등록된 목적지 정보 삭제

 

위와 같이 목적지의 정보가 등록되어 있지 않은 소켓을 unconnected 소켓이라 함

→같은 목적지로 데이터를 3번 여러 번 보낼 때 목적지 정보의 등록과 삭제를 3번 반복하니 비효율적

→Connected 소켓으로 만들면 성능 향상을 기대할 수 있음

 

UDP에서 connect는 TCP와 같이 상대방과의 연결은 아니지만 소켓에 목적지 정보를 등록

→송수신의 대상이 정해졌기 때문에 sendto, recvfrom이 아닌 write, read를 통해 데이터 송수신 가능

UDP에서 서버와 클라이언트는 연결되어 있지 않음

  • UDP 서버, 클라이언트는 TCP와 같이 연결된 상태로 데이터를 송수신하지 않음
    →연결 설정 과정이 필요치 않음
  • 하나의 소켓으로 둘 이상의 호스트와 통신이 가능

 

UDP 기반의 데이터 입출력 함수

  • TCP와 달리 데이터를 전송할 때마다 목적지의 주소정보를 추가해야함

 

sendto

ssize_t sendto(int sock, void *buff, size_t nbytes, int flags,
			   struct sockaddr *to, socklen_t addrlen);
// 성공 시 전송된 바이트 수, 실패 시 -1 리턴
  • to: 목적지 주소정보를 담은 구조체 변수
  • addrlen: 매개변수 to로 전달된 주소 값의 구조체 변수 크기

 

recvfrom

ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags,
                 struct sockaddr *from, socklen_t *addrlen);
// 성공 시 수신한 바이트 수, 실패 시 -1 리턴
  • from: 발신지 주소정보를 담은 구조체 변수
  • addr: from으로 전달된 구조체 변수의 크기

 

UDP 소켓의 특성

  • 신뢰할 수 없는 전송방법
  • 신뢰성보다 속도가 중요할 시 사용
  • TCP보다 간결하며 상황에 따라 TCP보다 좋은 성능을 내기도 함
  • TCP의 신뢰성 있는 데이터 통신을 위한 흐름제어가 UDP에서는 존재하지 않음
    →확인 응답 과정 없음
    →연결 설정과 연결 해제 과정 같은 것이 업음

 

UDP의 내부 동작원리

  • UDP 패킷이 호스트B에서 A로 전달되도록 하는 것은 IP의 역할
  • 수신된 패킷을 PORT 정보를 참조하여 UDP 소켓에 전달하는 것은 UDP의 역할

 

UDP의 효율적 사용

  • 일부가 손실되어도 크게 문제가 생기지 않는 데이터의 전송
  • 송수신하는 데이터의 양은 적지만 잦은 연결이 필요한 경우
  • 멀티미디어 데이터, 게임에서의 방향키 입력 등

TCP 소켓의 입출력 버퍼

TCP 소켓의 데이터 송수신에는 경계가 없음

서버가 한 번의 write 함수 호출로 40바이트를 전송해도 클라이언트는 네 번의 read 함수 호출로 10바이트씩 받는게 가능

→ 그럼 클라이언트가 10바이트를 먼저 수신했다면, 나머지는 어디서 대기?

→ write나 read 함수 호출 시 즉시 데이터가 전송되거나 수신되는 것이 아닌 write 함수 호출 시 데이터가 출력 버퍼로 이동하고, read 함수 호출 시 입력버퍼에 저장된 데이터를 읽음

 

TCP 소켓의 입출력 버퍼의 특성

  • TCP 소켓 각각에 대해 별도로 존재
  • 입출력 버퍼는 소켓생성시 자동 생성
  • 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송
  • 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸

 

 

TCP의 내부 동작 원리

  • 상대 소켓과의 연결
  • 접속을 요청하는 쪽에서 SYN(Synchronization) 신호 패킷을 보냄
  • Server에서는 SYN, ACK 신호를 클라이언트 쪽으로 보냄
  • 클라이언트에서 다시 ACK 신호를 보냄으로써 연결이 이루어짐
  • SEQ(Sequence Number)는 패킷 번호
  • 받은 쪽은 다음에 요청할 패킷 번호를 ACK Number를 통해 전달

 

상대 소켓과의 데이터 송수신

  • 연결 후 데이터를 송수신
  • 데이터를 보낸 패킷에 대해 ACK Number를 Sequence Number + 전송된 바이트 크기 + 1로 받음
  • 전송된 바이트 크기를 포함해서 받음으로써 데이터의 손실 유무 확인
  • 패킷 전송 시 타이머가 작동해서 일정 시간 안에 ACK 메세지가 오지 않을 경우 재전송

 

상대 소켓과의 연결 종료

  • 4단계에 걸쳐서 연결 종료
  • 양쪽 모두 정상적 종료를 위해 FIN 신호를 주고 받음

Chapter 4의 에코 클라이언트에는 문제가 있음

TCP는 데이터의 경계가 없어 전송 시 나눠서 전송 되어도 문제가 발생하지 않음

에코 클라이언트는 문장 단위로 데이터를 송수신하기에 데이터의 경계의 구분이 필요

→ write한 데이터의 크기만큼 데이터가 들어올 때까지 클라이언트는 read를 반복해서 호출하는 것으로 해결

...
str_len = write(sock, message, strlen(message));

recv_len = 0;

while(recv_len < str_len) {
	recv_cnt = read(sock, &message[recv_len], BUF_SIZE - 1);
    if(recv_cnt == -1)
    	error_handling("read() error!");
    recv_len += recv_cnt;
}

message[recv_len] = 0;
printf("Message From Server: %s", message);
...

 

Iterative 서버

  • 한 순간에 하나의 클라이언트에게만 서비스를 제공할 수 있는 서버
  • 접속한 클라이언트의 소켓을 close 한 후에 accept해서 다른 클라이언트와 연결해 데이터를 송수신하는 구조
  • 단일 스레드로 작동하며 비교적 단순함

 

Iterative 에코 서버, 에코 클라이언트

 

에코 서버

  • 클라이언트가 보낸 데이터를 그대로 재전송(에코)하는 서버

프로그램의 동작 방식

  • 서버는 한순간에 하나의 클라이언트와 연결되어 에코 서비스를 제공
  • 서버는 총 다섯 개의 클라이언트에게 순차적으로 서비스를 제공하고 종료
  • 클라이언트는 프로그램 사용자로부터 문자열 데이터를 입력받아서 서버에 전송
  • 서버는 전송 받은 문자열 데이터를 클라이언트에게 재전송한다. 즉, echo 시킴
  • 서버와 클라이언트간의 문자열 에코는 클라이언트가 Q를 입력할 때까지 계속

 

 

TCP 서버에서의 기본적인 함수 호출 순서

 

listen 함수

#include <sys/socket.h>
int listen(int sock, int backlog);	//성공 시 0, 실패 시 -1 리턴
  • 소켓을 연결 요청 대기 상태로 변경
  • sock: 연결 요청 대기 상태에 두고자 하는 소켓의 파일 디스크립터 전달
  • backlog: 연결 요청 대기 큐의 크기 정보 전달

 

accept 함수

#include <sys/socket.h>
int accept(int sock, struct sockaddr * addr, socklen_t * addrlen);
//성공 시 생성된 소켓의 파일 디스크립터, 실패 시 -1 리턴
  • 연결 요청 대기 큐에서 대기 중인 클라이언트의 연결 요청 수락
  • sock: 서버 소켓의 파일 디스크립터 전달
  • addr: 연결 요청 한 클라이언트의 주소 정보를 담을 변수의 주소 값 전달
  • addrlen: 두 번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달

 

connect 함수

#include <sys/socket.h>
int connect(int sock, struct sockaddr * servaddr, socklen_t addrlen);
//성공 시 0, 실패 시 -1 리턴
  • 서버의 연결 요청 대기 큐에 연결 요청 정보 전달
  • sock: 클라이언트 소켓의 파일 디스크립터 전달
  • servaddr: 연결 요청 할 서버의 주소 정보를 담은 변수의 주소 값 전달
  • addrlen: servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달

TCP(Transmission Control Protocol)

  • 연결 지향
  • 스트림 기반 소켓

TCP/IP 프로토콜 스택

  • 인터넷을 통한 효율적인 데이터 송수신을 목적으로 설계된 계층구조
  • 데이터 송수신 과정을 네 개의 영역으로 계층화

 

TCP 프로토콜 스택&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UDP 프로토콜 스택

 

LINK 계층

  • 물리적인 영역의 표준화
  • LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역

IP 계층

  • 데이터 전송 경로 설정과 관련된 계층
  • IP 자체는 비 연결지향적이며 신뢰할 수 없는 프로토콜

TCP/UDP 계층

  • 데이터의 실제 송수신 담당 > 전송 계층이라고도 함
  • TCP는 데이터 송수신 시 확인을 함으로써 신뢰성을 보장할 수 있는 프로토콜
  • UDP는 확인을 하지 않아 신뢰성 보장 X

APPLICATION 계층

  • 소켓을 기반으로 만들어지는 프로토콜

 

 

+ Recent posts