이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
공부 › 네트워크 › 전송 계층
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가 전송 속도를 조절하는 기능이다. 흐름 제어는 받는 쪽이 처리할 수 있는 양에 맞춰 보내는 양을 조절해 받는 쪽이 넘치지 않게 한다. 혼잡 제어는 네트워크가 막히는 정도를 감지해 보내는 양을 줄이거나 늘려 네트워크 전체의 혼잡을 막는다.
이렇게 바꿔 보세요
- 처음 설정으로 — TCP, 유실 없음. 연결을 맺고 데이터를 보내고 확인받습니다.
- 데이터 조각이 사라지면 — 확인이 오지 않아 다시 보냅니다.
- 연결 요청이 사라지면 — 응답이 없으면 기다렸다가 다시 시도합니다.
- 같은 유실을 UDP로 — 사라진 조각은 그대로 사라집니다.
처음 설정으로 실행하면
- 1단계: 클라이언트가 "연결하고 싶다"는 SYN을 보냅니다. 자신이 쓸 시작 번호(100)를 알립니다.
- 2단계: 서버가 "받았다(ACK), 나도 연결하겠다(SYN)"고 답합니다. ack=101은 "100번까지 받았으니 다음은 101번을 달라"는 뜻입니다.
- 3단계: 클라이언트가 서버의 SYN을 확인합니다. 양쪽 모두 "내가 보낸 것이 도착하고, 상대가 보낸 것이 나에게 온다"는 것을 확인했습니다. 연결이 맺어졌습니다.
- 데이터를 조각내어 번호를 붙여 보냅니다.
- 서버가 "106번까지 받았다, 다음은 107번"이라고 확인합니다.
- 두 번째 조각을 보냅니다.
- 세 번째 조각을 보냅니다.
- 서버가 "115번까지 다 받았다"고 확인합니다.
- 보낼 것이 끝나면 양쪽이 각각 "나는 끝났다(FIN)"를 보내고 확인받아 연결을 닫습니다.
실행 결과
- TCP는 번호와 확인 응답으로 유실을 감지해 다시 보내고, 순서가 뒤바뀌어 도착해도 번호대로 맞춰서 애플리케이션에 넘깁니다. 애플리케이션은 유실을 전혀 모릅니다. 그 대가로 연결을 맺는 왕복과, 유실 시 뒤따르는 데이터까지 기다리게 되는 지연이 있습니다.
- 받는 쪽이 처리할 수 있는 만큼만 보내도록 조절하는 것이 흐름 제어, 네트워크가 막히면 보내는 속도를 줄이는 것이 혼잡 제어입니다. 유실이 생기면 TCP는 네트워크가 막혔다고 보고 속도를 낮춥니다.
코드
// 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