핵심 인사이트 (3줄 요약)
- 포트 번호 쌍 (Multiplexing): TCP 헤더의 맨 앞 4바이트를 차지하는 출발지(Source)와 목적지(Destination) 포트 번호 쌍은, 한 가닥의 랜선을 통해 쏟아져 들어오는 수만 개의 패킷들을 정확한 컴퓨터 내부의 프로그램(카톡, 크롬) 방으로 안내하는 완벽한 갈림길 이정표다.
- 시퀀스 넘버 (Sequence Number, 32bit): TCP가 10GB짜리 영화 파일을 1460바이트씩 조각내어 보낼 때, 수신자가 나중에 조각들을 원래 영화로 예쁘게 조립할 수 있도록 1바이트 단위로 "이 조각은 전체 10GB 중 123,456번째 바이트부터 시작하는 조각이야!"라고 적어두는 32비트짜리 번호표다.
- ISN (초기 시퀀스 번호의 보안성): 통신을 처음 시작할 때 1번부터 시작하면 해커가 다음 번호를 예측해 가짜 패킷(세션 하이재킹)을 밀어 넣을 수 있으므로, 운영체제는 처음 악수(SYN)를 할 때 무작위로 뽑은 난수(Initial Sequence Number, ISN) 1개를 던지며 시작하는 고도의 보안 룰을 따른다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: TCP 세그먼트 헤더의 최상단에 위치하여 애플리케이션 프로세스를 식별하는 포트 필드(각 16비트)와, 바이트 스트림의 순서 보장을 위해 데이터의 바이트 오프셋 위치를 기록하는 시퀀스 번호 필드(32비트).
-
필요성: 인터넷(IP)이라는 고속도로는 패킷들의 순서를 100% 뒤죽박죽으로 만든다. 내가 "A, B, C" 순서로 던져도 도착할 땐 "C, A, B"로 올 확률이 농후하다. 1GB 영화의 조각이 뒤죽박죽 도착하면 영화 재생은 불가능하다. "택배 상자를 보낼 때 겉면에 조립 설명서 번호(Sequence Number)를 정확히 찍어 보내야, 받는 사람이 창고에 쌓아뒀다가 1번부터 1,000번까지 풀을 발라(Reassembly) 원본을 복구할 수 있지 않겠나!"
-
💡 비유: 시퀀스 넘버는 10,000피스짜리 직소 퍼즐 뒷면에 적힌 **"퍼즐 좌표 번호"**와 같습니다.
- 퍼즐 1만 조각(패킷들)을 박스에 담아 택배로 보냈는데 박스가 터져서 바닥에 다 쏟아졌습니다(순서 뒤섞임).
- 하지만 걱정 없습니다. 각 퍼즐 뒷면(TCP 헤더)에는
(X:12, Y:45)라는 **정확한 고유 위치 번호(Seq)**가 인쇄되어 있습니다. - 받는 사람은 그냥 뒷면 번호만 보고 순서대로 끼워 맞추기만 하면 원래 그림(1GB 파일 원본)이 100% 복구됩니다.
📢 섹션 요약 비유: 포트 번호가 우체국 직원이 편지를 들고 **"아파트 101호(크롬), 102호(카톡)"**를 찾아가게 해주는 동호수라면, 시퀀스 넘버는 그 101호 주인이 받은 장문의 편지 100장에 적혀 있는 **"페이지 번호(1쪽, 2쪽, 3쪽...)"**입니다. 이 두 개가 합쳐져야 완벽한 배달과 조립이 끝납니다.
Ⅱ. Sequence Number의 동작과 바이트 계산 원리 (Deep Dive)
1. 바이트(Byte) 단위의 계산 철학
가장 많이 헷갈리는 부분이다. TCP 시퀀스 넘버는 "1번 패킷, 2번 패킷, 3번 패킷" 식으로 패킷 개수를 세지 않는다. 철저하게 바이트(Byte) 단위의 오프셋(위치)을 세는 무식한 카운터다.
- 내가 100바이트, 100바이트, 100바이트짜리 3개의 짐을 연속해서 보낸다고 치자. (최초 ISN이 0번이라 가정).
- 첫 번째 패킷의 헤더:
Seq = 0(내용물은 0 ~ 99번 바이트) - 두 번째 패킷의 헤더:
Seq = 100(내용물은 100 ~ 199번 바이트) - 세 번째 패킷의 헤더:
Seq = 200(내용물은 200 ~ 299번 바이트) - 만약 두 번째 패킷이 해저 케이블에서 유실됐다면? 수신자는 100번부터 199번 바이트까지의 100개 이빨이 빠졌다는 걸 정확히 계산해 내고 송신자에게 항의한다.
2. 난수 생성: ISN (Initial Sequence Number)
통신을 시작할 때, 양쪽 컴퓨터는 무조건 0번부터 시작하지 않는다.
- 내 PC는 운영체제 시계 등을 조합해 난수표에서
3,141,592라는 미친 숫자를 툭 뽑아서 첫 번째 패킷(SYN)의Seq로 삼는다. - 왜 이렇게 귀찮은 짓을 할까?
- 만약 항상 0부터 시작한다면, 해커가 내 PC인 척 위장(IP 스푸핑)하고
Seq=1인 가짜 접속 종료(FIN) 패킷을 서버에 던져버리면, 서버는 "아, 진짜 유저가 1번 순서로 접속 끊으라네?" 하고 홀라당 세션을 끊어버리는 대참사(TCP Session Hijacking)가 발생한다. - 난수(ISN)로 시작하면 해커가 다음 번호를 예측할 확률이 43억 분의 1로 떨어지므로 완벽한 보안 방어막이 형성된다.
┌─────────────────────────────────────────────────────────────┐
│ 와이어샤크(Wireshark)에서 보는 Relative Seq 번호 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [ 실제 인터넷 위를 날아다니는 진짜 패킷의 번호 (Raw) ] │
│ Seq = 3,456,789,123 (복잡해서 인간이 눈으로 분석 불가능!) │
│ │
│ [ 와이어샤크가 엔지니어 뇌 보호를 위해 보여주는 가짜 번호 (Relative) ] │
│ Seq = 1 │
│ │
│ * 팁: 와이어샤크는 최초 접속 시 뽑힌 미친 난수(ISN)를 지가 알아서 │
│ `0` 또는 `1`로 치환(Relative)해서 1, 2, 3 순서로 예쁘게 │
│ 보여준다. 실제론 저 32비트짜리 괴물 같은 숫자가 돌아가고 있다. │
└─────────────────────────────────────────────────────────────┘
3. 32비트의 랩어라운드 (Wrap-around)
시퀀스 넘버는 32비트 공간이라 최대 42억 바이트(약 4GB)까지 번호를 매길 수 있다. 그런데 요새 4K 영화는 10GB가 넘는다. 번호가 모자라면 어떻게 할까? 42억을 찍으면 다시 **0번으로 리셋(Wrap-around)**되어 뺑뺑이 돈다. 수신자는 이 뺑뺑이를 인지하고 똑똑하게 데이터를 이어 붙인다. (요새는 10Gbps 광랜 때문에 0.01초 만에 42억 번호표가 고갈되어 번호가 겹치는 참사가 발생하므로, 타임스탬프 옵션을 곁들여 이를 방어한다).
📢 섹션 요약 비유: ISN(초기 시퀀스 번호) 생성은 첩보원들의 **"오늘의 암구호 페이지 펼치기"**입니다. 항상 책의 1쪽부터 읽지 않고, 그날그날 무작위로 **"오늘은 3,141쪽부터 읽자"**고 합의하여, 스파이가 중간에 1쪽의 내용을 위조해서 끼워 넣어도 단박에 가짜임을 색출해 냅니다.