합동회사 코무라소프트
TCP101

그림과 연습 문제로 이해하는 TCP

「타임아웃 로그는 보이는데, 그 다음을 조사할 수 없다」「패킷 캡처를 열어도 seq 나 ack 의 숫자가 무엇을 말하는지 모르겠다」 — TCP 는 매일 쓰고 있는데도, 그 내부는 의외로 설명하기 어렵습니다. 이 강좌에서는 TCP 를 통째로 암기하는 것이 아니라, 캡처와 장애 로그를 시퀀스 번호와 윈도우의 시점에서 스스로 따라갈 수 있게 되는 것을 목표로 합니다. 그림으로 전체상을 잡고, 각 장의 중간에 있는 소문제와 손계산으로 확인하면서 나아가는 구성입니다.

그림 → 손계산 → 시뮬레이터 → 케이스 연습 전 43 문제 브라우저 내 채점 localStorage 저장
소요 시간
3〜4 시간
문제 수
전 43 문제
형식
7 장 + 소문제 + 시뮬레이터
비용
무료
잃어버리고·흐트러뜨리고·중복시키는 IP 위에 TCP 와 UDP 가 올라가고, TCP 가 3 가지 약속을 제공하는 계층 구조의 그림

IP 는 「아마 도착한다」까지밖에 약속하지 않습니다. 그 위에 올라간 TCP 가 애플리케이션을 대신해 3 가지 약속을 지킵니다. 먼저 이 역할 분담을 머리에 두면, 이후의 모든 장이 읽기 쉬워집니다.

이 강좌의 특징

본문 바로 아래에 소문제
읽은 직후에 2〜3 문제씩 푸는 구성이므로, 「이해한 것 같은 기분」인 채로 앞으로 나아가기 어렵게 되어 있습니다.
seq / ack 를 손으로 계산한다
시퀀스 번호와 ACK 번호, 윈도우의 잔여, cwnd 의 성장을 작은 수로 실제로 계산하여, 캡처의 숫자를 읽을 수 있는 감각을 만듭니다.
슬라이딩 윈도우 시뮬레이터
제 4 장의 시뮬레이터에서 RTT·윈도우·대역폭을 움직이면 「1 RTT 에 보낼 수 있는 양」과 스루풋 상한이 어떻게 바뀌는지를 눈으로 확인할 수 있습니다.
브라우저 내 채점·등록 불필요
전 43 문제는 브라우저 안에서 채점되며, 결과는 사용 중인 브라우저의 localStorage 에만 저장됩니다. 서버에는 아무것도 전송하지 않습니다.

이 강좌를 관통하는 3 가지 약속

TCP 의 구조는 많아 보이지만, 모두 3 가지 약속 중 어느 하나를 지키기 위한 도구입니다. 장이 진행될수록, 각각의 약속을 지탱하는 부품이 늘어나는 이미지입니다.

1. 반드시 도착한다 — 도착하지 않으면 알아챈다
보낸 바이트에는 번호가 매겨지고, 상대는 「어디까지 받았는가」를 돌려준다. 돌아오지 않으면 재전송한다. (제 2〜3 장)
2. 순서대로
도중에 추월이나 중복이 일어나도, 수신 측은 번호를 의지해 원래의 바이트열을 다시 정렬한 뒤에 앱에 건넨다. (제 3 장, 제 6 장)
3. 상대와 네트워크에 맞춰 보낸다
상대 버퍼의 사정(흐름 제어)과 경로 혼잡의 사정(혼잡 제어), 그 양쪽보다 빠르게는 보내지 않는다. (제 4〜5 장)

이 강좌의 표어: 캡처나 장애 로그를 보면, 거기서 생각을 멈추지 말고 물어보세요 — 지금 깨지려 하는 것은, 도달의 약속인가? 순서인가? 페이스 맞추기인가?

장 구성

수강 요령

  1. 본문 → 바로 아래의 소문제 순서로 진행해 주세요. 모아서 나중에 푸는 것보다, 읽은 직후에 푸는 편이 더 잘 정착합니다.
  2. 제 3〜5 장의 계산 문제는 암산으로 끝내지 말고, 바이트의 번호와 윈도우의 끝을 종이에 적어 주세요. 캡처의 숫자를 「읽을 수 있는」 감각은 손에서 옵니다.
  3. 제 4 장의 시뮬레이터는 소문제를 풀기 전과 후에 양쪽 모두 만져 주세요. 「윈도우 ÷ RTT」의 식이 체감으로 바뀝니다.
  4. 제 7 장의 케이스 문제에서 막히면, 대응하는 장으로 돌아가 1〜2 바퀴만 복습해 주세요. 전부 다시 할 필요는 없습니다.

시작 전 전제

  • 어떤 언어로든 프로그램을 써 본 경험이 조금 있으면 충분합니다. 네트워크의 전문 지식은 전제하지 않습니다.
  • 곱셈·나눗셈과 「바이트 수의 덧셈」이 가능하면, 손계산은 모두 진행할 수 있습니다.
  • IP 주소가 「목적지를 가리키는 주소」라는 것을 알고 있으면 괜찮습니다. 라우팅의 세부 사항에는 들어가지 않습니다.