개발 학습 실습실

이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.

공부 › 네트워크 › 전송 계층

TCP 연결과 재전송

패킷이 사라지면 누가 알아채고 다시 보내나

TCP는 데이터를 보내기 전에 연결을 맺고, 보낸 데이터를 어디까지 받았는지 확인을 받습니다. 확인이 오지 않으면 다시 보냅니다. UDP는 그런 절차 없이 그냥 보냅니다.

문서·표준 대조 · TCP 표준(RFC 9293)

이 실습에 나오는 개념

TCP와 UDP
인터넷에서 데이터를 전송하는 두 가지 대표적인 방식이다. TCP는 통신 전에 연결을 맺고, 데이터가 빠짐없이 순서대로 도착하도록 보장하며, 문제가 생기면 다시 보낸다. UDP는 연결 없이 데이터를 보내며 도착 여부나 순서를 보장하지 않는 대신 가볍고 빠르다. HTTP/1.1과 HTTP/2, 데이터베이스 연결은 TCP를, 실시간 영상·음성이나 DNS는 UDP를 주로 쓴다.
3-way handshake
TCP 연결을 맺을 때 거치는 세 단계의 과정이다. 클라이언트가 연결 요청(SYN)을 보내고, 서버가 수락과 함께 자신의 연결 요청(SYN+ACK)을 보내며, 클라이언트가 이를 확인(ACK)한다. 양쪽이 서로 보내고 받을 수 있는 상태임을 확인한 뒤 데이터 전송을 시작한다.
흐름 제어와 혼잡 제어
둘 다 TCP가 전송 속도를 조절하는 기능이다. 흐름 제어는 받는 쪽이 처리할 수 있는 양에 맞춰 보내는 양을 조절해 받는 쪽이 넘치지 않게 한다. 혼잡 제어는 네트워크가 막히는 정도를 감지해 보내는 양을 줄이거나 늘려 네트워크 전체의 혼잡을 막는다.

이렇게 바꿔 보세요

처음 설정으로 실행하면

  1. 1단계: 클라이언트가 "연결하고 싶다"는 SYN을 보냅니다. 자신이 쓸 시작 번호(100)를 알립니다.
  2. 2단계: 서버가 "받았다(ACK), 나도 연결하겠다(SYN)"고 답합니다. ack=101은 "100번까지 받았으니 다음은 101번을 달라"는 뜻입니다.
  3. 3단계: 클라이언트가 서버의 SYN을 확인합니다. 양쪽 모두 "내가 보낸 것이 도착하고, 상대가 보낸 것이 나에게 온다"는 것을 확인했습니다. 연결이 맺어졌습니다.
  4. 데이터를 조각내어 번호를 붙여 보냅니다.
  5. 서버가 "106번까지 받았다, 다음은 107번"이라고 확인합니다.
  6. 두 번째 조각을 보냅니다.
  7. 세 번째 조각을 보냅니다.
  8. 서버가 "115번까지 다 받았다"고 확인합니다.
  9. 보낼 것이 끝나면 양쪽이 각각 "나는 끝났다(FIN)"를 보내고 확인받아 연결을 닫습니다.

실행 결과

코드

// TCP: 연결을 맺은 뒤 보낸다
Socket socket = new Socket("shop.example", 443);   // 여기서 3-way handshake
OutputStream out = socket.getOutputStream();
out.write(data);                               // 운영체제가 조각내어 보내고
                                               // 확인, 재전송, 순서 맞추기를 처리
socket.close();                                // 연결 종료

이 모형의 전제

"안녕하세요"를 세 조각으로 나눠 보내는 작은 예입니다. 번호(seq, ack)는 이해를 돕기 위한 임의의 값이고 한글 한 글자를 3바이트로 계산했습니다. 재전송 시점은 단순화했습니다. 실제 TCP는 타이머 만료 외에 같은 확인 응답이 세 번 거듭 오면 바로 재전송하는 방식도 함께 씁니다. 3-way handshake와 재전송의 원리는 TCP 표준(RFC 9293)을 따랐습니다.

앞 실습: 소켓과 포트 · 다음 실습: TCP와 UDP

이 실습에 나오는 개념

이 실습에서 보는 것

설정

코드


      
    

그림

실행 비교

이렇게 바꿔 보세요