[TIL/크래프톤 정글9기] 53일차 (Week 08 키워드)

blueprint·2025년 7월 3일

크래프톤정글9기

목록 보기
44/55

네트워크 기초 정리

목차

  1. 네트워크 계층 (OSI 7 Layer, TCP/IP Layer)
  2. 클라이언트-서버 모델
  3. 소켓 (Socket)
  4. 파일 디스크립터
  5. Datagram Socket vs Stream Socket
  6. CGI / WebServer / MIME Type
  7. HTTP
  8. Proxy

네트워크 계층

OSI 7 Layer 모델

OSI (Open Systems Interconnection) 7계층 모델은 네트워크 통신의 표준 모델

계층이름역할예시
7Application Layer (응용 계층)사용자 인터페이스 제공HTTP, SMTP, FTP, DNS
6Presentation Layer (표현 계층)데이터 암호화, 압축, 변환SSL/TLS, JPEG, MPEG
5Session Layer (세션 계층)세션 관리 및 동기화NetBIOS, RPC
4Transport Layer (전송 계층)신뢰성 있는 데이터 전송TCP, UDP
3Network Layer (네트워크 계층)라우팅 및 패킷 포워딩IP, ICMP, ARP
2Data Link Layer (데이터 링크 계층)프레임 단위 전송Ethernet, PPP
1Physical Layer (물리 계층)비트 단위 전송케이블, 허브, 리피터

TCP/IP 4계층 모델

TCP/IP 모델은 실제 인터넷에서 사용되는 프로토콜 스택입니다.

계층이름OSI 대응역할
4Application Layer5-7계층응용 프로그램 간 통신
3Transport Layer4계층프로세스 간 통신
2Internet Layer3계층호스트 간 통신
1Network Access Layer1-2계층물리적 네트워크 접근

주요 프로토콜

  • TCP (Transmission Control Protocol): 연결 지향, 신뢰성 보장
  • UDP (User Datagram Protocol): 비연결형, 빠른 전송
  • IP (Internet Protocol): 주소 지정 및 라우팅
  • HTTP (HyperText Transfer Protocol): 웹 통신
  • DNS (Domain Name System): 도메인 이름 해석

클라이언트-서버 모델

개념

클라이언트-서버 모델은 네트워크 서비스를 제공하는 아키텍처 패턴

구성 요소

서버 (Server)

  • 역할: 서비스 제공
  • 특징:
    • 항상 실행 상태 (Always On)
    • 고정된 주소 (Fixed Address)
    • 여러 클라이언트 동시 처리

클라이언트 (Client)

  • 역할: 서비스 요청
  • 특징:
    • 필요시에만 통신
    • 동적 주소 가능
    • 서버와만 통신

동작 과정

  1. 서버 시작: 서버가 특정 포트에서 대기
  2. 클라이언트 요청: 클라이언트가 서버에 연결 요청
  3. 연결 수립: 서버가 요청을 수락하고 연결 수립
  4. 데이터 교환: 요청-응답 방식으로 데이터 교환
  5. 연결 종료: 통신 완료 후 연결 해제

장단점

장점

  • 중앙 집중식 관리
  • 보안 관리 용이
  • 데이터 일관성 유지
  • 확장성 (Scale-out 가능)

단점

  • 서버 장애 시 전체 서비스 중단
  • 서버 부하 집중
  • 네트워크 대역폭 제한

소켓

소켓의 개념

소켓(Socket)은 네트워크 통신의 끝점(endpoint)으로, 프로세스 간 통신을 위한 인터페이스

소켓 주소 구조

/* IPv4 전용 소켓 주소 구조체 */
struct sockaddr_in {
    uint16_t        sin_family;   /* 주소 체계 (항상 AF_INET) */
    uint16_t        sin_port;     /* 포트 번호 (네트워크 바이트 순서) */
    struct in_addr  sin_addr;     /* IP 주소 (네트워크 바이트 순서) */
    unsigned char   sin_zero[8];  /* 패딩 (struct sockaddr와 크기 맞추기용) */
};

/* 범용 소켓 주소 구조체 (connect, bind, accept 등에서 사용) */
struct sockaddr {
    uint16_t    sa_family;   /* 주소 체계 (AF_INET, AF_UNIX 등) */
    char        sa_data[14]; /* 주소 정보 (실제 내용은 구조체마다 다름) */
};

주요 소켓 함수

1. socket()

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
  • 역할: 소켓 생성
  • 매개변수:
    • domain: 주소 패밀리 (AF_INET, AF_INET6)
    • type: 소켓 타입 (SOCK_STREAM, SOCK_DGRAM)(TCP, UDP)
    • protocol: 프로토콜 (보통 0)

2. bind()

서버가 자신이 사용할 IP/포트 번호를 커널에 등록하는 함수

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 역할: 소켓에 주소 할당
  • 사용: 서버에서 특정 포트로 바인딩
  • sockfd: socket()으로 만든 디스크립터
  • addr: 서버가 사용할 주소 정보
  • addrlen: 그 주소 구조체 크기
    → 이 과정을 통해 커널은 "이 소켓은 이 IP/포트를 사용할 거야" 하고 기억

3. listen()

#include <sys/socket.h>

int listen(int sockfd, int backlog);
  • 역할: 연결 요청 대기 상태로 전환
  • 매개변수:
    • sockfd: 소켓 파일 디스크립터
    • backlog: 대기 큐 크기
  • sockfd: bind까지 끝낸 소켓
  • backlog: 커널이 대기열에 허용할 최대 요청 수

커널은 기본적으로 소켓을 클라이언트용(active)으로 생각하므로,
서버로 사용하려면 listen()으로 수동 대기(passive) 모드로 바꿔야 함.

→ 이후 클라이언트가 connect()로 연결 요청 시 대기열에 쌓임

4. accept()

#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 역할: 클라이언트 연결 수락
  • 반환값: 새로운 소켓 파일 디스크립터
  • listenfd: listen() 호출된 디스크립터
  • addr: 연결 요청을 보낸 클라이언트 주소가 담김
  • addrlen: 주소 크기

✅ 반환값: 새롭게 만들어진 통신용 소켓 (connfd)이 소켓은 클라이언트와 실제 통신을 하기 위해 사용

5. connect()

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 역할: 서버에 연결 요청
  • 사용: 클라이언트에서 서버 연결
  • clientfd: socket()이 반환한 디스크립터
  • addr: 서버 주소 정보 (보통 sockaddr_in 캐스팅해서 사용)
  • addrlen: 주소 구조체 크기
  • 성공 시 0 반환, 실패 시 -1 반환
  • Blocking(블로킹): 연결이 될 때까지 기다림

6. close()

#include <sys/socket.h>

int close(int fd);
  • 역할: 소켓 연결 종료
  • 중요: 양방향 통신 모두 종료

서버 소켓 생성 과정

// 1. 소켓 생성
int server_fd = socket(AF_INET, SOCK_STREAM, 0);

// 2. 주소 설정
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);

// 3. 바인딩
bind(server_fd, (struct sockaddr *)&address, sizeof(address));

// 4. 리스닝
listen(server_fd, 3);

// 5. 연결 수락
int client_fd = accept(server_fd, (struct sockaddr *)&address, &addrlen);

클라이언트 소켓 생성 과정

// 1. 소켓 생성
int sock = socket(AF_INET, SOCK_STREAM, 0);

// 2. 서버 주소 설정
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

// 3. 연결
connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

파일 디스크립터


개념

파일 디스크립터(File Descriptor)는 운영체제가 파일이나 소켓 등의 입출력 자원을 식별하기 위해 사용하는 정수값

특징

  • 정수형 식별자: 0부터 시작하는 음이 아닌 정수
  • 프로세스별 고유: 각 프로세스마다 독립적인 파일 디스크립터 테이블
  • 자동 할당: 사용 가능한 가장 작은 번호 할당
    • 파일 디스크립터는 리소스가 제한되어 있고,
    • 번호가 낮을수록 중요하거나 기본 자원(stdin, stdout)일 수 있기 때문에 가능한 빨리 다시 재사용하기 위해 낮은 번호부터 채워 나감.

표준 파일 디스크립터

FD이름설명
0stdin표준 입력
1stdout표준 출력
2stderr표준 오류

소켓과 파일 디스크립터

  • 소켓도 파일 디스크립터로 관리
  • 파일 I/O 함수들을 소켓에도 사용 가능
  • read(), write(), close()

파일 디스크립터 테이블

Process A FD Table:
FD 0 -> stdin
FD 1 -> stdout  
FD 2 -> stderr
FD 3 -> socket
FD 4 -> file.txt
FD 5 -> socket (client connection)

주요 시스템 콜

// 읽기
ssize_t read(int fd, void *buf, size_t count);

// 쓰기  
ssize_t write(int fd, const void *buf, size_t count);

// 닫기
int close(int fd);

// 복제
int dup(int oldfd);
int dup2(int oldfd, int newfd);

Datagram Socket vs Stream Socket

Stream Socket (TCP)

특징

  • 연결 지향: 통신 전 연결 수립 필요
  • 신뢰성: 데이터 전송 보장
  • 순서 보장: 데이터 순서 유지
  • 오류 검출 및 복구: 자동 재전송
  • 흐름 제어: 수신자 속도에 맞춤
  • 혼잡 제어: 네트워크 상황 고려

소켓 타입

socket(AF_INET, SOCK_STREAM, 0);  // TCP 소켓

사용 예시

  • 웹 브라우징 (HTTP)
  • 파일 전송 (FTP)
  • 이메일 (SMTP)
  • 원격 접속 (SSH)

동작 과정

  1. 3-Way Handshake: 연결 수립
  2. 데이터 전송: 양방향 스트림
  3. 4-Way Handshake: 연결 종료

Datagram Socket (UDP)

특징

  • 비연결형: 연결 수립 불필요
  • 빠른 전송: 연결 오버헤드 없음
  • 신뢰성 없음: 전송 보장 안됨
  • 순서 보장 안됨: 데이터 순서 무관
  • 단순한 구조: 헤더 오버헤드 적음

소켓 타입

socket(AF_INET, SOCK_DGRAM, 0);   // UDP 소켓

사용 예시

  • DNS 조회
  • 실시간 스트리밍
  • 온라인 게임
  • DHCP

주요 함수

// 데이터 전송
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

// 데이터 수신
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

비교표

특성Stream Socket (TCP)Datagram Socket (UDP)
연결연결 지향비연결형
신뢰성보장보장 안됨
속도상대적으로 느림빠름
오버헤드높음낮음
순서 보장보장보장 안됨
데이터 크기제한 없음제한 있음
사용 사례웹, 파일 전송실시간 통신

CGI / WebServer / MIME Type

CGI (Common Gateway Interface)

개념

CGI는 웹 서버가 외부 프로그램을 실행하여 동적 웹 페이지를 생성하는 인터페이스

동작 과정

  1. 요청 수신: 웹 서버가 CGI 스크립트 요청 받음
  2. 프로세스 생성: 새로운 프로세스에서 CGI 스크립트 실행
  3. 환경 변수 설정: 요청 정보를 환경 변수로 전달
  4. 스크립트 실행: CGI 스크립트가 동적 콘텐츠 생성
  5. 결과 반환: 생성된 HTML을 웹 서버에 반환
  6. 응답 전송: 웹 서버가 클라이언트에게 응답

환경 변수

REQUEST_METHOD=GET
QUERY_STRING=name=value&key=data
CONTENT_TYPE=application/x-www-form-urlencoded
CONTENT_LENGTH=25
HTTP_USER_AGENT=Mozilla/5.0...
REMOTE_ADDR=192.168.1.100

CGI 스크립트 예시

#!/usr/bin/env python3
import os
import cgi

print("Content-Type: text/html\n")
print("<html><body>")
print("<h1>Hello CGI!</h1>")
print(f"<p>Request Method: {os.environ.get('REQUEST_METHOD')}</p>")
print("</body></html>")

WebServer

개념

웹 서버는 HTTP 요청을 처리하고 웹 페이지를 제공하는 소프트웨어

주요 기능

  • 정적 콘텐츠 제공: HTML, CSS, JS, 이미지 등
  • 동적 콘텐츠 생성: CGI, 스크립트 실행
  • 요청 라우팅: URL에 따른 요청 분배
  • 보안 관리: 인증, 권한 관리
  • 로그 관리: 액세스 로그, 에러 로그

대표적인 웹 서버

  • Apache HTTP Server: 가장 널리 사용
  • Nginx: 고성능, 역방향 프록시
  • Microsoft IIS: 윈도우 환경
  • lighttpd: 경량 웹 서버

웹 서버 구조

Client Request → Web Server → 
                     ↓
                 Static File? → Send File
                     ↓
                 CGI Script? → Execute CGI
                     ↓
                 Error → Send Error Page

MIME Type

개념

MIME (Multipurpose Internet Mail Extensions) Type은 파일의 형식을 나타내는 표준 방법

형식

type/subtype

주요 MIME Type

파일 형식MIME Type
HTMLtext/html
CSStext/css
JavaScripttext/javascript
JSONapplication/json
XMLapplication/xml
이미지 (JPEG)image/jpeg
이미지 (PNG)image/png
이미지 (GIF)image/gif
PDFapplication/pdf
압축파일 (ZIP)application/zip
바이너리application/octet-stream

HTTP 헤더에서 사용

Content-Type: text/html; charset=utf-8
Content-Type: application/json
Content-Type: image/png

웹 서버 설정 예시

# Apache .htaccess
AddType text/html .html
AddType text/css .css
AddType text/javascript .js
AddType application/json .json

HTTP

HTTP 개념

HTTP (HyperText Transfer Protocol)는 웹에서 데이터를 주고받기 위한 프로토콜

HTTP 특징

  • 비연결성 (Connectionless): 요청-응답 후 연결 해제
  • 무상태성 (Stateless): 이전 요청 정보 저장 안함
  • 단순성: 사람이 읽을 수 있는 텍스트 기반
  • 확장성: 헤더를 통한 기능 확장 가능

HTTP 메소드

GET

GET /index.html HTTP/1.1
Host: www.example.com
  • 용도: 리소스 조회
  • 특징: 안전(Safe), 멱등(Idempotent)
  • 캐시: 가능

POST

POST /submit HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

name=John&age=30
  • 용도: 데이터 전송, 생성
  • 특징: 안전하지 않음, 멱등하지 않음
  • 캐시: 불가능

PUT

PUT /users/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json

{"name": "John", "age": 30}
  • 용도: 리소스 생성/수정
  • 특징: 멱등함
  • 전체 교체: 리소스 전체를 교체

DELETE

DELETE /users/123 HTTP/1.1
Host: www.example.com
  • 용도: 리소스 삭제
  • 특징: 멱등함
HEAD /index.html HTTP/1.1
Host: www.example.com
  • 용도: GET과 동일하지만 헤더만 반환
  • 특징: 리소스 존재 여부 확인
  • 캐시: 가능

OPTIONS

OPTIONS /api/users HTTP/1.1
Host: www.example.com
  • 용도: 서버가 지원하는 메소드 확인
  • CORS: Cross-Origin 요청에서 사용

HTTP 상태코드

1xx (Informational)

  • 100 Continue: 계속 진행
  • 101 Switching Protocols: 프로토콜 변경

2xx (Success)

  • 200 OK: 성공
  • 201 Created: 생성됨
  • 204 No Content: 내용 없음
  • 206 Partial Content: 부분 내용

3xx (Redirection)

  • 301 Moved Permanently: 영구 이동
  • 302 Found: 임시 이동
  • 304 Not Modified: 수정되지 않음
  • 307 Temporary Redirect: 임시 리다이렉트

4xx (Client Error)

  • 400 Bad Request: 잘못된 요청
  • 401 Unauthorized: 인증 필요
  • 403 Forbidden: 접근 금지
  • 404 Not Found: 찾을 수 없음
  • 405 Method Not Allowed: 메소드 허용 안됨

5xx (Server Error)

  • 500 Internal Server Error: 내부 서버 오류
  • 502 Bad Gateway: 잘못된 게이트웨이
  • 503 Service Unavailable: 서비스 사용 불가
  • 504 Gateway Timeout: 게이트웨이 타임아웃

HTTP 헤더

일반 헤더

Cache-Control: no-cache
Connection: keep-alive
Date: Mon, 23 May 2023 12:00:00 GMT

요청 헤더

Accept: text/html,application/xhtml+xml
Accept-Language: ko-KR,ko;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Host: www.example.com
Authorization: Bearer token123

응답 헤더

Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Content-Encoding: gzip
Server: Apache/2.4.41
Set-Cookie: sessionid=abc123; Path=/; HttpOnly

엔터티 헤더

Content-Type: application/json
Content-Length: 500
Content-Encoding: gzip
Last-Modified: Mon, 23 May 2023 12:00:00 GMT
ETag: "abc123"

HTTP 요청/응답 구조

HTTP 요청

GET /index.html HTTP/1.1          ← 요청 라인
Host: www.example.com             ← 헤더
User-Agent: Mozilla/5.0
Accept: text/html
                                  ← 빈 줄
                                  ← 메시지 본문 (선택사항)

HTTP 응답

HTTP/1.1 200 OK                   ← 상태 라인
Content-Type: text/html           ← 헤더
Content-Length: 1234
Server: Apache/2.4.41
                                  ← 빈 줄
<html>                           ← 메시지 본문
<head><title>Example</title></head>
<body>Hello World!</body>
</html>

HTTP 버전

HTTP/1.0

  • 특징: 연결당 하나의 요청/응답
  • 단점: 매번 연결 설정/해제 오버헤드

HTTP/1.1

  • 특징: 지속 연결(Keep-Alive)
  • 파이프라이닝: 여러 요청을 연속 전송
  • 청크 전송: 동적 콘텐츠 전송

HTTP/2

  • 특징: 바이너리 프로토콜
  • 멀티플렉싱: 하나의 연결에서 여러 요청 처리
  • 서버 푸시: 서버에서 먼저 리소스 전송

Proxy

Proxy 개념

프록시(Proxy)는 클라이언트와 서버 사이에서 중개 역할을 하는 서버

Proxy 종류

Forward Proxy

Client → Forward Proxy → Server
  • 역할: 클라이언트를 대신하여 서버에 요청
  • 특징: 서버는 프록시의 IP만 확인 가능
  • 용도:
    • 캐싱으로 성능 향상
    • 접근 제어 및 보안
    • 익명성 제공
    • 네트워크 사용량 모니터링

Reverse Proxy

Client → Reverse Proxy → Server
  • 역할: 서버를 대신하여 클라이언트에게 응답
  • 특징: 클라이언트는 실제 서버 정보 모름
  • 용도:
    • 로드 밸런싱
    • SSL 터미네이션
    • 캐싱
    • 보안 (실제 서버 숨김)

Proxy 동작 방식

1. HTTP 프록시

// 클라이언트 → 프록시 요청
GET http://www.example.com/index.html HTTP/1.1
Host: www.example.com
Proxy-Connection: keep-alive

// 프록시 → 서버 요청
GET /index.html HTTP/1.1
Host: www.example.com
Connection: keep-alive

2. HTTPS 프록시 (CONNECT 메소드)

// 클라이언트 → 프록시 터널 요청
CONNECT www.example.com:443 HTTP/1.1
Host: www.example.com:443

// 프록시 → 클라이언트 응답
HTTP/1.1 200 Connection established

// 이후 암호화된 데이터 터널링

Proxy 활용 사례

1. 웹 캐싱 프록시

  • 자주 요청되는 콘텐츠 캐싱
  • 네트워크 대역폭 절약
  • 응답 시간 단축

2. 로드 밸런싱 프록시

  • 여러 서버에 요청 분산
  • 서버 부하 균등화
  • 고가용성 제공

3. 보안 프록시

  • 악성 사이트 차단
  • 콘텐츠 필터링
  • 접근 로그 관리

4. 익명화 프록시

  • 클라이언트 IP 숨김
  • 지역 제한 우회
  • 개인정보 보호

결론

네트워크 프로그래밍의 핵심 개념들을 정리:

  1. 계층 구조: OSI 7계층과 TCP/IP 4계층 모델을 통한 체계적 접근
  2. 클라이언트-서버: 네트워크 서비스의 기본 아키텍처
  3. 소켓 프로그래밍: 네트워크 통신을 위한 핵심 API
  4. 파일 디스크립터: 시스템 리소스 관리의 기본 단위
  5. 프로토콜 선택: TCP vs UDP의 특성에 따른 적절한 선택
  6. 웹 기술: CGI, 웹서버, MIME 타입을 통한 웹 서비스 구현
  7. HTTP: 웹 통신의 핵심 프로토콜
  8. 프록시: 네트워크 중개 서비스의 다양한 활용

0개의 댓글