跳轉到

1974 - Cerf 與 Kahn 的 TCP(網際網路的誕生)#

案件摘要#

1974 年 5 月,Vint Cerf(1943–) 與 Bob Kahn(1938–) 在 IEEE 《Communication Technology》發表 A Protocol for Packet Network Intercommunication:

\[ \boxed{\text{定義了一個協議,讓「任何網路」彼此互通}} \]

TCP 的核心設計驚人地優雅: - 分層:傳輸層(TCP,可靠)與網路層(IP,盡力而為)各司其職; - 端到端:可靠性交給兩端的電腦,而非網路本身; - 封包交換:資料切成小封包,各自尋路,到達後重組。

\[ \text{TCP(可靠傳輸)} + \text{IP(盡力路由)} = \text{網際網路}. \]

1983 年 1 月 1 日,ARPANET 正式切換到 TCP/IP—— 這一天被稱為「網際網路的生日」。 Cerf 與 Kahn 於 2004 年獲圖靈獎——網際網路是資訊科學最大的「結案」。

前因 -- 為什麼會有這個案子#

  • 香農的資訊理論(1948): Claude Shannon 證明任何資訊都可以被編碼為位元並在噪音信道中可靠傳輸—— 這是「數位通訊」的數學基礎(見 1948-香農資訊理論.md)。
\[ \text{Shannon(1948):資訊 = 位元} \xrightarrow{\text{TCP(1974):位元 = 封包}} \text{數位通訊的完成}. \]
  • Baran 與 Davies 的封包交換構想(1960s): 美國 RAND 公司的 Paul Baran 為了讓軍事通訊在核戰中存活, 提出「分布式通訊」——資料切成小塊,走不同的路; 英國 NPL 的 Donald Davies 獨立提出同樣概念,並命名為 封包交換(packet switching)。
  • ARPANET 上線(1969): Larry Roberts 主導,第一個封包交換網路誕生—— 4 台主機(UCLA、SRI、UCSB、Utah)用 IMP(介面訊息處理器)連線; 這是封包交換的第一次實戰驗證。
  • UNIX 與 UUCP(1973): Ken Thompson 與 Dennis Ritchie 的 UNIX 成為工程師的通用平台(見 1973-UNIX作業系統.md); UUCP 讓機器之間用電話線複製檔案與傳遞郵件—— 但這只是「點對點」的通訊,不是「網路互連」。
  • 網路巴別塔危機(1973): 當時並存的網路各有各的協議,互不相通:
\[ \text{ARPANET(陸線)} \;\; \text{PRNET(封包無線電)} \;\; \text{SATNET(衛星)} \;\; \text{互不連通} \]

DARPA 交給 Cerf 與 Kahn 的任務:讓這些異質網路變成「一個網路」——

\[ \boxed{\text{「網路中的網路」(internetwork)}} \]

線索與推理 -- 數學式、程式、理論#

第一條線索:封包交換 vs 電路交換#

傳統電話使用電路交換:通話前先建立專屬線路,全程獨佔—— 浪費頻寬,且一條線路斷了通話就斷。 封包交換:資料切成小封包,各自獨立尋路,統計多工共享頻寬——

\[ \text{電路交換:先建路、獨佔、脆弱} \quad\Longleftrightarrow\quad \text{封包交換:隨走路、共享、強韌} \]

一個封包走丟或某節點被炸掉,其他封包仍然會找到路—— 這正是 Baran「核戰存活」構想的實現。

第二條線索:分層協議與端到端原則#

Cerf 與 Kahn 的關鍵洞見:把問題分層—— - IP(網路層):只負責「盡力而為」地把封包送到目的地位址—— 可能丟包、可能亂序、可能重複,不管; - TCP(傳輸層):在兩端主機上,把不可靠的 IP 變成可靠的位元組流—— 重傳、排序、流量控制,全管。

\[ \boxed{\text{端到端原則:可靠性放在兩端,網路保持簡單}} \]

這就是 end-to-end argument(後由 Saltzer、Reed、Clark 於 1984 年正式闡述): 在網路中間做可靠性,既昂貴又做多餘——只需在端點做一次。

第三條線索:三向交握與可靠傳輸#

TCP 連線建立採用三向交握(three-way handshake),狀態轉移:

\[ \text{Client}: \text{CLOSED} \xrightarrow{\text{SYN}} \text{SYN-SENT} \xrightarrow{\text{ACK}} \text{ESTABLISHED} \]
\[ \text{Server}: \text{LISTEN} \xrightarrow{\text{SYN+ACK}} \text{SYN-RECEIVED} \xrightarrow{\text{ACK}} \text{ESTABLISHED} \]

可靠性機制: - 序號(sequence number):每個位元組都有編號,接收端可偵測丟包與亂序; - ACK 確認:收到就回報「下一個期待位元組」; - 重傳逾時(RTO):沒收到 ACK 就重傳; - 滑動視窗(sliding window):不必等每個封包確認才發下一個——

\[ \boxed{throughput \approx \frac{window}{RTT}} \]

吞吐量正比於視窗大小、反比於來回延遲——這是 TCP 效能的核心公式。 - IP 位址:32 位元 IPv4 位址(如 192.32.10.1)標識每台主機; 路由器依位址前綴查表轉發——「網路中的網路」靠位址統一。

Python:滑動視窗 + ACK + 重傳的可靠傳輸模擬#

import random

random.seed(42)

def reliable_transfer(n_packets, window=4, loss_rate=0.3, rtt_slots=2):
    """簡化 TCP:滑動視窗 + ACK + 重傳(丟包重新排入佇列)"""
    pending = list(range(n_packets))   # 尚未確認的封包佇列
    in_flight = {}                     # 已發出、倒數抵達的封包
    log, slots = [], 0
    while pending or in_flight:
        slots += 1
        # 1) 填滿視窗(視窗 = 允許在途的封包數上限)
        while pending and len(in_flight) < window:
            seq = pending.pop(0)
            in_flight[seq] = rtt_slots
            log.append(f"  slot {slots:2d}: SEND pkt{seq}")
        # 2) 網路:丟包(重新排入佇列 = 重傳)或延遲一拍後送達
        delivered = []
        for seq in list(in_flight):
            in_flight[seq] -= 1
            if random.random() < loss_rate:
                log.append(f"  slot {slots:2d}:      pkt{seq} LOST!")
                del in_flight[seq]
                pending.append(seq)
            elif in_flight[seq] <= 0:
                delivered.append(seq)
                del in_flight[seq]
        # 3) ACK 確認
        if delivered:
            log.append(f"  slot {slots:2d}: ACK  up to {max(delivered)}")
    return log, slots

log, slots = reliable_transfer(10, window=4, loss_rate=0.3)
print("可靠傳輸模擬(10 個封包,視窗=4,丟包率 30%):")
print("\n".join(log))
print(f"→ 全部 {10} 個封包確認完畢,共花 {slots} 個 slot")

# 吞吐量公式驗證:throughput ≈ window / RTT
print("\n吞吐量公式:throughput ≈ window / RTT")
for w, rtt in [(4, 2), (8, 2), (8, 8)]:
    print(f"  window={w}, RTT={rtt} → 吞吐量 ≈ {w/rtt:.1f} 封包/slot")
print("  → 視窗加倍則吞吐加倍;RTT 變長則吞吐下降(延遲頻寬積)")
輸出:
可靠傳輸模擬(10 個封包,視窗=4,丟包率 30%):
  slot  1: SEND pkt0
  slot  1: SEND pkt1
  slot  1: SEND pkt2
  slot  1: SEND pkt3
  slot  1:      pkt1 LOST!
  slot  1:      pkt2 LOST!
  slot  1:      pkt3 LOST!
  slot  2: SEND pkt4
  slot  2: SEND pkt5
  slot  2: SEND pkt6
  slot  2:      pkt6 LOST!
  slot  2: ACK  up to 0
  slot  3: SEND pkt7
  slot  3: SEND pkt8
  slot  3:      pkt5 LOST!
  slot  3:      pkt7 LOST!
  slot  3: ACK  up to 4
  slot  4: SEND pkt9
  slot  4: SEND pkt1
  slot  4: SEND pkt2
  slot  4:      pkt8 LOST!
  slot  4:      pkt9 LOST!
  slot  5: SEND pkt3
  slot  5: SEND pkt6
  slot  5:      pkt1 LOST!
  slot  5:      pkt6 LOST!
  slot  5: ACK  up to 2
  slot  6: SEND pkt5
  slot  6: SEND pkt7
  slot  6: SEND pkt8
  slot  6:      pkt8 LOST!
  slot  6: ACK  up to 3
  slot  7: SEND pkt9
  slot  7: SEND pkt1
  slot  7:      pkt9 LOST!
  slot  7:      pkt1 LOST!
  slot  7: ACK  up to 7
  slot  8: SEND pkt6
  slot  8: SEND pkt8
  slot  8: SEND pkt9
  slot  8: SEND pkt1
  slot  9: ACK  up to 9
→ 全部 10 個封包確認完畢,共花 9 個 slot

吞吐量公式:throughput ≈ window / RTT
  window=4, RTT=2 → 吞吐量 ≈ 2.0 封包/slot
  window=8, RTT=2 → 吞吐量 ≈ 4.0 封包/slot
  window=8, RTT=8 → 吞吐量 ≈ 1.0 封包/slot
  → 視窗加倍則吞吐加倍;RTT 變長則吞吐下降(延遲頻寬積)

結案 -- 後果與影響#

  • 旗艦轉換日(1983-01-01): ARPANET 於這一天全面關閉舊協議 NCP,切換到 TCP/IP——
\[ \boxed{\text{1983-01-01:網際網路的生日}} \]

不切換就斷線的「旗艦日(flag day)」策略看似冒險, 卻迫使所有節點一次到位——結果一次成功。 - 萬維網(1989): CERN 的 Tim Berners-Lee 在 TCP/IP 之上發明 HTTP + HTML + URL——萬維網誕生; 這與 Engelbart 的超文字構想(1968「所有展示之母」,見 1968-恩格巴特超文字.md) 遙相呼應——超文字 + 網際網路 = 全球資訊網。

\[ \text{TCP/IP(1983)} \xrightarrow{\text{WWW(1989)}} \text{全球資訊網(1991)}. \]
  • 全球普及與 IPv6: 1990 年代 DNS、瀏覽器與商業化讓網際網路席捲全球; IPv4 的 43 億個位址即將耗盡, IPv6 以 128 位元位址接棒(約 \(3.4\times10^{38}\) 個位址)—— Cerf 本人是推動 IPv6 的旗手。
  • 2004 圖靈獎與最高榮譽: ACM 將 2004 年圖靈獎頒給 Cerf 與 Kahn—— 「網際網路之父」的稱號實至名歸; 1997 年柯林頓總統頒國家科技獎章, 2005 年布希總統頒總統自由勳章(美國平民最高榮譽)。
\[ \text{論文(1974)} \xrightarrow{\text{旗艦日(1983)}} \text{網際網路} \xrightarrow{\text{圖靈獎(2004)}} \text{人類的神經系統}. \]
  • 歷史定位:Cerf 與 Kahn 是資訊科學的貝爾—— 貝爾的電話讓人類的聲音跨越距離, Cerf 與 Kahn 的 TCP 讓全人類的電腦彼此交談;
\[ \text{香農(1948)} \xrightarrow{} \text{ARPANET(1969)} \xrightarrow{} \text{TCP/IP(1974/1983)} \xrightarrow{} \text{WWW(1989)} \xrightarrow{} \text{萬物互聯}. \]

一切從那句「讓任何網路互通」開始。

關鍵人物與文獻#

  • V. Cerf 與 R. Kahn:A Protocol for Packet Network Intercommunication(1974,IEEE Trans. Comm.);2004 圖靈獎;2005 總統自由勳章。
  • P. Baran:On Distributed Communications(1964)——封包交換的軍事構想。
  • D. Davies:NPL 網路(1970)——獨立提出並命名 packet switching。
  • L. Roberts:ARPANET(1969)——第一個封包交換網路的主導者。
  • C. Shannon:資訊理論(1948)——數位通訊的數學基礎。
  • T. Berners-Lee:WWW(1989)——在 TCP/IP 之上的殺手級應用。
  • J. Saltzer, D. Reed, D. Clark:End-to-End Arguments in System Design(1984)——端到端原則的正式闡述。
  • 相關案件:1948-香農資訊理論.md、1973-UNIX作業系統.md、1968-恩格巴特超文字.md、1936-圖靈機.md。