[Socket] TCP기반 서버/클라이언트

TCP와 UDP에 대한 이해

TCP/IP 프로토콜 스택이란, 인터넷 기반의 데이터 송수신을 목적으로 설계된 스택이다. 큰 문제를 작게 나눠 계층화한 결과로, 각 스택 별 영역을 전문화하고 표준화한다.

Link계층 → IP계층 → (TCP계층 / UDP계층) → Application계층

으로 구성되어 있다.

 

Link 계층

  • 물리적 영역의 표준화 결과이다.
  • LAN, WAN, MAN과 같은 물리적인 네트워크 표준 관련 프로토콜이 정의되어 있다.

IP 계층

  • Internet Protocol을 의미한다.
  • 경로의 설정과 관련있는 프로토콜이다.

TCP/UDP 계층

  • 실제 데이터의 송수신과 관련된 계층이다(Transport Layer).
  • TCP : error control이 존재해 데이터의 전송을 보장하는 신뢰성이 있는 프로토콜. UDP에 비해 복잡.
  • UDP : error control이 없어 이를 보장하지 못하는 프로토콜

Application 계층

  • 응용프로그램의 프로토콜을 구성하는 계층이다.
  • 소켓을 기반으로 완성하는 프로토콜
  • 소켓을 생성하면, 아래의 Link, IP, TCP/UDP 계층에 대한 내용은 감춰진다.

 

TCP 서버/클라이언트의 구현

TCP Server

TCP서버의 기본적인 함수호출 순서는 다음과 같다.

 

listen()함수의 호출이 이루어지고 연결요청 가능 상태가 되면 클라이언트가 연결을 시도한다. listen함수와 accept함수 사이에서 서버와 클라이언트 사이에 3-way-handshaking이 일어난다. 

 

연결 요청 대기 상태로 진입하는 listen함수이다.

int listen(int sock, int backlog);
//성공 시 0, 실패 시 -1 return

 

  • sock : 연결요청 대기상태에 두고자 하는 소켓 파일 디스크립터. 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓이 된다.
  • backlog : 연결요청 대기 큐의 크기 정보를 전달. 동시처리 가능한 client의 수.

TCP Client

 

TCP 클라이언트의 기본적인 함수호출 순서는 다음과 같다.

 

connect함수 호출 후, 3-way-handshaking을 실행한다.

 

클라이언트의 경우, 소켓을 생성하고, 이 소켓을 대상으로 연결의 요청을 위해 connect()함수를 호출하는 것이 전부이다. connect함수를 호출할 때, 연결할 서버의 주소정보도 함께 전달된다.

int connect(int sock, const struct sockaddr* serv_addr, socklen_t addrlen);
//성공 시 생성된 소켓의 파일 디스크립터, 실패 시 -1 return

 

addrlen는 읽어오는 것이 아니라, 부여하는 것이다.