TCP/IP协议栈

**網際網路協議套組**（英語：Internet Protocol Suite，縮寫 IPS）是網路通訊模型，以及整個網路傳輸協定家族，為網際網路的基礎通訊架構。它常通稱為 **TCP/IP 協定套組**（英語：TCP/IP Protocol Suite，或 TCP/IP Protocols），簡稱 **TCP/IP**。因為該協定家族的兩個核心協定：**TCP（傳輸控制協定）** 和 **IP（網際網路協定）** ，為該家族中最早通過的標準。由於在網路通訊協定普遍採用分層的結構，當多個層次的協定共同工作時，類似電腦科學中的堆疊，因此又稱為 **TCP/IP 協定疊**（英語：TCP/IP Protocol Stack） 。這些協定最早發源於美國國防部（縮寫為 DoD）的 ARPA 網專案，因此也稱作 **DoD 模型**（DoD Model）。這個協定套組由網際網路工程任務組負責維護。

TCP/IP 提供了點對點連結的機制，將資料應該如何封裝、定址、傳輸、路由以及在目的地如何接收，都加以標準化。它將軟體通訊過程抽象化為四個抽象層，採取協定堆疊的方式，分別實作出不同通訊協定。協定套組下的各種協定，依其功能不同，分別歸屬到這四個階層之中，常視為是簡化的七層 OSI 模型。

## 歷史

### 研發初期

1983 年 1 月 1 日，在網際網路的前身（ARPA 網）中通訊方式換成新的定義，TCP/IP 取代舊的網路控制協定（NCP，Network Control Protocol），從而成為今天的網際網路的基石。最早的 TCP/IP 由文頓・瑟夫和羅伯特・卡恩兩位開發，慢慢地通過競爭戰勝其他一些網路協定的方案，比如國際標準化組織 ISO 的 OSI 模型。TCP/IP 的蓬勃發展發生在 1990 年代中期。當時一些重要而可靠的工具的出世，例如頁面描述語言 HTML 和瀏覽器 Mosaic，促成了網際網路應用的飛速發展。
隨著網際網路的發展，目前流行的 IPv4 協定（網際網路協定版本四）已經接近它的功能上限。IPv4 最致命的兩個缺陷在於：

* 位址只有 32 位元，IP 位址空間有限；
* 不支援服務品質（Quality of Service，QoS）的想法，無法管理頻寬和優先級，故而不能很好的支援現今越來越多及時的語音和視訊應用。因此 IPv6（網際網路協定版本六）浮出水面，用以取代 IPv4。

TCP/IP 成功的另一個因素在於對為數眾多的低層協定的支援。這些低層協定對應 OSI 模型中的第一層（實體層）和第二層（資料連結層）。每層的所有協定幾乎都有一半數量支援 TCP/IP，例如：乙太網路（Ethernet）、權杖環（Token Ring）、光纖資料分布介面（FDDI）、對等協定（PPP）、X.25、影格中繼（Frame Relay）、ATM、Sonet、SDH 等通訊方法中都可以應用。

### 標準化

## 研製背景

最初想到讓不同電腦之間實現連接的，是美國加州大學洛杉磯分校網路工作小組的史蒂芬・克羅克（Stephen D. Crocker）。1970 年，克羅克及其小組著手制定最初的主機對主機通訊協定，它稱為**網路控制協定**（Network Control Protocol，縮寫 NCP）。該協定用於阿帕網，並在局部網路條件下執行穩定，但隨著阿帕網使用者的增多，NCP 逐漸暴露出兩大缺陷：

1. NCP 只是一台主機對另一台主機的通訊協定，並未給網路中的每台電腦設定唯一的位址，結果就造成電腦在越來越龐大的網路中難以準確定位需要傳輸資料的物件。
2. NCP 缺乏糾錯功能，這樣一來，資料在傳輸過程中一旦出現錯誤，網路就可能停止執行。出錯電腦增多，使得網路執行效率大打折扣。

## 開發過程

在構建阿帕網先驅之後，DARPA 開始其他資料傳輸技術的研究。NCP 誕生後兩年，1972 年，羅伯特・卡恩（Robert E. Kahn）受僱於 DARPA 的資訊科技處理辦公室，在那裡他研究衛星封包網路和地面無線封包網路，並且意識到能夠在它們之間溝通的價值。在 1973 年春天，已有的 ARPANET 網路控制程式（NCP）協定的開發者文頓・瑟夫（Vinton Cerf）加入到卡恩為 ARPANET 設計下一代協定而開發開放互連模型的工作中。到了 1973 年夏天，卡恩和瑟夫很快開發出基本的改進形式，其中的網路協定之間的差異通過使用公用網際網路協定而隱藏起來，且可靠性由主機保證而不是 ARPANET 那樣由網路保證。瑟夫稱讚了 Hubert Zimmerman 和 Louis Pouzin（CYCLADES 網路的設計者）在這個設計上發揮重要影響。

由於網路的作用減少到最小的程度，更有可能將任何網路連接到一起，而不用管它們不同的特點，這樣能解決卡恩最初的問題。流行的說法提到瑟夫和卡恩工作的最終產品 TCP/IP 將在執行「兩個罐子和一根弦」上，實際上它已經用在信鴿上。一個稱為閘道（後來改為路由器以免與閘道混淆）的電腦為每個網路提供一個介面並且在它們之間來回傳輸封包。這個設計思想更細的形式由瑟夫在斯坦福的網路研究組的 1973 年–1974 年期間開發出來。處於同一時期誕生 PARC 通用包協定組的全錄 PARC 早期網路研究工作也有著重要的技術影響；人們在兩者之間搖擺不定。DARPA 於是與 BBN、斯坦福和倫敦大學簽署協定開發不同硬體平台上協定的執行版本。有四個版本開發出來 ——TCP v1、TCP v2、在 1978 年春天分成 TCP v3 和 IP v3 的版本，後來就是穩定的 TCP/IP v4—— 目前網際網路仍然使用的標準協定。

1975 年，兩個網路之間的 TCP/IP 通訊在斯坦福和倫敦大學（UCL）之間進行測試。1977 年 11 月，三個網路之間的 TCP/IP 測試在美國、英國和挪威之間進行。在 1978 年到 1983 年間，其他一些 TCP/IP 原型在多個研究中心之間開發出來。ARPANET 完全轉換到 TCP/IP 在 1983 年 1 月 1 日發生。1984 年，美國國防部將 TCP/IP 作為所有電腦網路的標準。1985 年，網際網路架構理事會舉行爲期三天有 250 家廠商代表參加的關於計算產業使用 TCP/IP 的工作會議，幫助協定的推廣並且引領它日漸增長的商業應用。

2005 年 9 月 9 日卡恩和瑟夫由於對美國文化的卓越貢獻獲總統自由勳章。

## TCP/IP 協定棧組成

整個通訊網路的任務，可以劃分成不同的功能區塊，即所謂的層級（layer）。用於網際網路的協定可以比照 TCP/IP 參考模型進行分類。TCP/IP 協定棧起始於第三層協定 IP（網際協定）。所有這些協定都在相應的 RFC 文件中討論及標準化。重要的協定在相應的 RFC 文件中均標記狀態：「必須」（required），「推薦」（recommended），「可選」（selective）。其他的協定還可能有「試驗」（experimental）或「歷史」（historic）的狀態。」

## 必須協定

所有的 TCP/IP 應用都必須實現 IP 和 ICMP。對於一個路由器（router）而言，有這兩個協定就可以運作，雖然從應用的角度來看，這樣一個路由器意義不大。實際的路由器一般還需要執行許多「推薦」使用的協定，以及一些其他的協定。
幾乎所有連接到網際網路上的電腦上都存在的 IPv4 協定出生在 1981 年，今天的版本和最早的版本並沒有多少改變。升級版 IPv6 的工作始於 1995 年，目的在於取代 IPv4。ICMP 協定主要用於收集有關網路的資訊尋找錯誤等工作。

## 範例：不同電腦執行的不同協定

* 一個簡單的路由器上可能會實現 ARP，IP，ICMP，UDP，SNMP，RIP。
* WWW 使用者端使用 ARP，IP，ICMP，UDP，TCP，DNS，HTTP，FTP。
* 一台使用者電腦上還會執行如 TELNET，SMTP

## TCP/IP 參考模型

**TCP/IP 參考模型**是一個抽象的分層模型，這個模型中，所有的 TCP/IP 系列網路協定都歸類到 4 個抽象的「層」中。每一抽象層建立在低一層提供的服務上，並且為高一層提供服務。
完成一些特定的任務需要眾多的協定協同工作，這些協定分布在參考模型的不同層中的，因此有時稱它們為一個_協定疊_。
TCP/IP 參考模型為 TCP/IP 協定疊訂身製作。其中 IP 協定只關心如何使得資料能夠跨越本地網路邊界的問題，而不關心如何利用傳輸媒體，資料如何傳輸。整個 TCP/IP 協定疊則負責解決資料如何通過許許多多個對等通路（一個對等通路，也稱為一「跳」, 1 hop）順利傳輸，由此不同的網路成員能夠在許多「跳」的基礎上建立相互的資料通路。
如想分析更普遍的網路通訊問題，ISO 的 OSI 模型也能起更好的幫助作用。**網際網路協定套組**是一組實現支援網際網路和大多數商業網路執行的協定疊的網路傳輸協定。它有時也稱為 **TCP/IP 協定組**，這個名稱來源於其中兩個最重要的協定：傳輸控制協定（TCP）和網際網路協定（IP），它們也是最先定義的兩個協定。
同許多其他協定一樣網路傳輸協定也可以看作一個多層組合，每層解決資料傳輸中的一組問題並且向使用這些低層服務的高層提供定義好的服務。高層邏輯上與使用者更為接近，所處理資料更為抽象，它們依賴於低層將資料轉換成最終能夠進行實體控制的形式。
網路傳輸協定能夠大致匹配到一些廠商喜歡使用的固定 7 層的 OSI 模型。然而這些層並非都能夠很好地與基於 IP 的網路對應（根據應用的設計和支援網路的不同它們確實是涉及到不同的層）並且一些人認為試圖將網際網路協定組對應到 OSI 會帶來混淆而不是有所幫助。

### 網際網路協定疊中的層

人們已經進行一些討論關於如何將 TCP/IP 參考模型對映到 OSI 模型。由於 TCP/IP 和 OSI 模型組不能精確地匹配，還沒有一個完全正確的答案。
另外，OSI 模型下層還不具備能夠真正占據真正層的位置的能力；在傳輸層和網路層之間還需要另外一個層（網路互連層）。特定網路類型專用的一些協定應該執行在網路層上，但是卻執行在基本的硬體影格交換上。類似協定的例子有 ARP 和 STP（用來保持冗餘網橋的空閒狀態直到真正需要它們）。然而，它們是本地協定並且在網路互連功能下面執行。不可否認，將兩個組（更不用說它們只是執行在如 ICMP 等不同的互連網路協定上的邏輯上的網路層的一部分）整個放在同一層會引起混淆，但是 OSI 模型還沒有複雜到能夠做更好的工作。
下面的圖表試圖顯示不同的 TCP/IP 和其他的協定在最初 OSI 模型中的位置：

通常人們認為 OSI 模型的最上面三層（應用層、表現層和會議層）在 TCP/IP 組中是一個應用層。由於 TCP/IP 有一個相對較弱的會議層，由 TCP 和 RTP 下的打開和關閉連接組成，並且在 TCP 和 UDP 下的各種應用提供不同的埠號，這些功能能夠由單個的應用程式（或者那些應用程式所使用的庫）增加。與此相似的是，IP 是按照將它下面的網路當作一個黑盒子的思想設計的，這樣在討論 TCP/IP 的時候就可以把它當作一個獨立的層。

#### 應用層

該層包括所有和應用程式協同工作，利用基礎網路交換應用程式專用的資料的協定。
應用層是大多數普通與網路相關的程式為了通過網路與其他程式通訊所使用的層。這個層的處理過程是應用特有的；資料從網路相關的程式以這種應用內部使用的格式進行傳送，然後編碼成標準協定的格式。

一些特定的程式視爲在此層運行。它們提供服務直接支援使用者應用。這些程式和它們對應的協定包括 HTTP（全球資訊網服務）、FTP（檔案傳輸）、SMTP（電子郵件）、SSH（安全遠端登入）、DNS（名稱⇔IP 位址尋找）以及許多其他協定。

一旦從應用程式來的資料編碼成一個標準的應用層協定，它將傳送到 IP 棧的下一層。

在傳輸層，應用程式最常用的是 TCP 或者 UDP，並且伺服器應用程式經常與一個公開的埠號相聯絡。伺服器應用程式的埠由網際網路號分碼配局（IANA）正式地分配，但是現今一些新協定的開發者經常選擇它們自己的埠號。由於在同一個系統上很少超過少數幾個的伺服器應用，埠衝突引起的問題很少。應用軟體通常也允許使用者強制性地指定埠號作為執行參數。

連結外部的客戶端程式通常使用系統分配的一個隨機埠號。監聽一個埠並且通過伺服器將那個埠傳送到應用的另外一個副本以建立對等連結（如 IRC 上的 dcc 檔案傳輸）的應用也可以使用一個隨機埠，但是應用程式通常允許定義一個特定的埠範圍的規範以允許埠能夠通過實現網路位址轉換（NAT）的路由器對映到內部。

每一個應用層（TCP/IP 參考模型的最高層）協定一般都會使用到兩個傳輸層協定之一：
面向連接的 TCP 傳輸控制協定和無連接的包傳輸的 UDP 使用者資料報協定。
常用的應用層協定有：

　
: 執行在 TCP 協定上的協定：

　
: * HTTP（Hypertext Transfer Protocol，超文字傳輸協定），主要用於普通瀏覽。
* HTTPS（Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL，安全超文字傳輸協定）,HTTP 協定的安全版本。
* FTP（File Transfer Protocol，檔案傳輸協定），由名知義，用於檔案傳輸。
* POP3（Post Office Protocol, version 3，郵局協定），收郵件用。
* SMTP（Simple Mail Transfer Protocol，簡單郵件傳輸協定），用來傳送電子郵件。
* TELNET（Teletype over the Network，網路電傳），通過一個終端（terminal）登陸到網路。
* SSH（Secure Shell，用於替代安全性差的 TELNET），用於加密安全登陸用。

　
: 執行在 UDP 協定上的協定：

　
: * BOOTP（Boot Protocol，啟動協定），應用於無盤裝置。
* NTP（Network Time Protocol，網路時間協定），用於網路同步。
* DHCP（Dynamic Host Configuration Protocol，動態主機組態協定），動態組態 IP 位址。

　
: 其他：

　
: * DNS（Domain Name Service，域名服務），用於完成位址尋找，郵件轉發等工作（執行在 TCP 和 UDP 協定上）。
* ECHO（Echo Protocol，迴繞協定），用於查錯及測量應答時間（執行在 TCP 和 UDP 協定上）。
* SNMP（Simple Network Management Protocol，簡單網路管理協定），用於網路資訊的收集和網路管理。
* ARP（Address Resolution Protocol，位址解析協定），用於動態解析乙太網路硬體的位址。

#### 傳輸層

傳輸層（transport layer）的協定，能夠解決諸如端到端可靠性（「資料是否已經到達目的地？」）和保證資料按照正確的順序到達這樣的問題。在 TCP/IP 協定組中，傳輸協定也包括所給資料應該送給哪個應用程式。
在 TCP/IP 協定組中技術上位於這個層的動態路由協定通常認為是網路層的一部分；一個例子就是 OSPF（IP 協定 89）。
TCP（IP 協定 6）是一個「可靠的」、面向連結的傳輸機制，它提供一種可靠的位元組流保證資料完整、無失真並且按順序到達。TCP 儘量連續不斷地測試網路的負載並且控制傳送資料的速度以避免網路過載。另外，TCP 試圖將資料按照規定的順序傳送。這是它與 UDP 不同之處，這在及時資料流或者路由高網路層遺失率應用的時候可能成為一個缺陷。
較新的 SCTP 也是一個「可靠的」、面向連結的傳輸機制。它是面向記錄而不是面向位元組的，它在一個單獨的連結上提供通過多路復用提供的多個子流。它也提供多路自定址支援，其中連結終端能夠以多個 IP 位址表示（代表多個實體介面），這樣的話即使其中一個連接失敗了也不中斷。它最初是為電話應用開發的（在 IP 上傳輸 SS7），但是也可以用於其他的應用。
UDP（IP 協定號 17）是一個無連結的資料報協定。它是一個「盡力傳遞」（best effort）或者說「不可靠」協定 —— 不是因為它特別不可靠，而是因為它不檢查封包是否已經到達目的地，並且不保證它們按順序到達。如果一個應用程式需要這些特性，那它必須自行檢測和判斷，或者使用 TCP 協定。
UDP 的典型性應用是如串流媒體（音訊和視訊等）這樣按時到達比可靠性更重要的應用，或者如 DNS 尋找這樣的簡單查詢／回應應用，如果建立可靠的連結所作的額外工作將是不成比例地大。
DCCP 目前正由 IETF 開發。它提供 TCP 流動控制語意，但對於使用者來說保留 UDP 的資料報服務模型。
TCP 和 UDP 都用來支援一些高層的應用。任何給定網路位址的應用通過它們的 TCP 或者 UDP _埠號_區分。根據慣例使一些_大眾所知的埠_與特定的應用相聯絡。
RTP 是為如音訊和視訊流這樣的及時資料設計的資料報協定。RTP 是使用 UDP 包格式作為基礎的會議層，然而據說它位於網際網路協定疊的傳輸層。

#### 網路互連層

_TCP/IP 協定套組中的**網路互連層**（internet layer）在 OSI 模型中叫做**網路層**（network layer）。_

正如最初所定義的，網路層解決在一個單一網路上傳輸封包的問題。類似的協定有 X.25 和 ARPANET 的 Host/IMP Protocol。
隨著網際網路思想的出現，在這個層上添加附加的功能，也就是將資料從源網路傳輸到目的網路。這就牽涉到在網路組成的網上選擇路徑將封包傳輸，也就是網際網路。
在網際網路協定組中，IP 完成資料從源傳送到目的的基本任務。IP 能夠承載多種不同的高層協定的資料；這些協定使用一個唯一的 _IP 協定號_進行標識。ICMP 和 IGMP 分別是 1 和 2。
一些 IP 承載的協定，如 ICMP（用來傳送關於 IP 傳送的診斷資訊）和 IGMP（用來管理多播資料），它們位於 IP 層之上但是完成網路層的功能，這表明網際網路和 OSI 模型之間的不相容性。所有的路由協定，如 BGP、OSPF、和 RIP 實際上也是網路層的一部分，儘管它們似乎應該屬於更高的協定疊。

#### 網路存取 (連結) 層

網路存取 (連結) 層實際上並不是網際網路協定組中的一部分，但是它是封包從一個裝置的網路層傳輸到另外一個裝置的網路層的方法。這個過程能夠在網卡的軟體驅動程式中控制，也可以在韌體或者專用晶片中控制。這將完成如添加報頭準備傳送、通過實體媒介實際傳送這樣一些資料鏈路功能。另一端，鏈路層將完成資料框接收、去除報頭並且將接收到的包傳到網路層。
然而，鏈路層並不經常這樣簡單。它也可能是一個虛擬專有網路（VPN）或者隧道，在這裡從網路層來的包使用隧道協定和其他（或者同樣的）協定組傳送而不是傳送到實體的介面上。VPN 和通道通常預先建好，並且它們有一些直接傳送到實體介面所沒有的特殊特點（例如，它可以加密經過它的資料）。由於現在鏈路「層」是一個完整的網路，這種協定組的遞迴使用可能引起混淆。但是它是一個實現常見複雜功能的一個優秀方法。（儘管需要注意預防一個已經封裝並且經隧道傳送下去的封包進行再次地封裝和傳送）。

### IP 網路如何併吞競爭的網路

在長期的發展過程中，IP 逐漸取代其他網路。這裏是簡單的解釋。IP 傳輸通用資料。資料能夠用於任何目的，並且能夠很輕易地取代以前由專有資料網路傳輸的資料。下面是普通的過程：

1. 一個用於特定目的所開發出來的網路。如果它順利工作，使用者將能使用它。
2. 為了提供便利的 IP 服務，經常用於存取電子郵件或者聊天，通常以某種方式通過專有網路隧道實現。隧道方式最初可能非常沒有效率，因為電子郵件和聊天只需要很低的頻寬。
3. 通過一點點的投資 IP 基礎設施逐漸在專有資料網路周邊出現。
4. 用 IP 取代專有服務的需求出現，經常是一個使用者要求。
5. IP 替代品過程遍布整個網際網路，這使 IP 替代品比最初的專有網路更加有價值（由於網路效應）。
6. 專有網路受到壓制。許多使用者開始維護使用 IP 替代品的複製品。
7. IP 包的間接開銷很小，少於 1%，這樣在成本上非常有競爭性。人們開發能夠將 IP 帶到專有網路上的大部分使用者的不昂貴的傳輸媒介。
8. 大多數使用者為削減開銷而取消專有網路。

### 實現

* KA9Q PPJ
* lwIP

如今，大多數商業作業系統包括 TCP/IP 棧並且預設安裝它們，對於大多數使用者來說，沒有必要去探求它們如何實現。TCP/IP 包含在所有的商業 Unix 和 Linux 發布包中，同樣也包含在 Mac OS X、Windows 系統和 Windows Server 中。

## 參見

* IPv4
* IPv6
* NCP
* OSI 模型
* MPLS
* DoD 模型
* TCP/UDP 埠列表

## 參考文獻

## 外部連結

* RFC 1180 TCP/IP 指南，網際網路工程任務組，1991 年 1 月
* TCP/IP 常見問題解答（頁面存檔備份，存於網際網路檔案館）
* ARPANET TCP/IP 摘要研究（頁面存檔備份，存於網際網路檔案館）
* TCP/IP 流程圖（頁面存檔備份，存於網際網路檔案館）
* 實踐中的網際網路
* TCP/IP Definition（頁面存檔備份，存於網際網路檔案館）
* TCP/IP 協定集詳細資料（頁面存檔備份，存於網際網路檔案館）
* uIP - 針對 8/16 位元微控制器之用的 TCP/IP 協定堆疊程式（繁體中文）
* Internet History（頁面存檔備份，存於網際網路檔案館） -- Pages on Robert Kahn, Vinton Cerf, and TCP/IP (reviewed by Cerf and Kahn).
* RFC 1122 - 網際網路主機要求 -- 通訊層
* Joseph G. Davies 和 Thomas F. Lee。微軟 Windows Server 2003 TCP/IP 協定與服務，ISBN 978-0-7356-1291-4
* Craig Hunt TCP/IP 網路管理，O'Reilly (1998) ISBN 978-1-56592-322-5
* W. Richard Stevens。TCP/IP 說明，第一卷，Addison-Wesley Professional；第一版，1993 年 12 月 31 日，ISBN 978-0-201-63346-7