TCP/IP 協議是什麼?四層模型、OSI 對照與各層協議
TCP/IP 協議不是一個協議,而是網際網路通訊所用的一整套協議,因其中最核心的 TCP 和 IP 而得名。它把通訊分成鏈路層、網路層、傳輸層、應用層四層,每層只管一件事:鏈路層在同一網段內送幀,網路層按 IP 位址跨網段選路,傳輸層按連接埠把資料交給程式,應用層規定 HTTP、DNS 這類具體業務的格式。
TCP/IP 協議是網際網路以及幾乎所有企業網、機房網路使用的協議簇(也叫協議族、協議套件),名字取自其中最核心的兩個協議:負責定址和選路的 IP(Internet Protocol,網際協議),以及負責可靠傳輸的 TCP(Transmission Control Protocol,傳輸控制協議)。除了這兩個,它還包括 UDP、ICMP、ARP、DNS、HTTP 等大量協議。RFC 1122 把它們按功能分成四層:鏈路層、網路層(也叫網際層)、傳輸層、應用層。作業系統核心裡實現這套協議的部分,就是常說的 TCP/IP 協議棧。弄清分層的實際用處在於排障:每一層只依賴它下面那一層,故障落在哪一層,就用那一層的工具去查。
TCP/IP 四層模型:每層負責什麼
| 層 | 負責什麼 | 資料單位 | 用什麼定址 | 典型協議 |
|---|---|---|---|---|
| 應用層 | 規定具體業務的資料格式和互動規則 | 訊息(報文) | 域名、URL | HTTP、DNS、SSH、SMTP、SNMP |
| 傳輸層 | 在兩台主機的程式之間傳資料,區分交給哪個程式 | 段(TCP)、資料包(UDP) | 連接埠號 | TCP、UDP |
| 網路層 | 跨網段把包從源主機送到目的主機,逐跳選路 | 包(分組) | IP 位址 | IPv4、IPv6、ICMP |
| 鏈路層 | 在同一個物理網段或 VLAN 內,把幀送到下一跳裝置 | 幀 | MAC 位址 | 乙太網、ARP、802.1Q VLAN |
四層的分工可以這樣理解:
- 鏈路層只管“一跳”。一個乙太網幀從伺服器發出,只能送到同一網段裡的下一個裝置:要麼是同網段的目標主機,要麼是預設閘道器。跨網段時,每經過一台路由器,幀都會被拆掉再重新封裝,源 MAC 和目的 MAC 每一跳都在變。
- 網路層管“端到端”。IP 包頭裡的源、目的位址從發出到收到一般保持不變(經過 NAT 時除外)。路由器根據目的位址查路由表決定下一跳,每轉發一次把 TTL 減 1,減到 0 就丟棄,以免包在環路里無限打轉。
- 傳輸層管“交給哪個程式”。IP 只負責把包送到主機,主機上同時跑著 Web、SSH、資料庫等程式,要靠目的連接埠區分。TCP 在這一層提供連線、確認、重傳和按序交付;UDP 只做連接埠區分和校驗,其餘交給應用。
- 應用層管“說什麼”。HTTP 規定請求行和頭部怎麼寫,DNS 規定查詢和應答的格式。它們把可靠傳輸交給下層,只關心業務本身。
TCP/IP 四層和 OSI 七層怎麼對應
OSI 七層模型是國際標準化組織(ISO)制定的參考模型,概念劃分細緻,但它配套的協議沒有普及;TCP/IP 則是實際執行的協議簇。兩者的對應關係如下,教材裡常見的五層模型也一併列出:
| OSI 七層 | 編號 | TCP/IP 四層 | 五層教學模型 |
|---|---|---|---|
| 應用層 | 7 | 應用層 | 應用層 |
| 表示層 | 6 | 應用層 | 應用層 |
| 會話層 | 5 | 應用層 | 應用層 |
| 傳輸層 | 4 | 傳輸層 | 傳輸層 |
| 網路層 | 3 | 網路層 | 網路層 |
| 資料鏈路層 | 2 | 鏈路層 | 資料鏈路層 |
| 物理層 | 1 | 鏈路層 | 物理層 |
機房裡有一個常讓新人困惑的地方:協議按 TCP/IP 分組,口頭說法卻用 OSI 的編號。“二層交換器”“二層不通”說的是資料鏈路層;“三層交換器”“三層介面”說的是網路層;“四層負載均衡”按 IP 和連接埠轉發,“七層負載均衡”能識別 HTTP 的域名和 URL;“七層攻擊”就是應用層攻擊。OSI 的第 5、6 層在 TCP/IP 裡沒有對應的獨立協議,會話保持、編碼和加密由應用自己或 TLS 完成。
各層常見協議對照表
| 層 | 協議 | 下層靠什麼識別它 | 說明 |
|---|---|---|---|
| 應用層 | HTTP / HTTPS | TCP 80 / 443 | HTTP/3 改走 UDP 443 上的 QUIC |
| 應用層 | DNS | UDP 53、TCP 53 | 域名解析 |
| 應用層 | SSH | TCP 22 | 遠端登入、SFTP |
| 應用層 | DHCP | UDP 67 / 68 | 自動分配位址、閘道器和 DNS |
| 應用層 | SNMP | UDP 161 / 162 | 裝置監控與告警 |
| 應用層 | BGP | TCP 179 | 雖然是路由協議,但跑在 TCP 之上,按封裝位置算應用層 |
| 傳輸層 | TCP | IP 協議號 6 | 面向連線、可靠、按序 |
| 傳輸層 | UDP | IP 協議號 17 | 無連線、開銷小 |
| 網路層 | IPv4 / IPv6 | 乙太網型別 0x0800 / 0x86DD | 定址和逐跳轉發 |
| 網路層 | ICMP / ICMPv6 | IP 協議號 1 / 58 | ping、traceroute 和差錯報告;ICMPv6 還承擔鄰居發現 |
| 網路層 | OSPF | IP 協議號 89 | 直接封裝在 IP 裡,不經過 TCP 或 UDP |
| 網路層 | IPsec(ESP / AH) | IP 協議號 50 / 51 | VPN 加密與認證 |
| 鏈路層 | ARP | 乙太網型別 0x0806 | 由 IP 位址查 MAC 位址;也有教材把它劃到網路層 |
| 鏈路層 | 乙太網(IEEE 802.3) | — | 幀格式與 MAC 位址 |
| 鏈路層 | 802.1Q VLAN | 乙太網型別 0x8100 | 在幀裡插入 4 位元組的 VLAN 標籤 |
| 鏈路層 | LACP | 乙太網型別 0x8809 | 鏈路聚合協商 |
“下層靠什麼識別它”這一列,正是協議棧把資料一層層往上交的依據:網路卡收到幀,看乙太網型別欄位,0x0800 交給 IPv4,0x0806 交給 ARP;IP 層看協議號,6 交給 TCP,17 交給 UDP,1 交給 ICMP;TCP 和 UDP 再看目的連接埠,交給監聽該連接埠的程序。防火牆規則裡的 -p tcp --dport 443、交換器 ACL 裡的 permit tcp ... eq 443,匹配的就是這幾個欄位。
網線、交換器、路由器、防火牆各工作在哪層
說一台裝置“工作在第幾層”,意思是它最多解析到第幾層的包頭,並據此做轉發決定。
| 裝置 | OSI 層 | 依據什麼轉發或處理 | 機房裡常見的問題 |
|---|---|---|---|
| 網線、光纖、光模組、配線架 | 1 物理層 | 只傳位元,不看內容 | 線纜損壞、光功率不足、速率或雙工協商異常 |
| 網路卡 | 1–2 | 收發幀,過濾掉目的 MAC 不是自己的幀 | 驅動、協商速率、bond 配置 |
| 二層交換器 | 2 資料鏈路層 | MAC 位址表和 VLAN | VLAN 配錯、環路、MAC 漂移 |
| 三層交換器 | 2–3 | 同 VLAN 內按 MAC 轉發,VLAN 之間按路由錶轉發 | 閘道器介面未啟用、缺路由 |
| 路由器 | 3 網路層 | 路由表、NAT | 回程路由缺失、NAT 規則寫錯 |
| 狀態檢測防火牆、ACL | 3–4 | IP 位址、協議號、連接埠、連線狀態 | 漏放回程、會話表打滿 |
| 四層負載均衡(如 LVS) | 4 | IP 加連接埠 | 後端健康檢查、會話保持 |
| 七層負載均衡、WAF、反向代理 | 7 | HTTP 的域名、URL、頭部 | 證書、超時、正常請求被誤攔 |
| 伺服器作業系統 | 1–7 | 完整協議棧 | 任一層都可能出問題 |
分清裝置的層次,能少走很多彎路。二層交換器不看 IP:同一 VLAN 裡兩台伺服器配了不同網段的位址,交換器照樣轉發它們之間的幀,但兩台主機的協議棧都會認為對方不在本網段,把包發給閘道器去繞路。路由器轉發時只看目的 IP,不看連接埠:某個連接埠被攔了,要去防火牆、ACL 或伺服器上查,查路由表找不到原因。
一次 HTTP 請求的封裝過程
假設一台伺服器 198.51.100.23(閘道器 198.51.100.1)執行 curl http://www.example.com/,從發出到對端收到要經過下面幾步:
- 應用層:解析域名,生成請求。curl 先呼叫系統解析器查詢
www.example.com,這次 DNS 查詢本身也是一次完整的逐層封裝(走 UDP 53)。拿到位址 203.0.113.10 後生成 HTTP 請求,內容大約 78 位元組:
GET / HTTP/1.1
Host: www.example.com
User-Agent: curl/8.5.0
Accept: */*
- 傳輸層:建立 TCP 連線,加 TCP 頭。先完成三次握手(SYN、SYN-ACK、ACK),再把這 78 位元組作為資料裝進 TCP 段。源連接埠由系統從臨時連接埠範圍裡挑一個,例如 51324;目的連接埠是 80;此外還有序號、確認號、視窗等欄位。TCP 頭最少 20 位元組;Linux 預設啟用時間戳選項,對端也支援時,資料段的 TCP 頭是 32 位元組。
- 網路層:加 IP 頭。源位址 198.51.100.23,目的位址 203.0.113.10,協議號 6 表示裡面是 TCP,TTL 的初始值 Linux 預設是 64。IPv4 頭 20 位元組。
- 鏈路層:查路由、做 ARP、加乙太網頭。系統查路由表,發現 203.0.113.10 不在本網段,下一跳是預設閘道器 198.51.100.1;到 ARP 表裡找閘道器的 MAC,找不到就先廣播一次 ARP 請求。然後加上 14 位元組的乙太網頭和 4 位元組的幀校驗序列(FCS)。注意這裡的目的 MAC 是閘道器的,不是 Web 伺服器的。
- 物理層:轉成電訊號或光訊號發出。
每一層加了多少位元組:
| 層 | 加上的部分 | 位元組 | 累計 |
|---|---|---|---|
| 應用層 | HTTP 請求 | 78 | 78 |
| 傳輸層 | TCP 頭(含時間戳選項) | 32 | 110 |
| 網路層 | IPv4 頭 | 20 | 130 |
| 鏈路層 | 乙太網頭 14 + FCS 4 | 18 | 148 |
路上的每台路由器收到幀後,校驗 FCS、剝掉乙太網頭,讀 IP 頭查路由表,把 TTL 減 1,再按出介面的鏈路型別重新加上新的幀頭交給下一跳。全程 IP 位址不變,MAC 位址每跳都換。Web 伺服器收到後反向拆包:乙太網型別 0x0800 交給 IPv4,協議號 6 交給 TCP,目的連接埠 80 交給 Nginx 這樣的 Web 程序。
抓包能直接看到這幾層。-e 顯示鏈路層頭部,-nn 不把位址和連接埠翻譯成名字:
tcpdump -i eth0 -e -nn host 203.0.113.10 and tcp port 80
建立連線的第一個包大致如下:
10:15:02.183412 52:54:00:aa:bb:01 > 00:1a:2b:3c:4d:5e, ethertype IPv4 (0x0800), length 74: 198.51.100.23.51324 > 203.0.113.10.80: Flags [S], seq 1938204312, win 64240, options [mss 1460,sackOK,TS val 3012 ecr 0,nop,wscale 7], length 0
從左往右讀:兩個 MAC 和 ethertype IPv4 屬於鏈路層;兩個 IP 位址屬於網路層;.51324、.80 和 Flags [S] 屬於傳輸層;末尾的 length 0 表示這個 SYN 包還沒有攜帶應用層資料。前面的 length 74 是整幀長度(不含 FCS):14 位元組乙太網頭、20 位元組 IP 頭和 40 位元組 TCP 頭,握手包帶著 MSS、視窗縮放等選項,所以 TCP 頭比資料包更長。
用分層思路定位故障:從下往上查
排障時從下往上,每層用一條命令得出“通”或“不通”的結論再往上走。反過來也成立:上層已經正常,下面各層一定沒問題,例如能 ping 通外網的某個 IP,就可以直接從傳輸層查起。
| 層 | 典型現象 | 檢查命令 | 怎麼判斷 |
|---|---|---|---|
| 物理層 | 網口燈不亮,或速率只有 100 Mb/s | ethtool eth0 |
Link detected: no 表示沒有鏈路;Speed 低於連接埠速率是協商問題;ethtool -S eth0 裡 CRC 類錯誤持續增長,多為線纜或光模組故障 |
| 鏈路層 | 同網段的閘道器 ping 不通 | ip neigh show |
閘道器那一行是 FAILED 或 INCOMPLETE,說明 ARP 沒有應答:VLAN 配錯、交換器連接埠被關閉或做了 MAC 繫結 |
| 網路層 | 閘道器能通,外網 IP 不通 | ip route、traceroute -n 203.0.113.10、mtr -n 203.0.113.10 |
沒有預設路由,或者從某一跳開始往後全是 * * *(中間個別跳不回應是正常的) |
| 傳輸層 | ping 得通,連接埠連不上 | 客戶端 nc -zv 203.0.113.10 443,伺服器 ss -tlnp |
立即報 refused 多是沒有程式監聽,或防火牆設定了拒絕;一直等到超時多是防火牆丟棄 |
| 應用層 | 連接埠能通,頁面報錯或域名打不開 | curl -v http://www.example.com/、dig www.example.com |
看 HTTP 狀態碼、證書報錯和域名解析結果 |
鏈路層的問題,交換器一側也要對著查:華為、新華三用 display mac-address 和 display arp,思科用 show mac address-table 和 show ip arp,確認伺服器的 MAC 是否出現在預期的連接埠和 VLAN 裡。
有些故障跨在兩層之間,單看一層會誤判:
- 小包通、大包不通。ping 正常、SSH 能登入,但傳大檔案或開啟內容多的頁面時卡住。常見原因是路徑上某段 MTU 變小(隧道封裝、VLAN 巢狀),而通知傳送方減小包長的 ICMP 訊息又被防火牆過濾。症狀出現在應用層,根因在網路層和鏈路層之間。
- IP 位址衝突。兩台機器配了同一個 IP,閘道器 ARP 表裡這個 IP 對應的 MAC 來回變化,表現為時通時斷。在閘道器上連續檢視 ARP 表,或者看裝置日誌裡的 MAC 變更告警,就能找到衝突的那台。
- 單向通。去程路由正常、回程路由缺失,或者回程走了另一個出口被狀態防火牆丟棄。表現是對端抓包能看到請求,本機卻收不到應答,要在兩端分別抓包對比。
在管理系統裡怎麼落地
按層排障時,敲命令往往不費時間,費時間的是找資訊:這台伺服器接在哪台交換器的哪個連接埠、在哪個 VLAN、IP 和閘道器是多少。Toplink DCIM 的交換器管理裡,伺服器列表裡就能看到每台機器的上聯交換器、連接埠號、連接埠速率與所屬 VLAN;二層問題可以在網頁上開關連接埠、修改 VLAN,也可以開啟瀏覽器裡的交換器終端執行 display、show 命令。IP 位址管理按段登記位址、閘道器和所在 VLAN,配合交換器側的 ARP 繫結和源位址校驗,把 IP 與伺服器網路卡 MAC、交換器連接埠鎖定,減少位址衝突和盜用這類二三層交界處的故障。
常見問題
TCP/IP 四層模型和五層模型有什麼區別?
五層模型是教材為了講解方便,把四層模型的鏈路層拆成了物理層和資料鏈路層,其餘三層不變。RFC 1122 定義的是四層;機房裡口頭說“二層”“三層”,用的則是 OSI 七層的編號。
三層交換器和路由器都工作在網路層,有什麼區別?
三層交換器以乙太網口為主,用硬體按路由表高速轉發,適合在機房內部做 VLAN 之間的路由;路由器介面型別更多,NAT、VPN、策略路由等功能更完整,通常放在出口。具體能力以裝置型號為準。
HTTPS 裡的 TLS 屬於哪一層?
TLS 執行在 TCP 之上、HTTP 之下。按 TCP/IP 四層模型歸入應用層;對照 OSI 時,有的資料放在會話層,有的放在表示層,並無統一說法。理解封裝時只要記住順序:HTTP 資料先經 TLS 加密,再交給 TCP。