TIL - 소켓, 파일 서술자

손찬호·2024년 5월 4일
0

TIL

목록 보기
18/21

소켓 Socket

소켓 socket의 사전적 의미는
"An opening or a cavity into which an inserted part is designed to fit"로
"번역하자면 무언갈 끼울 수 있도록 설계된 구멍"을 뜻한다.

컴퓨터 네트워크에서 소켓(socket)은 두 프로그램이 네트워크를 통해 데이터를 끼우고 주고받을 수 있게 해주는 네트워크 프로그래밍 인터페이스이다.
네트워크를 통해 주고 받는다고 해서 네트워크 소켓(Network Socket)
인터넷을 통해 주고 받으면 인터넷 소켓(Internet Socket)이라고도 한다.

네트워크 통신은 TCP/IP 계층 (OSI 7 계층)의 협력을 통해 이루어지며
그 중 소켓은 전송 계층 (Transport Layer)와 응용 계층 (Application Layer) 사이에 있는 인터페이스이다.

소켓의 구성요소

소켓은 크게 프로토콜, IP 주소, 포트 번호로 구성되어있다.
그 중에서 인터넷 소켓은 좀 더 세분화해서 구성되어있다.

  • 인터넷 프로토콜 (TCP, UDP, raw IP):
    어떤 프로토콜에 따라서 통신을 할 지
  • 로컬 IP 주소:
    소켓을 보내는 IP 주소
  • 로컬 포트:
    소켓을 보내는 포트
  • 원격 IP 주소:
    소켓을 받는 IP 주소
  • 원격 포트:
    소켓을 받는 포트

소켓의 종류

인터넷 소켓은 용도와 통신 방식에 맞춰 여러가지 유형이 있다. 이 유형들에 대해서 알아보자.

데이터그램 소켓(Datagram sockets):

비 연결 지향형 소켓으로 UDP 방식으로 통신할 때 사용된다.

Datagram: "a self-contained unit of data transmitted in a packet-switched network"
즉 datagram은 패킷으로 전송하는 데이터의 하나의 독립적인 단위를 뜻한다.

IP Datagram:
인터넷 프로토콜(IP)에서 사용되는 기본적인 데이터 단위.
IP Datagram은 출발지와 목적지 주소 정보를 포함하며, 네트워크 계층에서 데이터를 전송하는 데 사용된다.

ICMP (Internet Control Message Protocol):
에러 메시지나 네트워크 쿼리와 같은 제어 정보를 전달하는 데 사용되는 프로토콜로
IP 네트워크 계층에서 사용한다.

UDP: User Datagram Protocol
user datagram은 사용자 데이터를 포함하는 패킷을 의미한다.
UDP는 연결없이 user datagram를 데이터 단위로 하는 패킷을 보내면서 통신을 한다.
연결하지 않고 패킷을 보내기 때문에 각 패킷은 독립적으로 전송되고 이 과정에서
패킷들 사이에서 순서가 바뀌거나 일부 손실이 될 수 있다.
그럼에도 실시간 응답이 중요한 애플리케이션에서는 긴 네트워크 지연 시간보다 빠른 데이터 전송이
더 중요하기 때문에 데이터 일부 유실을 감수하면서도 UDP 통신을 사용하기도 합니다.

스트림 소켓(Stream sockets):

stream의 사전적 의미는 "흐름"이다. 흐름은 연결되어있고 순서가 존재한다.
stream sockets은 연결 지향형 소켓으로, 전송 제어 프로토콜(TCP)로 통신할 때 사용된다.
스트림 소켓은 순차적인 오류 없는 데이터 전송이 가능하며
연결 생성 및 파괴와 오류 보고를 위한 기능도 갖추고 있다.

RAW 소켓(Raw sockets):

IP 패킷을 직접 송수신하는 소켓이다.
payload는 선택된 전송 계층 프로토콜(TCP, UDP 등)에 따라 자동으로 캡슐화되고
소켓 사용자는 프로토콜 헤더의 존재를 인식하지 못한다.
raw 소켓에서 패킷을 전송할 때, 헤더의 자동 추가는 선택적이다.
주로 보안 관련 애플리케이션(예: Nmap)에서 사용된다.

Raw socket은 네트워크 계층에서 직접 데이터를 송수신할 수 있는 소켓이다.
즉, 전송 계층(TCP/UDP)을 거치지 않고 IP 계층의 데이터를 직접 처리할 수 있다.
이를 통해 사용자가 직접 IP 패킷을 구성하고, ICMP(Internet Control Message Protocol)나
다른 프로토콜 패킷을 송수신할 수 있다.
네트워크 프로토콜의 동작을 분석하거나, 사용자 정의 프로토콜을 구현하는 등의 고급 네트워킹 작업에 주로 사용된다.

소켓 통신과정

소켓 (socket, bind, listen, accept, connect, close)

socket:네트워크 통신에서 데이터를 끼워서 보내는 우편함
bind: 우리집 우편함에 주소를 부여하는 것이다. 컴퓨터에서 포트 번호를 특정 소켓에 bind해서 외부에서 해당 소켓을 찾을 수 있도록 한다.
listen: 우편함이 편지를 받을 준비가 되었음을 의미한다. 컴퓨터에서는 서버 소켓이 클라이언트 소켓의 연결 요청을 기다리는 중이라고 보면 된다.
accept: 편지가 도착하면 우편함에서 편지를 꺼내 읽는 것을 의미한다.
서버 컴퓨터는 연결 요청을 받아들여서 클라이언트와의 통신을 시작할 준비를 한다.
connect: 다른 집에서 우리집 우편함 주소로 편지를 보내는 과정을 의미한다.
네트워킹에서는 클라이언트에서 서버 주소로 데이터를 보내기 위해 연결을 시도하는 것을 말합니다.
close: 우리집 우편함을 닫아서 더 이상 편지를 받지 않겠다고 결정하는 것처럼
연결이 끝내고 소켓을 닫습니다. 더 이상 데이터를 주고받지 않겠다는 의미입니다.

파일 서술자 File Descriptor


0,1,2번은 표준 입력,출력,오류를 뜻하고
3번 이후가 운영체제가 설정한 파일 고유의 서술자를 의미한다.

파일(File)은 입출력의 추상화다.
입출력에는 주기억장치와 보조기억장치에 저장된 데이터 CRUD뿐만 아니라
프로그램 실행 중에 사용자에게 받는 입력과 계산 결과를 출력하는 것도 포함된다.
예를 들어 모니터에 그래픽을 출력하는 것도 파일이다.

파일 서술자(file descriptor)는 유닉스 계열 운영 체제에서
프로세스가 파일이나 다른 입출력 자원을 다룰 때 사용하는 추상적인 인덱스 값을 말한다.
이 인덱스는 일반적으로 0이 아닌 정수값을 갖는다.
프로세스가 파일이나 자원을 열 때마다 운영 체제는 각 자원을 대표하는 고유한 파일 서술자를 할당하며 자원을 관리한다. 고유 번호를 통해 프로그램은 읽기(read), 쓰기(write), 닫기(close)와 같은 다양한 입출력 작업을 해당 자원에 대해 수행할 수 있다.

기본적으로, 모든 유닉스 프로세스는 세 가지 기본 파일 서술자를 가지고 있다.
0: 표준 입력(Standard Input, stdin)
1: 표준 출력(Standard Output, stdout)
2: 표준 오류(Standard Error, stderr)
이들은 각각 키보드로부터의 입력, 화면으로의 출력, 오류 메시지 출력을 위해 사전에 정의된 파일 서술자로 프로세스가 추가적으로 파일이나 다른 자원을 열 때, 3부터 시작하는 고유 번호가 할당됩니다.파일 서술자는 리소스 관리의 중요한 부분으로, 프로그램이 시스템 자원을 효율적으로 사용하고 해제할 수 있도록 돕는다.

profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보