[네트워크] 클라이언트는 서버와 어떻게 연결될까?

한강섭·2025년 10월 12일

네트워크

목록 보기
5/8
post-thumbnail

썸네일 출처

필수 학습 목표

  • TCP 3-way 핸드셰이크4-way 종료 과정 이해
  • 포트 번호: Well-Known Port와 Registered Port 구분
  • TCP 상태: TIME_WAIT, CLOSE_WAIT 등 상태 코드 이해
  • UDPTCP의 차이점 및 각 프로토콜의 용도

선택적 학습 목표

  • SYN Flood 등 TCP 취약점 및 공격 방어 방법
  • NAT (Network Address Translation)Port Forwarding의 동작 원리


TCP Handshake

연결 지향


TCP는 연결 지향형 프로토콜이다. 내가 보낸 요청을 잘 받았는 지 확인하는 과정이 들어가있다.

그렇기에 연결하기 전 데이터를 전송할 준비가 끝났는 지, 작업 후 연결을 끝낼 준비가 되었는지 를 확인하기 위한 작업이다.

이런식으로 SYN, ACK, FIN 패킷을 보내서 안전하게 연결 시작, 종료를 한다.

TCP 상태

기다림 주의


아까 그림에서 Client와 Server가 각각의 상황에서 어떠한 상태를 가지고 있는 지 추가한 그림이다.

3-way Handshake

LISTEN
서버 소켓이 bind, listen 후 기다리고 있음

SYN_SENT
connect 호출 직후

SYN_RECV
서버가 연결 요청을 받은 직후 (SYN Flood 공격 타이밍)

ESTABLISHED
연결이 완전히 수립되어 데이터를 주고받을 수 있는 상태

4-way Handshake

FIN_WAIT_1
close 호출 후 FIN 패킷 전송하여 종료 요청 상태

FIN_WAIT_2
서버의 ACK는 받았고, 서버의 FIN을 기다리는 상태

CLOSE_WAIT
클라이언트가 끝났다는 걸 받고, 내 할일 하고 FIN 요청을 보낼때 까지 상태

TIME_WAIT
내가 먼저 연결을 끊었을 때 일정 시간 대기 후 종료

왜 일정 시간 대기할까?
마지막 ACK가 유실되고 Client가 포트를 닫으면 서버가 무한 FIN 재전송 발송할 수 있다.

포트 번호

0 ~ 65535


포트번호는 0부터 65535까지 있으며, IANA(Internet Assigned Numbers Authority)에 의해 세가지 범위로 구분된다.

Well-Known Ports

범위: 0 ~ 1023

이름과 같이 잘 알려진 포트여서 우리가 익숙한 표준화된 서비스들이 사용하는 포트이다.

20,21 : FTP (파일전송)
22 : SSH (보안 쉘)
23 : Telnet
25 : SMTP (이메일 전송)
53 : DNS (도메인 네임 시스템)
80 : HTTP (웹)
443 : HTTPS (보안 웹)
3306 : MySQL

Registered Ports

범위: 1024 ~ 49151

특정 어플리케이션이나 서비스를 위해 등록된 포트이다.

3000 : Node.js
3306 : MySQL
8080 : HTTP 대체 포트
8443 : HTTPS 대체 포트

Dynamic/Private Ports

범위: 49152 ~ 65535

일시적인 연결이나 클라이언트 측 포트로 동적으로 할당된다.

포트가 왜 필요한가?
하나의 컴퓨터에서 여러 네트워크 서비스를 동시에 구분하기 위해 존재한다.
왜 65535까지인가?
16비트 정수로 표현되기 때문에 2^16 = 65536 개 0~65535

vs UDP


UDP는 TCP와는 다르게 비연결 지향이다.

이런 복잡한 과정없이 내가 저기로 보낸다! 가 끝이다.
그렇기에 속도도 빠르고 헤더 크기도 훨씬 작다

TCP는 신뢰성이 속도보다 더 중요할 때 : 파일, 웹, 이메일, 데이터베이스
UDP는 속도가 신뢰성보다 중요할 때 : 게임, 스트리밍, 음성/영상 통화

하지만 요즘 인터넷이 정말 어마무시하게 빠르기 때문에 거의 다 TCP를 통해서 안전하게 사용한다.

SYN Flood 공격

SYN 패킷 무한 공격


TCP의 3-way 를 악용한 DoS 공격

ACK를 보내지 않고 계속해서 SYN만 보내서 대기 큐를 터트려버린다..

방어 방법

SYN Cookie

  1. 연결 정보를 쿠키에 인코딩하고 암호화 한다.
  2. 서버에 저장 정보를 두지 않고 암호화된 쿠키를 ACK에 담아서 준다.
  3. 그렇게 나중에 Client의 ACK에서 쿠키를 복호화해서 연결 수립한다.

서버에 저장을 아에 하지 않으니 가장 효과적!!

다른 방법으로는 백로그 큐 크기를 증가시키거나, 타임아웃 시간을 단축하거나 방화벽 설정을 통해 같은 IP에서 초당 SYN 패킷을 제한한다.

NAT (Network Address Translation)

공인 IP : "203.252.123.45"


IPv6가 IPv4의 주소 부족 문제로 탄생했지만 이 NAT(공유기) 친구 때문에 쓸모없어져 버렸다.

여러분의 집에 인터넷을 사용하는 기기가 몇개인데도 IP 하나로 여러 기기가 다 사용할 수 있도록 만든 것이 바로 NAT다.

기기마다 고유의 IP가 있을 텐데 이를 공인 IP로 변환시켜 외부로 도착하게 만든다. 이를 통해 공인된 IP 하나로 여러 기기가 사용해버리니 주소 부족 문제가 해결!

Port Forwarding

실제 기기 주소는..?


NAT의 문제점이 있는데 바로 외부에서 내부 접속이 안된다는 것이다. 외부에서 우리 집 웹 서버 접속하고 싶다고 해도 공유기가 어느 기기로 보내야 할 지 모른다..

그래서 "외부 80번 포트로 오면 내부 192.168.0.10의 80번으로 보내셈" 라고 설정 해 놓으면 연결이 되는 것

IP에는 사설 IP, 공인 IP가 존재한다.
사설 IP : DHCP 서버가 자동 할당 or 내가 직접 설정 다른 사람과 중복되도 상관없고 집 안에서 쓰는 것
공인 IP : SKT, KT 등 통신사가 할당해주는 인터넷에 접속 가능한 IP

profile
기록하고 공유하는 개발자

0개의 댓글