[F-Lab 모각코 챌린지 25일차] 소켓 통신 Socket

Nami·2023년 6월 25일
0

66일 포스팅 챌린지

목록 보기
25/66

소켓 Socket

정의

논리적인 의미로 컴퓨터 네트워크를 경유하는 프로세스 간 통신(Inter-Process Communication, IPC)의 종착점(End-point)

  • 네트워크를 이용해 데이터를 송수신하고 싶은 프로그램들은 소켓을 거쳐야 함.
  • 네트워크 상에서 돌아가는 두 개의 프로그램간 양방향 통신의 하나의 엔드 포인트.
  • 포트 번호에 바인딩되어 TCP 레이어에서 데이터가 전달되어야하는 애플리케이션을 식별할 수 있게 함.
  • 소켓 통신은 컴퓨터 네트워크에서 프로세스 간에 데이터를 교환하기 위한 일반적인 방법 중 하나
  • 네트워크 통신을 위한 소프트웨어적인 개념
  • 컴퓨터 네트워크에서 데이터를 주고받기 위한 인터페이스를 제공하는 방식, 소켓을 통해 데이터를 주고받는 프로세스 간의 통신이 이루어짐
  • 네트워크에서 이름 및 주소를 지정할 수 있는 통신 연결점(종료점)
  • 두 프로그램이 네트워크를 통해 서로 통신을 수행할 수 있도록 양쪽에 생성되는 링크의 단자
  • 두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있다.
  • 소켓이 구현됨으로써 네트워크 및 전송 계층의 캡슐화가 가능해짐.
  • 일반적으로 소켓은 네트워크 프로그래밍에서 사용되는 API를 통해 접근이 됨. 개발자는 소켓 API를 사용하여 네트워크 연결을 설정하고 데이터를 송수신할 수 있음.
  • 운영체제의 네트워크 스택에서 관리되는 객체.

5-Tuple

통신을 통해 전달되는 모든 데이터 포맷은 5-Tuple이라는 규격에 맞추어 흐르게 된다.

  1. 프로토콜(Protocol)
  2. 호스트 IP 주소(Source IP Address)
  3. 호스트 port 번호 (Source Port Number)
  4. 목적지 IP 주소 (Destination IP Address)
  5. 목적지 port 번호 (Destination Port Number)

소켓 또한 위 정보들인 프로토콜, IP 주소, port 번호가 있어야 정의된다.
먼저 보통 소켓은 인터넷 소켓이며 전송 계층 위에서 동작하므로 프로토콜은 TCP/UDP가 된다. 프로토콜이 정의되면 네트워크 상에서 데이터를 송수신할 수 있는 방법, 규칙이 정의된 것.

1개의 프로세스는 1개 이상의 소켓을 사용할 수 있다. 따라서 호스트 내의 프로세스 1개로 여러 개의 소켓을 열어 다수의 호스트들과 통신도 각능하다. 소켓들은 소켓 번호로 식별한다.

특징

  • Server-Client 구조
    TCP/UDP 위에서 동작하므로 당연하게 Server-Client 통신 구조를 갖춘다.
    처음에 데이터를 보내는 쪽이 클라이언트가 되고 받는 쪽이 서버가 된다. 이후에는 서로가 데이터를 송수신할 수 있다.

  • 양방향 통신
    Socket은 한 쪽에서 데이터를 보내고 반대 편에서 이를 수신한 뒤 연결이 끊어지는게 아니라 양 쪽에서 실시간으로 데이터를 송수신할 수 있다. 따라서 실시간 스트리밍이나 채팅에 주로 유용하게 사용된다.

  • 프로그래밍 언어나 운영체제에 종속적
    Socket은 TCP/IP 표준이 아니라 네트워크 프로그래밍 인터페이스다. 따라서 운영체제마다 약간씩 다르며, 그 안에서 또 프로그래밍 언어마다 소켓 API를 구현한 라이브러리가 다 다르다.

종류 및 통신 흐름

Stream Sockets - TCP (Transmission Control Protocol)

  • TCP를 사용하므로 연결 지향형(Connection-oriented) 소켓
  • 신뢰성을 보장한다
  • 데이터가 순서대로 송수신된다
  • 점대점(Point-to-Point) 연결

Server
1. socket(): 소켓 생성(TCP는 Stream)

  • 이 함수는 소켓의 파일 디스크립터(정수형 값)를 반환함

2. bind(): 주소 바인딩, 사용할 IP addreess 등록
3. listen(): 연결 대기, 연결되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)

Client
1. socket(): 소켓 생성(TCP는 Stream)
2. connect(): 연결 요청, Client에서 Server와 연결하기 위해 소켓과 목적지 IP address, Port number 지정 (Block 상태)

Server

  • accept(): 연결 수락, client의 요청 수락 후 실질적인 소켓 연결 ➡️ 통신을 위한 새로운 소켓 생성

처음 만들어진 (bind()listen()한)/ 소켓은 그 이후로도 새로운 Client의 요청을 대기하기 위해 쓰임.

Server-Client

  • send(), recv(): 데이터 송수신, Client는 처음에 생성한 소켓으로, Server는 새로 반환(생성)된 소켓으로 client와 Server간에 데이터 송수신
  • close(): 연결 종료, 소켓을 닫음

Datagram Sockets - UDP(User Datagram Protocol)

  • UDP를 사용하므로 비연결형(Connectionless) 소켓
  • 신뢰성을 보장할 수 없다.
  • 데이터가 순서대로 송수신될 지 보장할 수 없다
  • 점대점 연결 뿐만 아니라 일대다도 가능

connect()과정이 필요 없기 때문에 소켓을 생성한 후 바로 데이터 전송, 일대다 통신에 많이 쓰임.


참조 ✅

0개의 댓글