TCP/UDP

김윤성·2025년 12월 28일

정보보안 공부

목록 보기
2/14

1️⃣왜 이걸 찾아봐야할까?

  • TCP/UDP는 대부분의 응용프로그램(브라우저, 카카오톡, 메일, 파일전송 등)이 데이터를 주고받는 기본 통로라서, 네트워크 통신의 “표준 길”을 이해하려면 필수다.
  • 해커의 공격도 결국 TCP/UDP라는 통로를 타고 들어온다. (서버 침투 시도, 중간 탈취, 비정상 데이터 전송, 과부하 유발 등)
  • 실제로 공격이 발생하면 확인하는 로그/패킷 분석에서 TCP/UDP 관련 정보가 핵심 단서로 자주 등장한다.
  • 방화벽 같은 기본 보안장비도 TCP/UDP 기반으로 “어떤 통신을 허용/차단할지”를 결정한다.
  • 그래서 TCP/UDP는 정보보안에서 “인터넷에서 데이터가 드나드는 문 + 도로 구조”를 이해하는 첫 단계다.

2️⃣TCP

1. TCP란

  • TCP(Transmission Control Protocol) 는 OSI 7계층에서 4계층(전송 계층, Transport Layer) 에 해당하는 프로토콜이다.
  • 서로 다른 호스트 간 통신에서 “응용프로그램(프로세스)끼리” 데이터를 주고받도록 해주는 규칙(약속)이다.
  • 우리가 쓰는 서비스(웹, 메일 등) 상당수가 TCP를 기반으로 동작한다.
  • 연결지향(Connection-oriented) 프로토콜이라, 통신 전에 연결 수립(3-way handshake) 을 하고 끝날 때 연결 종료(4-way handshake) 를 한다.
  • 신뢰성 있는 전송을 제공한다: 데이터 손실/중복/순서 뒤바뀜을 제어해서 정확하고 안정적으로 전달하려고 한다.
  • TCP에서 전송 단위는 세그먼트(segment) 이다.

2. tcp 통신의 흐름

  • 커넥션(connection)이라는 안정적이로 논리적인 통신 통로를 가진다
  • 데이터를 전송하기 전에 3-way handshaking 과정을 통해 연결을 설정(연결수립)→connection연다
  • 통신 선로가 논리적으로 연결되고 , 데이터는 그 연결 위에서 순서/재전송/흐름·혼잡제어를 수행하면서 송수신된다
  • 클라이언트에서 데이터 전송이 끝나면 4-way handshaking 과정을 통해 데이터가 모두 전달됐는지 확인(연결 종료)→connection 닫는다

3. TCP에서 전달되는 데이터(세그먼트) 구조

  • tcp에선는 세그먼트를 주고받는데 이 tcp 세그먼트는
    →tcp헤더 + 데이터로 이루어져있다
  • 데이터는 사용자와 7계층 응용프로그램에서 매우 중요하지만
  • 실제 tcp통신관점에서는 헤더의 정보가 중요하고 기능을 알수있다
  • TCP는 여러 개의 필드로 나누어져 있으며 기본 20 bytes 최대 60 bytes로 이루어져 있다

  1. Source/Destination Port 
    • 세그먼트의 출발지와 목적지가 들어가는 필드로 송수신 포트 주소가 들어있다
    • TCP와 UDP는 서로 독립된 포트 번호 공간을 가지므로, 예를 들어 TCP 80, UDP 80이 동시에 존재할 수 있다.
  2. Sequence Number(시퀸스 넘버, 순서번호)
    • 전송하는 데이터의 순서를 의미하는 번호
    • “이번에 보내는 데이터가 전체에서 몇 번째 바이트부터인지”를 적은 번호다.
    • 이번호를 사용하여 수신자는 쪼개진 세그먼트를 올바른 순서로 조립하여 사용할수있다
    • 송신자가 최초로 데이터를 송신할때 이번호를 랜덤한 수로 초기화후 자신이 보낼 데이터의 1bytes당 1씩 증가시켜 데이터 순서를 표현
  3. Acknowledgement Number(응답번호)
    • “여기까지는 잘 받았다, 다음은 이 번호부터 보내줘”라는 뜻이다.
    • 수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용한다
    • 필드 값은 ACK 플래그 비트가 지정된 경우에만 유효
  4. Data Offset(데이터 옵셋)
    • TCP 세그먼트가 시작되는 위치를 기준으로 데이터의 시작 위치를 나타낸다.
    • TCP 헤더의 크기
  5. Flag(플래그)  → 따로 아래서
    • 플래그는 스위치로 생각하고 각 내용의 기능을 껐다키는거에 비유할수있다
    • 0,1을 사용하고 0이면 꺼짐 1이면 사
  6. Reserved(예약)
    • 향후 기능 확장을 위해 남겨둔 예약 영역이며, 현재는 항상 0으로 설정
  7. Window
    • 수신 측이 “지금 더 받을 수 있는 데이터 양”을 알려주는 값이다.
    • 값이 클수록 한번에 더 많이 보낼수 있고 0이면 더이상 받을수 없어 송신자는 전송을 멈춰야한다
    • 흐름제어의 핵심요소이다
  8. Checksum
    • “보내는 동안 데이터가 깨졌는지” 확인하는 검사 값이다.
    • TCP 세그먼트의 헤더와 데이터 전체에 대해 계산하는 오류 검출 코드이다.
    • 수신 측은 이 값을 다시 계산해서, 전송 중 비트가 변경되었는지(변형·손상 여부)를 판별한다
  9. Urgent Pointer(긴급 포인터)
    • “여기까지가 급한 데이터야”라고 표시해주는 포인터
    • Sequence Number를 기준으로, 긴급(Urgent) 데이터의 마지막 바이트 위치를 상대적인 값으로 나타낸다
    • URG 플래그가 1일 때만 유효
    • “중단/취소” 키 입력을 긴급 데이터로 보내, 일반 문자 데이터보다 빠르게 처리하게 만드는 데 사용
  10. Options
    • TCP 헤더 뒤에 붙는 추가 설정 영역
    • MSS, Window Scale, SACK, Timestamp 같은 고급 기능 넣는 칸
  11.  Padding
  • 헤더 크기를 4 바이트의 배수로 맞추기 위해 사용되며 생략할 수 있다.
  • Options를 쓰다 보면 TCP 헤더 길이가 애매하게 끝날 수 있음
    그런데 TCP 헤더 길이는 항상 4바이트 단위(32비트)로 맞춰야 한다

5. Flag

  1. SYN
    • Synchronize (동기화)
    • TCP 연결을 새로 만들 때 몇 번 데이터부터 보낼지 순서 번호를 맞추는 플래그다.
    • 3-way 핸드셰이크의 1, 2번째 단계에서 사용된다
  2. ACK
    • Acknowledgment (승인, 확인)
    • “여기 전까지 다 받았어”를 알려주는 플래그이다
    • ACK 플래그가 1이면, Acknowledgment Number(응답 번호)가 유효한 값을 가지고
      송신 측은 ACK 번호 - 1까지의 데이터가 정상 도착했다고 판단한다.
    • 3-way 핸드셰이크 이후 대부분의 TCP 세그먼트는 ACK = 1 상태로 전송된다
  3. FIN
    • Finish (끝내다, 종료)
    • “전송 끝, 연결 닫고 싶다”는 의사를 나타내는 연결 종료 플래그.
    • FIN을 받은 쪽은 ACK로 응답하고, 자신의 데이터 전송이 끝나면 다시 FIN을 보내 연결 닫기를 완료한다. 결국 양방향 모두 FIN/ACK 교환이 끝나야 TCP 연결이 완전히 종료
  4. RST
    • Reset (초기화, 리셋)
    • 잘못된 세그먼트나 비정상 연결에 대해 강제 종료·초기화할 때 쓰는 플래그.
    • 예를 들어, 존재하지 않는 포트로 SYN이 들어오면 서버는 RST로 응답하고 RST가 발생하면 기존 연결 상태는 버려지고, 필요한 경우 새 연결을 다시 맺어야 한다.
  5. PSH
    • Push (밀어 넣다)
    • PSH(Push)는 수신 측에 “지금 받은 데이터 빨리 위로 밀어 올려”라고 지시하는 플래그
    • PSH 플래그가 1이면, 수신 측은 해당 세그먼트까지의 데이터를 버퍼링만 하지 말고 상위 계층으로 Push(즉시 전달)해야 한다.
    • 실시간성이 필요한 애플리케이션에서 지연을 줄이는 데 사용된다
  6. URG
    • Urgent (긴급한)
    • URG(Urgent)는 긴급 데이터가 있으니 빨리 처리하라는 플래그
    • 애플리케이션은 이 구간을 우선 처리하여 일반 데이터보다 먼저 반영할 수 있다.
    • URG=1일 때만 Urgent Pointer 값이 유효
    • ‘중단/취소’ 같은 제어 신호를 빨리 처리할 때 사용
  7. ECE
    • Explicit Congestion Notification-Echo (ECN 혼잡 알림 에코)
    • 라우터가 알린 혼잡 상태를 송신자에게 되알리는 플래그
    • 송신 측은 ECE를 보고 전송 윈도우를 줄이는 등 전송률을 낮춰 혼잡을 완화해 네트워크 부하를 줄인
  8. CWR
    • Congestion Window Reduced (혼잡 윈도우 감소 완료)
    • 송신 측이 ECE를 받은 뒤 전송 윈도우를 줄였다는 ‘조치 완료’ 신호
    • “혼잡 조치를 했으니 더 이상 ECE를 계속 보내지 않아도 된다”는 의미

6. TCP 연결의 시작( 3-way handshaking)

what, why

  • TCP 통신을 시작하기 위해, 클라이언트와 서버가 SYN → SYN/ACK → ACK 를 주고받으며 서로 통신 가능함을 확인하고 초기 시퀀스 번호(ISN)를 동기화해 신뢰할 수 있는 연결인 세션을 설정하는 3단계 과정
  • 클라이언트와 서버가 “우리 이제부터 신뢰할 수 있는 연결을 시작하자” 하고 서로 합의하는 과정
  • 3-Way Handshake 과정에서 정상적으로 세션이 맺어 지지 않으면 통신이 중단
  • tcp의 핵심인 신뢰성을 보장하기 위해 상대가 진짜 있는지 확인하고 , 데이터 순서를 정하는 등의 과정을 거친다

과정(흐름)

  1. 0단계
    • 연결 시도 전의 각각의 서버와 클라이언트의 상태
    • 상태
      • 클라이언트 : 클로즈
      • 서버 : 리슨
    • 서버는 서버프로그램이 켜질떄부터 리슨
  2. 1단계
    • 클라이언트가 서버에 TCP 연결을 요청한다.
    • 이때 세그먼트에는 처음 연결이니까 SYN 플래그에 1, SEQ 필드에 ISN (임의의 숫자 x)를 넣어서 서버에 보낸다
    • ISN(Initial Sequence Number) 은 이때 SEQ 필드에 들어가는 “처음 시퀀스 번호” 값이다.
    • 즉 “나 이제 너와 연결하고 싶어(SYN),그리고 내 데이터 시작 번호는 x야(ISN)”라는 의미의 접속 요청이다.
    • 상태
      • 클라이언트 : CLOSED → SYN_SENT
      • 서버 : LISTEN
  3. 2단계
    • 서버는 클라이언트가 보낸 SYN과 ISN(x)이 포함된 세그먼트와 그에 대한 접속 요청을 받는다.
    • 요청을 받은 서버는 요청을 승인하고, 동시에 자신의 초기 시퀀스 번호(ISN)를 알려준다.
    • 이때 세그먼트에는 ACK플래그에 1 ack 필드에는 x+1 syn플래그에 1 SEQ 필드에 ISN (임의의 숫자 y)를 넣어서 클라이언트에 보낸다
    • 즉 “네 요청 잘 받았어(ACK 플래그). 지금까지 네가 보낸 건 x까지야, 그러니까 다음 데이터는 x+1부터 보내줘(ACK 번호). 그리고 내가 보내는 데이터의 시작 번호는 y야(SYN, SEQ=y).”
    • 상태
      • 클라이언트 : SYN_SENT
      • 서버 : LISTEN → SYN_RCVD
  4. 3단계
    • 클라이언트는 서버가 보낸 SYN+ACK 세그먼트(SEQ = y, ACK = x+1) 를 받는다.
    • 서버의 ISN(y)를 잘 받았다는 의미로 ACK 를 보내며, 연결을 최종적으로 확인한다.
    • 이때 세그먼트에는 플래그에는 ACK만 1 , SEQ 필드에는 x+1, ACK필드에는 y+1을 담아 전송한
    • 즉 서버 너의 ISN 잘 받았어 우리 서로 ISN을 알고 있으니까 이번호들을 기준으로 데이터를 순서대로 주고받자 라고확인하는 단계
    • 상태
      • 클라이언트 : SYN_SENT → ESTABLISHED
      • 서버 : 클라이언트가 ACK를 받는 순간 SYN_RCVD → ESTABLISHED

7. TCP 연결의 끝(4-way handshaking)

what, why

  • TCP 연결을 정상적으로(Graceful) 종료하기 위해, 통신 양쪽이 FIN과 ACK를 주고받으며 “나는 더 이상 보낼 데이터가 없다”는 종료 의사를 서로 확인하는 4단계 신호 교환 과정
  • 즉 나는 더보낼께 없는데 너는 혹시 더보낼게 남아있니 하고 확인하는과정
  • 역시나 신뢰성을 가지기 위해 사용

과정

  1. 1단계
  • 클라이언트가 서버에 TCP 연결 종료를 요청한다.
  • 이때 세그머트에는 더이상 보낼데이터가 없다든 뜻으로 FIN플래그에 1을 넣는다 통신이 연결중인 상태임으로 ACK플래그에도 1 SEQ,ACK필드에 맞는 값도 같이 넣어서 전송한다
    • =이건 내가 보내는 응답이야(ACK플래그) 나는 더이상 보낼 데이터가 없어서 종료하고싶어(FIN플래그) 내가 전송하는 데이터의 순서는 SEQ필드 값이고, 너가 나한테 보내주면 되는 순서는 ACK필드에 값이야
  • 상태
    • 클라이언트: ESTABLISHED → FIN_WAIT_1
    • 서버: ESTABLISHED
  1. 2단계(half-close)
  • 서버는 클라이언트의 FIN을 받고, “종료 요청은 확인했어”라는 ACK 를 먼저 보낸다.
  • 아직 보낼데이터가 남아있을수있어서 요청을 확인했다는 의미만 전달
  • 이때 세그먼트는 ACK플래그에 1, SEQ,ACK필드에 맞는 값이 들어있다
    • = 너의 종료요청을 확인했어
  • 이떄는 half-close로 서버는 데이터를 계속 보낼수있
  • 상태
    • 서버: ESTABLISHED → CLOSE_WAIT
    • 클라이언트: (ACK 수신 후) FIN_WAIT_1 → FIN_WAIT_2
  1. 3 단계
  • 서버가 자기 쪽도 보낼 데이터가 모두 끝나면, 클라이언트에게 FIN 을 보낸다.
  • 이때 세그먼트에는 FIN플래그에 1, ACK플래그에 1, SEQ,ACK필드에 데이터를 주고받을떄 마지막값이 들어있다
    • =나도 이제 데이터를 모두 다보냈어
  1. 4단계
  • 서버의 FIN을 받은 클라이언트는 종료를 확정하는 ACK를 보낸다
  • 나도 너의 종료를 확인했어 이제 연결종료

    TIME_WAIT

8. tcp의 신뢰성 보장을 위한 메커니즘

tcp는 아래와 같은 개념들을 사용해서 신뢰성을 보장하고 효율적이고 안정적인 데이터 전달이 가능하다

손실제어(복구)

  • TCP에서는 패킷 손실이나 오류로 인한 데이터 누락을 탐지하면 해당 세그먼트를 재전송한다
  1. 타임아웃 재전송
  • 재전송은 데이터의 도착시간을 정하는 타이머를 사용해서 구현된다 tcp에는 다양한 타이머가 존재하고 대표적인것은 재전송 타이머(RTO)가 있다
  • 타이머로 정한 일정시간내에 ACK를 받지 못하는 상황을 타임아웃(timeout)이라고 한다
  • 타임아웃 재전송은 ACK가 일정시간인 RTO안에 도착하지 못해 타임아웃이 발생했고 데이터를 재전송 하는것이다
  • 재전송 타이머(RTO)는 네트워크의 왕복 지연 시간(RTT)을 기반으로 네트워크 상태에 따라 동적으로 계산한다
  • 재전송에 연속실패시에는 RTO를 증가시킨다(지수 백오프(exponential backoff))
  • 즉, 네트워크가 안 좋을수록 더 조심스럽게(덜 공격적으로) 재시도해 혼잡을 악화시키지 않게한
  1. 빠른재전송(Fast Retransmit)
  • 타이머와 타임아웃과 상관없이 재전송되는 상황도있다
  • tcp에서는 ACK를 사용하는데 정상적인 상황에서는 ACK값이 증가하지만 손실과 오류가 있는경우에는 같은 ACK값이 반복적으로 전송 될수있다
    이때 tcp는 3개이상의 ACK를 중복수신하면 패킷손실이 발생했다고 판단하여 즉시 재전송한다
  • ACK Duplication이라고도 부른다
  • 타임아웃을 기다리지 않고 재전송할수있어 전송지연시간이 감소하여 효율성이 증가한다

흐름제어(Flow Control)

  • 흐름제어는 수신자는 내가 받을수 있는 데이터 양을 알려주고 송신자는 그거레 맞춰 데이터전송을 조절하는 메커니즘 동작이다
  • tcp에서 데이터가 송수신될떄는 임시공간으로 버퍼라는 개념을 사용하고 그 버퍼에 저장할수 있는 양을 window에 적는다
  • 데이터 송수신과정에서 window값보다 많은 데이터가 오면 버퍼에서는 그 데이터를 저장하지 못하고 버려저 손실이되는 수신버퍼 overflow가 발생한다
  • 흐름제어에서는 Sliding Window, Zero Window, Window Update등이 사용된다

혼잡제어(Congestion Control)

  • 혼잡제어는 수신자와 상관없이 네트워크 경로에서 과부하가 걸리지않게 전송률을 제어하는것이다
  • 혼잡의 정도는 주로 타임아웃(RTO)과 Triple dup ACK 일때 혼잡이라고 판단한다
  • 혼잡제어와 관련된 동작에는 Slow Start, Congestion Avoidance 등이 있다

3️⃣ UDP

1. UDP란

  • UDP(User Datagram Protocol) 는 OSI 7계층에서 4계층(전송 계층, Transport Layer) 에 해당하는 프로토콜이다.TCP는 OSI 7계층에서 4계층(전송 계층, Transport Layer) 에 해당하는 프로토콜이다.
  • 비연결형 프로토콜로 신뢰성이 보장되지않는 통신 프로토콜이다
  • 즉 데이터를 전달할때 데이터 전달만 목적이고 순서,도착, 흐름, 혼잡에는 관여하지 않는다
  • 전송 단위는 데이터그램이라고 한다
  • 등장배경
    • 일반적으로 우리가 사용하는 대다수의 프로그램은 데이터를 안전하게 받는 것이 중요해서 신뢰성이 기반이 되는 tcp를 사용한다 하지만 tcp로 데이터를 주고받으면 실시간 스트리밍이나 동영상 재생과 같은 분야에서는 이러한 신뢰성 기반이 걸림돌이 되었다 간단한 영상을 재생하는 과정에서도 중간에 받지못한 데이터 하나때문에 계속되는 버터핑으로인해 재생이 중지되거나 혼잡제어를 위해 통신과정의 데이터의 양을 조절하다보니 오히려 영상재생과 같은 부분에서는 퀄리티가 안정되지 못했고 이러한 문제를 해결하기 위해 등장한것이 신뢰성보다는 데이터 도착에 중점을둔 UDP이다
  • 대표적인 UDP의 예시로는 DNS, VoIP(보이스톡, zoom)이 있다

2. UDP의 헤더

  • 데이터그램은 UDP헤더와 데이터로 이루어져 있다
  • UDP의 헤더는 TCP의 헤더의 비해 매우 단순다

  1. Source/Destination Port
  • 데이터그램의 출발지와 목적지가 들어가는 필드로 송수신의 포트 주소가 들어있다
  • 이부분은 tcp와 주된 내용이 같다
  1. Length
  • UDP 데이터그램의 길이를 나타내는 값이다
  • 즉 데이터그램의 전체 크기를 의미한
  1. Checksum
  • 헤더와 데이터를 모두 포함한 데이터그램 전체에 대해 오류를 탐지하기 위해 사용
  • 오류를 감지해서 비정상적인 데이터는 폐기하고 tcp 처럼 재전송은 하지 않는다
  • Length 필드를 이용해서 검사하는 범위가 명확하다
  • tcp에서는 체크섬이 필수에 가깝지만 udp에서는 ipv4를 사용하면 필수는 아니고 ipv6환경에서는 필수다

3. UDP의 흐름 (통신방식)

  • UDP가 통신할떄는 세션을 연결하지 않는다 즉 비연결성을 가진다
  • 그래서 연결을 수립하고 종료하는 핸드쉐이크의 과정을 거치지 않는다
  • 그냥 일방적으로 요청과 응답을 주고받을 뿐이다.
  • 통신과정에서 문제가 발생해도 재전송, 흐름제어, 혼잡제어 같은 메커니즘이 동작하지않고 그냥 데이터를 버린다

4️⃣ TCP vs UDP

구분TCPUDP
전송 단위(용어)세그먼트(Segment)데이터그램(Datagram)
연결 방식연결 지향(3-way handshake로 연결 설정)비연결(연결 설정 없이 바로 전송)
신뢰성높음(재전송, 순서 보장, 중복 제거)낮음(유실/순서/중복 보장 없음, 필요 시 앱이 구현)
순서 보장O (SEQ/ACK 기반)X (순서 보장 없음)
재전송O (타임아웃 재전송, 빠른 재전송 등)X (프로토콜 차원 재전송 없음)
흐름 제어, 혼잡제어O (rwnd/윈도우)X
헤더 크기20바이트 이상(옵션 있으면 더 큼)8바이트(고정)
체크섬IPv4/IPv6 모두 사실상 필수IPv4는 0이면 미사용 가능(환경에 따라), IPv6는 사실상 필수
전송 지연상대적으로 큼(연결/재전송/제어 포함)상대적으로 작음(오버헤드 적고 바로 전송)
대표 사용처웹(HTTP/1.1, HTTP/2), 파일전송, 이메일, SSH 등DNS(기본), VoIP/스트리밍, 게임, QUIC/HTTP3 기반 트래픽

5️⃣ 관련된 보안 개념

  1. 공통
    • 포트 스캐닝 : 열려있는 포트 즉 접속할수 있는 포트를 찾는 행위
  2. tcp
    • SYN Flood(연결 자원 고갈) : 디도스 공격의 한 유형으로 tcp 연결을 처음 시작할때 사용하는 SYN을 계속 보내 서버 자원을 소모시키는 공격
    • 세션 하이재킹/패킷 주입 : TCP 연결에서 SEQ/ACK 조건이 맞으면 세션에 끼어들거나 RST(연결 끊기) 주입이 가능할수 있음
  3. udp
    • 스푸핑(Spoofing) : 패킷의 출발정보를 조작해 다른사람이 보낸것처럼 꾸미는 행위 udp에서는 연결확인절차가 없어 더 쉽게 발생
    • 반사/증폭(Reflection/Amplification) DDoS : 반사증폭 디도스는 공격자가 스푸핑으로 ip를 바꾸어 피해자에게 큰 응답이 돌아오게 하는 공격이다 udp에서 스푸핑이 비교적 용이해 반사증폭 디도스가 더 발생하기 쉽다
profile
꾸준한 IT 공부

0개의 댓글