기출 TCP/IP의 문제점

agnusdei·2025년 12월 14일

Information Security

목록 보기
66/96

###1. TCP/IP 프로토콜의 자체적인 문제점TCP/IP는 '신뢰성''연결성'을 최우선으로 설계되었으나, 이로 인해 보안과 효율성 측면에서 약점이 존재합니다.

####A. 보안(Security) 측면: "신뢰 기반 설계의 취약점"TCP/IP는 통신 상대를 기본적으로 신뢰한다는 가정하에 설계되었습니다. 인증이나 암호화가 기본 프로토콜 레벨(Layer 3, 4)에 내장되어 있지 않습니다.

  • IP 스푸핑 (IP Spoofing): IP 헤더의 '출발지 주소(Source IP)'를 조작하여 다른 사람인 척 위장하기 쉽습니다.
  • DoS/DDoS 취약성: 연결 지향적인 TCP의 특성(3-Way Handshake)을 악용하여, 서버의 자원을 고갈시키는 공격(예: SYN Flooding)에 취약합니다.
  • 스니핑 (Sniffing): 데이터가 암호화되지 않고 평문(Plain Text)으로 전송되므로, 중간에서 패킷을 가로채 내용을 훔쳐보기 쉽습니다. (이를 해결하기 위해 상위 계층에서 TLS/SSL 등을 사용)

####B. 효율성(Efficiency) 측면: "구조적 병목"* HOL Blocking (Head-of-Line Blocking): TCP는 패킷의 순서를 엄격하게 지킵니다. 만약 앞선 패킷 하나가 손실되면, 그 뒤에 도착한 정상 패킷들도 앞선 패킷이 재전송되어 올 때까지 처리되지 못하고 대기해야 합니다. 이는 속도 저하의 주원인이 됩니다. (HTTP/3에서 QUIC 프로토콜이 등장한 배경)

  • 오버헤드: 앞서 보셨듯 TCP 헤더는 최소 20바이트이며, 신뢰성 확보를 위한 잦은 Handshake와 Ack 패킷은 네트워크 대역폭을 낭비할 수 있습니다.

###2. 서버 소켓의 상태: Listen & Accept서버가 클라이언트의 연결 요청을 처리하는 과정에서 사용되는 시스템 콜(System Call)이자 상태(State)입니다. 소켓 프로그래밍의 핵심 단계입니다.

####A. Listen (수신 대기)서버가 bind()를 통해 특정 포트를 점유한 후, "나는 이제 연결 요청을 받을 준비가 되었다"고 운영체제에 알리는 단계입니다.

  • 핵심 역할: 연결 요청을 대기시키는 대기열(Queue)을 생성합니다.
  • Backlog Queue: 클라이언트가 connect()(SYN 패킷 전송)를 시도하면, 서버는 바로 연결되는 것이 아니라 일단 이 큐(Queue)에 들어갑니다. listen(socket, backlog_size) 함수의 두 번째 인자로 이 큐의 크기를 결정합니다.
  • 참고: 큐가 가득 차면 이후의 클라이언트 요청은 거절되거나 무시됩니다.

####B. Accept (연결 수락)listen 상태의 대기열(Queue)에 쌓여 있는 "연결이 완료된(ESTABLISHED)" 요청을 하나씩 꺼내서 실제 통신을 시작하는 단계입니다.

  • 동작 방식:
  1. 대기열이 비어있으면, 누군가 접속할 때까지 프로세스는 블로킹(대기) 상태가 됩니다.
  2. 연결 요청이 들어오면, 운영체제는 새로운 소켓(New Socket)을 만들어 반환합니다.
  • 중요한 차이: listen 소켓은 계속 "안내 데스크" 역할만 하고, accept가 반환한 "새로운 소켓"이 실제 클라이언트와 1:1로 데이터를 주고받는 역할을 합니다.

###3. TCP Slow Start (슬로우 스타트)TCP의 혼잡 제어(Congestion Control) 알고리즘의 첫 단계입니다. 네트워크의 상태를 모르기 때문에, 처음에는 조심스럽게 전송량을 늘려가는 방식입니다.

####개념 및 목적연결이 막 수립되었을 때, 네트워크가 현재 어느 정도의 데이터를 감당할 수 있는지 알 수 없습니다. 이때 갑자기 대량의 데이터를 보내면 네트워크 혼잡(Congestion)이 발생하여 패킷이 유실될 수 있습니다. 이를 방지하기 위해 전송 속도를 낮은 상태에서 시작하여 지수 함수적으로 증가시키는 방법입니다.

####동작 과정1. 초기화: 송신 측은 혼잡 윈도우 크기(cwnd, Congestion Window)를 아주 작은 값(보통 1 MSS, Maximum Segment Size)으로 설정합니다.
2. 전송: cwnd 크기만큼 패킷을 보냅니다.
3. 증가 (Exponential Growth): 수신 측으로부터 ACK(수신 확인)를 받을 때마다 cwnd를 증가시킵니다.

  • ACK 하나당 cwnd를 1씩 늘립니다. 즉, 한번 왕복(RTT)할 때마다 윈도우 크기는 2배가 됩니다. (1 \to 2 \to 4 \to 8 \dots)
  1. 임계점 도달: 미리 설정된 임계값(ssthresh, Slow Start Threshold)에 도달하거나 패킷 손실이 발생하면, 기하급수적 증가를 멈추고 '혼잡 회피(Congestion Avoidance)' 단계(선형 증가)로 전환합니다.

요약하자면: "네트워크 상황을 모르니 간을 보면서, 괜찮다 싶으면 속도를 2배씩 빠르게 올려보는 전략"입니다.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글