「多圖警告」重學 TCP/IP 協議
- 2019 年 10 月 4 日
- 筆記
前言
最近剛看完電影 「無敵破壞王2:大鬧互聯網」
,覺得裏面有些動畫蠻有意思的,於是想起前不久看的《圖解HTTP》和 TCP/IP
相關的文章。嗯,是時候展示真正的技術了。
如果你還對各類協議歸屬、作用也都傻傻分不清,那麼你有必要詳盡了解下 TCP/IP
。

1. TCP/IP
協議族

互聯網協議套件(英語:Internet Protocol Suite,縮寫
IPS
)是一個網絡通訊模型,以及一整個網絡傳輸協議家族,為網際網絡的基礎通訊架構。它常被通稱為TCP/IP協議族(英語:TCP/IPProtocolSuite
,或TCP/IPProtocols
),簡稱TCP/IP
。因為該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議)
,為該家族中最早通過的標準。
敲重點:
TCP(傳輸控制協議)和IP(網際協議
是最先定義的兩個核心協議,所以才統稱為TCP/IP協議族
1.1 TCP/IP
拆家分層
TCP/IP
協議族中有一個很重要一點就是分層管理,依次為以下四層,應用層,傳輸層,網絡層,數據鏈路層。

TCP/IP
分層管理是有好處的,假如互聯網只有一個協議統籌,某一個地方改變設計時,就需要把所有部分都替換掉,而分層只需要把變動的層替換掉即可。
而且分層管理,設計也相對簡單,處於應用層的應用只需要考慮分派自己的任務而不需要考慮對方的傳輸線路是怎樣的,能否保證傳輸送達。
2. 應用層, ApplicationLayer
應用層是大多數普通與網絡相關的程序為了通過網絡與其他程序通信所使用的層。這個層的處理過程是應用特有的;數據從網絡相關的程序以這種應用內部使用的格式進行傳送,然後被編碼成標準協議的格式。
應用層決定了向用戶提供的應用服務時的通信活動:
HTTP
(萬維網服務)FTP
(文件傳輸)SMTP
(電子郵件)SSH
(安全遠程登陸)DNS
(名稱<-> IP地址尋找,域名系統)- 以及許多其他協議
一旦從應用程序來的數據被編碼成一個標準的應用層協議,它將被傳送到IP棧的下一層。

圖中用到HTTP和DNS
3. 傳輸層, TransportLayer
傳輸層位於應用層的下層,提供位於網絡連接中的兩台計算機之間的數據傳輸,傳輸層中有兩種性質不同的協議
敲重點:每一個應用層協議一般都會使用到兩個傳輸層協議之一
TCP
:面向連接的TransmissonControlProtocol
傳輸控制協議UDP
: 無連接的包傳輸UserDataProtocol
用戶數據報協議
|
UDP |
TCP |
---|---|---|
是否連接 |
無連接 |
面向連接 |
是否可靠 |
不可靠傳輸,不使用流量控制和擁塞控制 |
可靠傳輸,使用流量控制和擁塞控制 |
連接對象個數 |
支持一對一,一對多,多對一和多對多交互通信 |
只能是一對一通信 |
傳輸方式 |
面向報文 |
面向位元組流 |
首部開銷 |
首部開銷小,僅8位元組 |
首部最小20位元組,最大60位元組 |
場景 |
適用於實時應用(IP電話、視頻會議、直播等) |
適用於要求可靠傳輸的應用,例如文件傳輸 |
摘自:TCP和UDP比較
3.1 傳輸層的意義
網絡層的功能使我們能夠將數據包從一台機器傳送到網絡上的另一台機器,但這還不足以編寫網絡應用程序,因為:
- 機器可以運行多個應用程序,我們需要知道哪個應用程序應該接收數據包。
- 網絡層可以丟棄或重新排序數據包。另一方面,應用程序通常需要保證(即,無損耗)和按順序傳輸位元組。
3.2 何為「四元組」?
TCP
通過定義端口號解決了第一個問題:
端口號本質上是標識符,有助於 TCP
區分機器上運行的應用。
換句話說,計算機上的每個端口號都由該計算機上的應用擁有。
端口號是2位元組整數,端口0不可用。因此,我們可以在一台機器上擁有多達65536個端口。
TCP通過端口號來定義「連接」。
TCP連接由源和目標IP地址(來自網絡層)以及源和目標端口號標識。這也稱為四元組:
// 源IP地址、目的IP地址、源端口、目的端口 (src ip,dst ip,src port,dst port)
3.3 SEQ
和 ACK
,序列號與確認號
TCP網絡中,為了保障每個連接提供有保證和有序的位元組傳遞,使用了 SequenceNumber
(,序列號)和 AcknowledgmentNumber
(確認號),即 Seq
和 Ack
。
TCP
每次發送與接受的單位為:TCP
頭部 + 數據, TCP數據段 ( TCPSegment
);

每個數據段的大小不盡相同,有可能數百~數萬。
SEQ
,序列號,表示每次傳輸中位元組的偏移量 ACK
,確認號,指出下一個期望接收的 SEQ
(接受完畢)
舉個例子:
- 序列號為
#2000
且長度為100
的數據包,在此連接上包含第2000-2099
個位元組。 - 當接收器接收到包括第
2099
位元組在內的所有位元組時,它發送一個確認#2100
。 - 表示它已在第
2100
位元組之前接收到該位元組。
3.4 SYN
,同步序列號
- 為了避免與先前連線的數據段混淆,當次連線建立時,序列號 並非從 0 開始。
- 兩端會使用
ISN
產生器,產生各自的 初始序列號 (InitialSequenceNumber,ISN
), 通常兩者並不相等。 - 連線建立時,透過 控制位元 (Control Bits) 中的
SYN
,讓兩端的TCP
必須進行ISN
的交換 (同步)。

好吧,說人話。就是TCP三次握手:
這就是 TCP
連接的建立方式, 且 2
和 3
,可以組合為單一訊息。
於是便有下圖:

且第三次握手中 ( Client——>Server
), 其 SEQ
為 第一段的值 + 1 (ISN + 1)。
4. 網絡層, NetworkLayer
網絡層用來處理在網絡上流動的數據包(數據包:網絡上傳輸的最小數據單位)。
網絡層規定在眾多選項中通過怎樣的路徑(傳輸線路)到達對方的計算機,把數據包傳輸給對方。

流動中的數據包
該層中最突出的協議是 Internet協議(IP)
,因此該層也稱為 IP
層。IP
的核心是兩個主要功能:地址和路由。

IP
的原始版本是 IPV4
,後來擴展了 IPV6
:
IPv4
中規定IP
地址長度為32,即有2^32-1個節點(40億)。- 我們網絡中已經有超過40億個節點,鑒於此,促成了IPV6發展。
IPv6
中IP
地址的長度為128,即有2^128-1個節點(2125億)- 如果
IPV6
被廣泛應用以後,全世界的每一粒沙子都會有相對應的一個IP地址。
4.1 地址
今天,大多數機器都有 IPv4
和 IPv6
地址。如果運行 ifconfig
,則可以看到計算機的 IPv4
和 IPv6
地址。
~ ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP> inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1809:1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active
4.2 路由
IP路由基於使用地址前綴的規則構構建。如果在計算機上運行 netstat-rn
,則可以在計算機上看到路由表。
- 例如,我的路由表說任何匹配
10.31.10/24
的IP數據包應該發送到link#8
。 - 如果仔細觀察,可以看到「默認」行。該行是一項特殊規則,表示任何與其他規則不匹配的數據包都應使用此規則進行路由尋址。
它就像
switch/case
語句中的default
。
% netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif default 10.31.10.222 UGSc 54 0 en0 default link#17 UCSI 0 0 bridge1 ! 10.31.10/24 link#8 UCS 9 0 en8 ! Internet6: Destination Gateway Flags Netif Expire fe80::%lo0/64 fe80::1%lo0 UcI lo0
互聯網上的所有節點都有這些路由表,這就是IP數據包路由到達目的地的方式。

如果您想了解如何在網絡中將數據包路由到掘金 juejin.im
,請運行以下命令:
traceroute juejin.im
就會得到下圖:

5.鏈路層, LinkLayer
(又名數據鏈路層,網絡接口層)用來處理連接網絡中的硬件部分,硬件上的範圍均在鏈路層中,包含
- 操作系統
- 硬件設備驅動
- NIC(Network interface Card 網絡適配器:網卡 )
- 光纖等物理可見部分

主機,線路,路由器
5.1 ifconfig
: 查看 MAC
地址
在任何網絡中,每個節點都具有 「鄰居」。鏈路層協議提供通過鏈路直接連接的「鄰居」之間通信所需的功能(例如,像CAT5電纜的物理鏈路,或WiFi中的無線電鏈路)。
最着名的鏈路層協議是以太網。在以太網中,每個接口都有一個唯一的48位(6位元組)地址,稱為媒體訪問控制(MAC)地址。
如果在計算機上運行 ifconfig
,您將看到網絡接口的名稱及其 MAC
地址。
~ ifconfig ... en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 88:e9:fe:4c:83:5b inet6 fe80::1809:d41a:a9a:d664%en0 prefixlen 64 secured scopeid 0x8 inet 192.168.1.8 netmask 0xffffff00 broadcast 192.168.1.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active
如你所見,MAC地址中的每個位元組都由十六進制值表示,並以冒號分隔。
通過以太網鏈路發送的網絡數據包具有源和目標 MAC
地址。為了發現它的鄰居,以太網使用廣播查詢和通知。使用這些廣播機制,另一種稱為 ARP
的協議可以找到鄰居的 MAC
和 IP
地址之間的映射。如果在計算機上運行 arp
,則可以看到此映射。
~ arp -a -n ? (10.31.xx.xx) at 98:28:xx:2a:cc:xx on en8 ifscope [ethernet] ? (10.31.xx.xx) at f4:8e:xx38:f5:b5:xx on en8 ifscope [ethernet] ? (10.31.xx.xx) at 54:ee:xx:e1:33:xx on en8 ifscope [ethernet] ....
現在我們已經知道MAC和IP地址之間的映射關係。
6. TCP/IP 通信傳輸流

TCP/IP 通過分層管理進行網絡通信,發送端從應用層往下走,接收端則往應用層上層走。
然後便一層層包裹,解析。

- 發送端,每經過一層會打上該層所屬的首部信息。
- 接收端,每經過一層會把對應的首部信息解析。
7. 擴展:運行在傳輸層中的 TCP
和 UDP
的協議
每一個應用層(TCP/IP參考模型的最高層)協議一般都會使用到兩個傳輸層協議之一:
運行在 TCP協議
上的協議:
HTTP(HypertextTransferProtocol,超文本傳輸協議)
,主要用於普通瀏覽。HTTPS(HTTP over SSL,安全超文本傳輸協議)
,HTTP
協議的安全版本。FTP(FileTransferProtocol,文件傳輸協議)
,用於文件傳輸。POP3(PostOfficeProtocol,version3,郵局協議)
,收郵件用。SMTP(SimpleMailTransferProtocol,簡單郵件傳輸協議)
,用來發送電子郵件。TELNET(Teletypeover theNetwork,網絡電傳)
,通過一個終端(terminal)
登陸到網絡。SSH(SecureShell,用於替代安全性差的TELNET)
,用於加密安全登陸用。
運行在 UDP協議
上的協議:
BOOTP(BootProtocol,啟動協議)
,應用於無盤設備。NTP(NetworkTimeProtocol,網絡時間協議)
,用於網絡同步。DHCP(DynamicHostConfigurationProtocol,動態主機配置協議)
,動態配置IP地址。
運行在 TCP
和 UDP
協議上:
DNS(DomainNameService,域名服務)
,用於完成地址查找,郵件轉發等工作。
免責聲明
只是覺得好玩就簡單寫了一下,有說錯的地方多擔待。