개발일지/TIL(Today I Learned)

2025-01-02 <응용 계층에 대하여(1)>

프린스 알리 2025. 1. 2.

내일배움캠프 Node.js 트랙 46일차

소켓 프로그래밍

소켓이란?

소켓은 애플리케이션과 네트워크 사이의 인터페이스(연결부) 역할을 한다.(인터페이스: 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 접점이나 경계면) 애플리케이션은 소켓을 생성하고, 소켓의 타입에 의해 소통 방식이 결정된다.(reliable vs. best effort / connection-oriented vs. connectionless)

 

처음 소켓이 설정되면, 애플리케이션은 네트워크 통신을 위해 데이터를 소켓으로 통과시킬 수 있게 된다. 이런 과정을 거쳐, 다른 호스트가 보낸 데이터를 소켓을 통해 전달 받게 되는 것이다.

 

(여담 : 애플리케이션 계층에서 소켓 통신을 하는 이유는 전송 계층의 프로토콜에 따라야 하기 때문이다.)

소켓의 종류

소켓에는 두 가지 중요한(Essential) 타입이 존재한다. 그 유명한 TCP와 UDP이다.

(1) SOCK_STREAM(소켓 스트림) => TCP

  • reliable delivery
  • 순서 보장
  • 연결 지향성
  • 양방향 통신

(2) SOCK_DGRAM(소켓 데이터그램) => UDP

  • unreliable delivery
  • 순서 보장하지 않음
  • 연결에 대한 개념이 존재하지 않음(애플리케이션은 각 데이터그램마다 도착지 정보를 가르쳐줄 뿐)
  • 송수신이 가능하지만 독립적인 데이터그램 단위에서 이루어진다.(연결이 이루어지는 TCP의 양방향 통신과는 조금 다름)

소켓 API 실행 흐름

(출처 : KOCW <컴퓨터 네트워크> 강의를 들으면서 강의 내용을 figma로 제작하였습니다.)

소켓 생성(C 언어 기반)

  1. Include file <sys/socket.h>
    • 소켓 프로그래밍에 필요한 헤더 파일 <sys/socket.h>를 포함해야 한다.
  2. Create a socket (소켓 생성)
    • 소켓을 생성하는 함수의 형태: int socket(int domain, int type, int protocol);
      • domain: 주소 체계(예: IPv4를 위한 AF_INET).
      • type: 소켓 타입(예: SOCK_STREAM은 TCP, SOCK_DGRAM은 UDP).
      • protocol: 사용하고자 하는 프로토콜(일반적으로 0으로 설정하여 기본 프로토콜 사용).
    • 반환값: 파일 디스크립터(file descriptor) 또는 실패 시 -1 반환.
  3. Bind a socket (소켓 바인딩)
    • 소켓 바인딩 함수: int bind(int sockfd, struct sockaddr* myaddr, int addrlen);
      • sockfd: 소켓 파일 디스크립터.
      • myaddr: 바인딩할 IP 주소와 포트를 포함하는 구조체.
      • addrlen: 주소 구조체의 크기.
    • 소켓을 로컬 IP 주소와 포트 번호에 바인딩한다.
  4. Put socket into passive state (소켓을 수동 상태로 설정)
    • 함수: int listen(int sockfd, int backlog);
      • sockfd: 소켓 파일 디스크립터.
      • backlog: 대기열에 저장할 최대 연결 요청 수.
    • 소켓을 수동 대기 상태로 설정하여 연결 요청을 수신할 준비를 한다.
  5. Accept connections (연결 수락)
    • 함수: int accept(int sockfd, struct sockaddr* cliaddr, int* addrlen);
      • sockfd: 소켓 파일 디스크립터.
      • cliaddr: 클라이언트의 주소 정보를 저장하는 구조체.
      • addrlen: 주소 구조체의 크기를 나타내는 포인터.
    • 클라이언트 연결 요청을 수락하며, 새로운 파일 디스크립터를 반환하거나 실패 시 -1을 반환한다.

=> 소켓 연결 수립은 다음 게시글에서 계속…

'개발일지 > TIL(Today I Learned)' 카테고리의 다른 글

2025-01-06 <프로토콜 버퍼를 이용한 TCP 서버 통신>  (1) 2025.01.06
2025-01-03  (0) 2025.01.03
2024-12-31  (0) 2024.12.31
2024-12-30  (0) 2024.12.30
2024-12-27  (1) 2024.12.27

댓글