前言
最近剛看完電影「無敵破壞王2:大鬧網際網路」
,覺得裡面有些動畫蠻有意思的,於是想起前不久看的《圖解HTTP》和TCP/IP
相關的文章。嗯,是時候展示真正的技術了。
如果你還對各類協議歸屬、作用也都傻傻分不清,那麼你有必要詳盡瞭解下TCP/IP
。
1. TCP/IP
協議族
網際網路協議套件(英語:Internet Protocol Suite,縮寫
IPS
)是一個網路通訊模型,以及一整個網路傳輸協議家族,為網際網路的基礎通訊架構。它常被通稱為TCP/IP協議族(英語:TCP/IP Protocol Suite
,或TCP/IP Protocols
),簡稱TCP/IP
。因為該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議)
,為該家族中最早通過的標準。
敲重點:
TCP(傳輸控制協議)和IP(網際協議
是最先定義的兩個核心協議,所以才統稱為TCP/IP協議族
1.1 TCP/IP
拆家分層
TCP/IP
協議族中有一個很重要一點就是分層管理,依次為以下四層,應用層,傳輸層,網路層,資料鏈路層。
TCP/IP
分層管理是有好處的,假如網際網路只有一個協議統籌,某一個地方改變設計時,就需要把所有部分都替換掉,而分層只需要把變動的層替換掉即可。
而且分層管理,設計也相對簡單,處於應用層的應用只需要考慮分派自己的任務而不需要考慮對方的傳輸線路是怎樣的,能否保證傳輸送達。
2. 應用層, Application Layer
應用層是大多數普通與網路相關的程式為了通過網路與其他程式通訊所使用的層。這個層的處理過程是應用特有的;資料從網路相關的程式以這種應用內部使用的格式進行傳送,然後被編碼成標準協議的格式。
應用層決定了向使用者提供的應用服務時的通訊活動:
HTTP
(全球資訊網服務)FTP
(檔案傳輸)SMTP
(電子郵件)SSH
(安全遠端登陸)DNS
(名稱<-> IP地址尋找,域名系統)- 以及許多其他協議
一旦從應用程式來的資料被編碼成一個標準的應用層協議,它將被傳送到IP棧的下一層。
3. 傳輸層,Transport Layer
傳輸層位於應用層的下層,提供位於網路連線中的兩臺計算機之間的資料傳輸,傳輸層中有兩種性質不同的協議
敲重點:每一個應用層協議一般都會使用到兩個傳輸層協議之一
TCP
:面向連線的Transmisson Control Protocol
傳輸控制協議UDP
: 無連線的包傳輸User DataProtocol
使用者資料包協議
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網路中,為了保障每個連線提供有保證和有序的位元組傳遞,使用了Sequence Number
(,序列號)和 Acknowledgment Number
(確認號),即Seq
和Ack
。
TCP
每次傳送與接受的單位為: TCP
頭部 + 資料, TCP資料段 (TCP Segment
);
每個資料段的大小不盡相同,有可能數百~數萬。
SEQ
,序列號,表示每次傳輸中位元組的偏移量
ACK
,確認號,指出下一個期望接收的SEQ
(接受完畢)
舉個例子:
- 序列號為
#2000
且長度為100
的資料包,在此連線上包含第2000-2099
個位元組。 - 當接收器接收到包括第
2099
位元組在內的所有位元組時,它傳送一個確認#2100
。 - 表示它已在第
2100
位元組之前接收到該位元組。
3.4 SYN
,同步序列號
- 為了避免與先前連線的資料段混淆,當次連線建立時,序列號 並非從 0 開始。
- 兩端會使用
ISN
產生器,產生各自的 初始序列號 (Initial Sequence Number, ISN
), 通常兩者並不相等。 - 連線建立時,透過 控制位元 (Control Bits) 中的
SYN
,讓兩端的TCP
必須進行ISN
的交換 (同步)。
好吧,說人話。就是TCP三次握手:
這就是 TCP
連線的建立方式,
且 2
和 3
,可以組合為單一訊息。
於是便有下圖:
且第三次握手中 (Client — — > Server
),
其 SEQ
為 第一段的值 + 1 (ISN + 1)。
4. 網路層, Network Layer
網路層用來處理在網路上流動的資料包(資料包:網路上傳輸的最小資料單位)。
網路層規定在眾多選項中通過怎樣的路徑(傳輸線路)到達對方的計算機,把資料包傳輸給對方。
該層中最突出的協議是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.鏈路層,Link Layer
(又名資料鏈路層,網路介面層)
用來處理連線網路中的硬體部分,硬體上的範圍均在鏈路層中,包含
- 作業系統
- 硬體裝置驅動
- 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(Hypertext Transfer Protocol,超文字傳輸協議)
,主要用於普通瀏覽。HTTPS(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地址。
執行在TCP
和UDP
協議上:
DNS(Domain Name Service,域名服務)
,用於完成地址查詢,郵件轉發等工作。
免責宣告
只是覺得好玩就簡單寫了一下,有說錯的地方多擔待。
意思就是寫得略粗糙,別噴我。。。
求一份深圳的內推
好了,又水完一篇,入正題:
目前本人在(又)準備跳槽,希望各位大佬和HR小姐姐可以內推一份靠譜的深圳前端崗位!996.ICU 就算了。- 微信:
huab119
- 郵箱:
454274033@qq.com
作者掘金文章總集
- 「Vue實踐」5分鐘擼一個Vue CLI 外掛
- 「Vue實踐」武裝你的前端專案
- 「中高階前端面試」JavaScript手寫程式碼無敵祕籍
- 「從原始碼中學習」面試官都不知道的Vue題目答案
- 「從原始碼中學習」Vue原始碼中的JS騷操作
- 「從原始碼中學習」徹底理解Vue選項Props
- 「Vue實踐」專案升級vue-cli3的正確姿勢
- 為何你始終理解不了JavaScript作用域鏈?