1974 - Cerf 與 Kahn 的 TCP(網際網路的誕生)#
案件摘要#
1974 年 5 月,Vint Cerf(1943–) 與 Bob Kahn(1938–) 在 IEEE 《Communication Technology》發表 A Protocol for Packet Network Intercommunication:
TCP 的核心設計驚人地優雅: - 分層:傳輸層(TCP,可靠)與網路層(IP,盡力而為)各司其職; - 端到端:可靠性交給兩端的電腦,而非網路本身; - 封包交換:資料切成小封包,各自尋路,到達後重組。
1983 年 1 月 1 日,ARPANET 正式切換到 TCP/IP—— 這一天被稱為「網際網路的生日」。 Cerf 與 Kahn 於 2004 年獲圖靈獎——網際網路是資訊科學最大的「結案」。
前因 -- 為什麼會有這個案子#
- 香農的資訊理論(1948): Claude Shannon 證明任何資訊都可以被編碼為位元並在噪音信道中可靠傳輸—— 這是「數位通訊」的數學基礎(見
1948-香農資訊理論.md)。
- 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): 當時並存的網路各有各的協議,互不相通:
DARPA 交給 Cerf 與 Kahn 的任務:讓這些異質網路變成「一個網路」——
線索與推理 -- 數學式、程式、理論#
第一條線索:封包交換 vs 電路交換#
傳統電話使用電路交換:通話前先建立專屬線路,全程獨佔—— 浪費頻寬,且一條線路斷了通話就斷。 封包交換:資料切成小封包,各自獨立尋路,統計多工共享頻寬——
一個封包走丟或某節點被炸掉,其他封包仍然會找到路—— 這正是 Baran「核戰存活」構想的實現。
第二條線索:分層協議與端到端原則#
Cerf 與 Kahn 的關鍵洞見:把問題分層—— - IP(網路層):只負責「盡力而為」地把封包送到目的地位址—— 可能丟包、可能亂序、可能重複,不管; - TCP(傳輸層):在兩端主機上,把不可靠的 IP 變成可靠的位元組流—— 重傳、排序、流量控制,全管。
這就是 end-to-end argument(後由 Saltzer、Reed、Clark 於 1984 年正式闡述): 在網路中間做可靠性,既昂貴又做多餘——只需在端點做一次。
第三條線索:三向交握與可靠傳輸#
TCP 連線建立採用三向交握(three-way handshake),狀態轉移:
可靠性機制: - 序號(sequence number):每個位元組都有編號,接收端可偵測丟包與亂序; - ACK 確認:收到就回報「下一個期待位元組」; - 重傳逾時(RTO):沒收到 ACK 就重傳; - 滑動視窗(sliding window):不必等每個封包確認才發下一個——
吞吐量正比於視窗大小、反比於來回延遲——這是 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——
不切換就斷線的「旗艦日(flag day)」策略看似冒險, 卻迫使所有節點一次到位——結果一次成功。 - 萬維網(1989): CERN 的 Tim Berners-Lee 在 TCP/IP 之上發明 HTTP + HTML + URL——萬維網誕生; 這與 Engelbart 的超文字構想(1968「所有展示之母」,見 1968-恩格巴特超文字.md) 遙相呼應——超文字 + 網際網路 = 全球資訊網。
- 全球普及與 IPv6: 1990 年代 DNS、瀏覽器與商業化讓網際網路席捲全球; IPv4 的 43 億個位址即將耗盡, IPv6 以 128 位元位址接棒(約 \(3.4\times10^{38}\) 個位址)—— Cerf 本人是推動 IPv6 的旗手。
- 2004 圖靈獎與最高榮譽: ACM 將 2004 年圖靈獎頒給 Cerf 與 Kahn—— 「網際網路之父」的稱號實至名歸; 1997 年柯林頓總統頒國家科技獎章, 2005 年布希總統頒總統自由勳章(美國平民最高榮譽)。
- 歷史定位:Cerf 與 Kahn 是資訊科學的貝爾—— 貝爾的電話讓人類的聲音跨越距離, Cerf 與 Kahn 的 TCP 讓全人類的電腦彼此交談;
一切從那句「讓任何網路互通」開始。
關鍵人物與文獻#
- 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。