CS/네트워크

TCP / UPD

leah-only 2025. 2. 18. 13:26

전송 계층 (Transport)

송신자 수신자를 연결하는 통신 서비스 / 데이터 전달 담당

 

TCP 특징

  • 연결 지향형 전송 규약 (수신 여부 확인)
  • 흐름 중심 프로토콜, 통신을 주고 받는 것을 중요시 함
  • 중간에 패킷이 손실되는 경우 재전송을 통해 신뢰성 보장 (속도 느림)
  • 대부분의 통신, 특히 파일이나 데이터 전송 시에 사용 (신뢰성 중요한 파일 교환)
  • 흐름제어, 혼잡제어, 오류제어로 신뢰성 보장

UDP 특징

  • 비연결 지향형 전송 규약
  • 데이터 중심 프로토콜, 주고받는 통신보다 데이터를 일방적으로 보내는 것을 중요시 함
  • 데이터 전송 시 신뢰성 보장 X (속도 빠름)
  • P2P, 스트리밍, 전화에 사용 (실시간성이 중요한 스트리밍 등에 자주 사용)
  • checksum 필드로 최소한의 오류만 보장
UDP에 checksum 필드가 있는 이유
: 모든 데이터 링크 계층이 오류검사를 하는 것은 아니기 때문
  데이터 링크 계층의 오류 검사 부재를 보완하고
  종단 간 데이터 전송 과정에서 발생할 수 있는 오류를 검출하기 위해 존재

but UDP는 신뢰성 있는 프로토콜을 아니다. 
체크섬을 통해 오류를 발견하더라도 오류를 회복하기 위한 어떠한 일도 하지 않음

 

특징 TCP UDP
연결 방식 연결 지향형 비연결 지향형
3-way handshaking O X
패킷 교환 방식 가상 회선 방식 데이터그램 방식
패킷 순서 보장 O X
수신 여부 확인 O X
통신 방식 1:1 (유니캐스트) 1:1 or 1:N or N:N (유니, 멀티, 브로드 캐스트)
신뢰성 높음 낮음
속도 느림 빠름
사용 예시 HTTP, 메일, 파일 P2P, 스트리밍, 전화

 


TCP 연결 과정 : 3-way handshaking

SYN (Synchronize) 

  • 클라이언트는 서버에 접속 요청
  • 클라이언트는 임의의 시퀀스 번호 (ISN)을 생성하여 SYN 패킷에 담아 서버로 전달
  • SYN 패킷 : "서버에 접속하고 싶다"는 의미

SYN + ACK

  • 서버는 클라이언트의 SYN 패킷을 받고 클라이언트 요청을 수락
  • 서버는 자신의 시퀀스 번호(Server ISN)을 생성
  • 클라이언트의 ISN+1 값을 ACK로 설정하여 SYN+ACK 패킷을 클라이언트에 전달
  • SYN + ACK 패킷 : "클라이언트의 접속 요청을 수락하며, 나도 접속 준비 되었다"는 의미

ACK

  • 클라이언트는 SYN+ACK 패킷을 받고 서버의 ISN+1 값을 ACK로 설정하여 ACK 패킷을 서버에 전달
  • ACK 패킷 : "서버의 응답을 받았으며, 이제 데이터를 주고받을 준비가 되었다"는 의미

TCP 연결 해제 과정 : 4-way handshaking

FIN (Finish)

  • 클라이언트는 서버에게 연결 종료를 요청
  • 클라이언트는 FIN 패킷을 서버에 전달
  • 클라이언트는 FIN_WAIT_1 상태로 진입, 서버의 응답 기다림

ACK

  • 서버는 클라이언트의 FIN 패킷을 받고 ACK 패킷을 클라이언트에 전달
  • 서버는 CLOSE_WAIT 상태로 진입, 클라이언트는 FIN_WAIT_2 상태로 진입

FIN

  • 서버는 클라이언트에게 연결 종료 요청
  • 서버는 FIN 패킷을 클라이언트에 전달

ACK

  • 클라이언트는 서버의 FIN 패킷을 받고 ACK 패킷을 서버에 전달
  • 클라이언트는 TIME_WAIT 상태로 진입, 서버는 CLOSED 상태로 진입
  • 클라이언트는 TIME_WAIT 시간 동안 대기 후 연결 종료하고 모든 자원을 해제
TIME_WAIT
클라이언트가 마지막 ACK 패킷을 보내고 나서 일정 시간 동안 대기하는 상태
소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태
이 상태는 혹시 모를 재전송을 대비하기 위한 것

 


Q. 연결 해제 시 4-way handshaking을 사용하는 이유?

데이터의 완전한 전송을 보장하기 위해 / 안전하게 연결을 종료하기 위해

 

클라이언트는 서버에게 데이터 요청을 모두 보냈다 하더라도, 서버는 클라이언트에게 보내야 할 데이터가 남아있을 수도 있기 때문에 FIN과 ACK를 한번에 보내지 않고 서버측에서 보낼 데이터마저 다 보냈을 경우 FIN 메시지를 보낸다.


Q. 만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?

이러한 현상을 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default:240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT 과정)

 

TIME_WAIT는 TCP 연결을 안전하게 종료하고 데이터 손실을 방지하는 데 매우 중요한 역할을 한다.


Q. 초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유는?

주된 이유는 보안 및 안정성 때문이다. 

 

ISN이 예측 가능하다면, 공격자는 이를 이용하여 TCP 연결을 가로채거나 데이터를 위변조할 가능성이 있다. 난수를 사용함으로써 이러한 공격의 가능성을 낮출 수 있다. 

 

과거에 사용된 ISN이 다시 사용될 경우, 공격자는 이전 연결 정보를 이용하여 공격 시도 가능성 존재한다. 난수를 사용하면 이러한 재사용 공격을 방지할 수 있다. 

 

Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 

따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 

Server 측에서는 패킷의 SYN을 보고 패킷을 구분하는데 난수가 아닌 순차적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. (혼동 발생 가능성)

이런 문제의 발생 가능성을 낮추기 위해 ISN을 난수로 설정한다. 


CS 로드맵 : https://github.com/devSquad-study/2023-CS-Study

CS 질문 : https://eunsun-zizone-zzang.tistory.com/35