네트워크

TCP handshake Deep-dive (1)

shuotudou 2025. 3. 10. 15:02

TCP관련하여 질문이 들어왔을때, 단순 3 way handshake 과정만 설명하기에는 부족하다는 것을 알게 되었음

AI한테 물어봐도 깊게 물어보지않으면 그 이상 안알려주는 경우가 많아서 키워드를 직접 서칭하여 테스트 

 

Epimeral Port
일시적인 포트

Ephemeral 포트는 주로 클라이언트 프로그램 (웹 브라우저, 앱 등) 이 서버에 연결을 "요청할 때" 자신의 "출발지 포트 (Source Port)" 로 사용함.

 

 

VM에서 파이어폭스 실행 시 맨 처음 확인되는 TCP 패킷

Src Port: 38772 <- 이게 임시 포트가 되는것.

 

그렇다면 왜 이렇게 높은 포트를 사용하는가?

 

 

1. 동시 접속의 필요성: 클라이언트 (예: 여러분의 컴퓨터) 는 동시에 여러 웹사이트에 접속하거나, 여러 개의 앱을 실행하는 등 동시에 여러 서버와 여러 개의 연결을 맺는 경우가 많습니다.

2. 고유한 연결 정보: 각 연결은 고유하게 식별되어야 합니다. 만약 모든 클라이언트가 항상 "동일한 출발지 포트" 를 사용한다면, 서버는 어떤 연결이 어떤 클라이언트 프로그램에서 시작되었는지, 어떤 요청에 대한 응답인지 구분하기 어려워집니다.

 

TCP 4-튜플 (4-tuple)

서버는 하나인데 다수의 클라이언트가 연결을 요청하면 그 연결을 구분해야함.

 

  • TCP 연결은 다음 4가지 정보의 조합으로 고유하게 정의됩니다. 이 4가지 정보를 "TCP 4-튜플 (4-tuple)" 이라고 부릅니다.
    1. 클라이언트 IP 주소 (Client IP Address): 클라이언트 컴퓨터의 IP 주소
    2. 클라이언트 포트 번호 (Client Port Number): 클라이언트가 사용한 Ephemeral 포트 번호
    3. 서버 IP 주소 (Server IP Address): 서버 컴퓨터의 IP 주소
    4. 서버 포트 번호 (Server Port Number): 서버가 사용하는 서비스 포트 번호 (예: 80, 443)
  • 4-튜플 조합의 유일성: TCP 4-튜플 조합이 "동일한" 연결은 단 "하나" 밖에 존재할 수 없습니다. 만약 4-튜플 중 어느 하나라도 달라지면, 완전히 "다른 연결" 로 인식됩니다.

 

 

Sequence Number

해당 연결에서 주고받는 데이터의 순서를 관리함.

데이터 손실, 순서 변경, 중복 발생 없이 데이터를 정확하게 전달하는 것이 TCP의 중요한 목표인데, 이때 사용되는것이 Sequnce Number인 것. 

 

-> 바이트 스트림 기반 & 순서 보장: TCP는 데이터를 "바이트 스트림 (Byte Stream)" 형태로 취급합니다. 데이터를 단순히 덩어리 (패킷) 단위로 보내는 것이 아니라, 연속적인 바이트 흐름으로 관리하며, 각 바이트에 "순서 번호" 를 부여합니다. 이 "순서 번호" 가 바로 시퀀스 번호이다. 또한 수신자는 순서가 뒤바뀐 패킷들을 받아도, 시퀀스 번호를 기준으로 "원래 순서대로" 데이터를 재조립할 수 있다.

 

TCP 통신을 시작하기 위해 가장 먼저 수행하는 것이 3-way handshake 입니다. 3-way handshake의 첫 번째 단계 (SYN 메시지 교환) 에서 클라이언트와 서버는 서로에게 "자신의 초기 시퀀스 번호 (ISN)" 를 알려줍니다.

 

 

캡쳐화면 아래에 보면 Sequence Number : 0 과 Sequence number (raw)가 발견된다.

Sequence Number : 0은 실제 raw값의 숫자가 매우 크기때문에 와이어샤크에서 자체적으로 가독성을 높이기위해 부여한 숫자. raw값이 실제 TCP헤더에 들어가는 값이다.

OS가 랜덤하게 생성한 "Initial Sequence Number(ISN)" 값은 맨 처음 클라이언트가 보내는 SYN패킷과 서버가 보내는 SYN-ACK패킷에 포함된다. SYN 메시지를 통해 ISN을 교환하는 과정은 클라이언트와 서버가 "자신들의 시퀀스 번호 체계를 "동기화하는 과정인 것.

 

 

4-tuple과 Sequence 차이 정리

 

  • 4-Tuple: (출발지 IP, 출발지 포트, 목적지 IP, 목적지 포트)
    → 어떤 클라이언트와 서버가 연결되었는지 식별하는 역할.
  • 시퀀스 넘버(Sequence Number)
    → TCP에서 데이터를 순서대로 전송하고, 손실된 데이터를 다시 요청할 수 있도록 관리하는 역할.

 

SYN-ACK 패킷의 의미

 

  • SYN-ACK (2단계) 메시지, 두 가지 정보 전달: 서버가 클라이언트로부터 SYN 메시지 (1단계) 를 받으면, SYN-ACK 메시지 (2단계) 를 클라이언트에게 응답합니다. 이 SYN-ACK 메시지는 두 가지 중요한 정보를 담고 있습니다.
    1. SYN (Synchronize Sequence Numbers) 플래그: 서버도 클라이언트에게 "자신의 초기 시퀀스 번호 (Server ISN)" 를 알립니다. (이전 질문에서 설명했듯이, ISN은 TCP 연결의 시작점을 나타내는 중요한 번호입니다.)
    2. ACK (Acknowledgment Number) 필드: 서버는 클라이언트로부터 받은 SYN 메시지를 "잘 받았다 (확인했다)" 는 응답을 ACK 필드를 통해 전달합니다. 이때 ACK 필드 값은 "클라이언트 ISN + 1" 로 설정됩니다.
  • ACK Number = "기대하는 다음 시퀀스 번호": SYN-ACK 메시지의 ACK Number 필드 값 (클라이언트 ISN + 1) 는 "서버가 클라이언트에게 "다음 번에 받을 것으로 기대하는 시퀀스 번호"" 를 의미합니다. 즉, 서버는 "나는 너의 초기 시퀀스 번호 (ISN) 를 잘 받았고, 이제 다음 데이터는 시퀀스 번호가 ISN + 1 부터 시작되기를 기대한다" 라고 클라이언트에게 알려주는 것입니다.

 

 

 

 

 

클라이언트 -> 서버 첫 SYN패킷의 Sequence Number : 313520895

서버 -> 클라이언트 SYN-ACK 패킷의 Acknowledgment Number : 313520896 (1 증가)