네트워크

TCP handshake Deep-dive (2)

shuotudou 2025. 3. 10. 16:48

SYN-ACK 수신 후 ACK 패킷 확인

 

 

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

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

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

클라이언트 -> 서버 ACK 패킷의 Acknowledgment Number : 1876124419

"랜덤 초기 시퀀스 번호 (ISN)" 사용: TCP 연결을 시작할 때 (3-way handshake), 클라이언트와 서버는 각자 "무작위로 생성된 "초기 시퀀스 번호 (Initial Sequence Number, ISN)"" 를 사용합니다.

 

 

* TCP 세그먼트는 "TCP 헤더 (TCP Header)" 와 "TCP 페이로드 (TCP Payload)" 로 구성
 * "TCP 페이로드 (TCP Payload)": "전송하려는 "실제 데이터"" 자체 를 의미

ACK, PUSH, RESET, SYN, FIN이 유의해야할 플래그

 

 

데이터 전송시, 송신자는 보낸 바이트 수에 따라 시퀀스 번호를 증가시키고, 수신자는 이에 대한 ACK 메시지를 보냄.

 

( 클라이언트가  서버에 TLS 연결을 요청하는 상황 - Client hello)

 

위 캡쳐화면에서 Sequence Number는 1이며, 페이로드는 1922

Next sequence number 1923 -> '예측되는" 시퀀스 번호. 여기서 예측의 의미는 미래를 예측한다의 의미가 아니라 "임의로 정해지는 것이 아니라, "현재 시퀀스 번호와 "보내는 "데이터 양" 에 따라 "계산 가능하게 "결정된다는 의미로 이해해야 함.
아래 캡쳐화면에서 서버는 클라이언트에게 Ack number를 1923으로 전달함.

 

페이로드 송신자는 상대방의 ACK 메시지를 통해 데이터가 제대로 넘어갔는지 확인함.

 

 

송신버퍼, 수신버퍼

  • 애플리케이션이 데이터를 전송 요청하면, OS의 송신 버퍼에 먼저 저장됨.
  • 네트워크 인터페이스 카드(NIC)를 통해 데이터를 실제로 전송하기 전에 일시적으로 대기함.
  • TCP는 송신 버퍼에 있는 데이터가 수신 측에서 성공적으로 ACK(응답)를 받을 때까지 유지
    -> ACK를 받으면 송신버퍼에 저장된 데이터는 삭제됨.

 

데이터를 전송하지 않을때

 

위 캡쳐화면에서 클라이언트 -> 서버 Seq Number 1923

아래 캡쳐화면에서 서버 -> 클라이언트 Ack Number 1923

클라이언트가 보낸 TCP Segment가 0이었기 때문. 연결은 되어있는데 데이터는 안보냈다는것

 

 

데이터가 보내지지 않았을 때(ACK 응답 유실 혹은 지연)

ACK을 받지 못할 경우 발신자는 타이머가 만료될 때까지 기다린 후 데이터를 재전송해야 한다.

 

"재전송 타이머 (Retransmission Timer)": 여기서 "타이머" 는 TCP의 "재전송 타이머 (Retransmission Timer)" 를 의미

"타이머 만료 (timer to expire)": "타이머가 만료된다" 는 것은 "설정한 "시간 제한 내에 "ACK 메시지가 "도착하지 못했다는 의미"

 

tc 명령어로 tcp 패킷 응답의 20% 손실 발생시킴

 

 

ACK패킷이 유실되면서 재전송되고있음을 확인할 수 있음.

만약 재전송 타이머가 "만료될 때까지도 "ACK 메시지가 "도착하지 않으면", 송신자는 데이터 전송에 실패했다고 판단하고, 송신 버퍼에 보관해 두었던 데이터 복사본을 사용하여 데이터를 다시 전송한다.