最近剛看完電影「無敵破壞王2:大鬧互聯網」
,以爲裏面有些動畫蠻有意思的,因而想起前不久看的《圖解HTTP》和TCP/IP
相關的文章。嗯,是時候展現真正的技術了。前端
若是你還對各種協議歸屬、做用也都傻傻分不清,那麼你有必要詳盡瞭解下TCP/IP
。vue
TCP/IP
協議族互聯網協議套件(英語:Internet Protocol Suite,縮寫
IPS
)是一個網絡通信模型,以及一整個網絡傳輸協議家族,爲網際網絡的基礎通信架構。它常被通稱爲TCP/IP協議族(英語:TCP/IP Protocol Suite
,或TCP/IP Protocols
),簡稱TCP/IP
。由於該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議)
,爲該家族中最先經過的標準。web
敲重點:面試
TCP(傳輸控制協議)和IP(網際協議
是最早定義的兩個核心協議,因此才統稱爲TCP/IP協議族
TCP/IP
拆家分層TCP/IP
協議族中有一個很重要一點就是分層管理,依次爲如下四層,應用層,傳輸層,網絡層,數據鏈路層。vue-cli
TCP/IP
分層管理是有好處的,假如互聯網只有一個協議統籌,某一個地方改變設計時,就須要把全部部分都替換掉,而分層只須要把變更的層替換掉便可。
並且分層管理,設計也相對簡單,處於應用層的應用只須要考慮分派本身的任務而不須要考慮對方的傳輸線路是怎樣的,可否保證傳輸送達。後端
Application Layer
應用層是大多數普通與網絡相關的程序爲了經過網絡與其餘程序通訊所使用的層。這個層的處理過程是應用特有的;數據從網絡相關的程序以這種應用內部使用的格式進行傳送,而後被編碼成標準協議的格式。設計模式
應用層決定了向用戶提供的應用服務時的通訊活動:安全
HTTP
(萬維網服務)FTP
(文件傳輸)SMTP
(電子郵件)SSH
(安全遠程登錄)DNS
(名稱<-> IP地址尋找,域名系統)一旦從應用程序來的數據被編碼成一個標準的應用層協議,它將被傳送到IP棧的下一層。 bash
Transport Layer
傳輸層位於應用層的下層,提供位於網絡鏈接中的兩臺計算機之間的數據傳輸,傳輸層中有兩種性質不一樣的協議網絡
敲重點:每個應用層協議通常都會使用到兩個傳輸層協議之一
TCP
:面向鏈接的Transmisson Control Protocol
傳輸控制協議UDP
: 無鏈接的包傳輸User DataProtocol
用戶數據報協議UDP | TCP | |
---|---|---|
是否鏈接 | 無鏈接 | 面向鏈接 |
是否可靠 | 不可靠傳輸,不使用流量控制和擁塞控制 | 可靠傳輸,使用流量控制和擁塞控制 |
鏈接對象個數 | 支持一對一,一對多,多對一和多對多交互通訊 | 只能是一對一通訊 |
傳輸方式 | 面向報文 | 面向字節流 |
首部開銷 | 首部開銷小,僅8字節 | 首部最小20字節,最大60字節 |
場景 | 適用於實時應用(IP電話、視頻會議、直播等) | 適用於要求可靠傳輸的應用,例如文件傳輸 |
摘自:TCP和UDP比較
網絡層的功能使咱們可以將數據包從一臺機器傳送到網絡上的另外一臺機器,但這還不足以編寫網絡應用程序,由於:
TCP
經過定義端口號解決了第一個問題:
端口號本質上是標識符,有助於TCP
區分機器上運行的應用。
換句話說,計算機上的每一個端口號都由該計算機上的應用擁有。
端口號是2字節整數,端口0不可用。所以,咱們能夠在一臺機器上擁有多達65536個端口。
TCP經過端口號來定義「鏈接」。
TCP鏈接由源和目標IP地址(來自網絡層)以及源和目標端口號標識。這也稱爲四元組:
// 源IP地址、目的IP地址、源端口、目的端口
(src ip,dst ip,src port,dst port)
複製代碼
SEQ
和ACK
,序列號與確認號TCP網絡中,爲了保障每一個鏈接提供有保證和有序的字節傳遞,使用了Sequence Number
(,序列號)和 Acknowledgment Number
(確認號),即Seq
和Ack
。
TCP
每次發送與接受的單位爲: TCP
頭部 + 數據, TCP數據段 (TCP Segment
);
每一個數據段的大小不盡相同,有可能數百~數萬。
SEQ
,序列號,表示每次傳輸中字節的偏移量 ACK
,確認號,指出下一個指望接收的SEQ
(接受完畢)
舉個例子:
#2000
且長度爲100
的數據包,在此鏈接上包含第2000-2099
個字節。2099
字節在內的全部字節時,它發送一個確認#2100
。2100
字節以前接收到該字節。SYN
,同步序列號ISN
產生器,產生各自的 初始序列號 (Initial Sequence Number, ISN
), 一般二者並不相等。SYN
,讓兩端的 TCP
必須進行 ISN
的交換 (同步)。
好吧,說人話。就是TCP三次握手:
這就是 TCP
鏈接的創建方式, 且 2
和 3
,能夠組合爲單一訊息。
因而便有下圖:
且第三次握手中 (Client — — > Server
), 其 SEQ
為 第一段的值 + 1 (ISN + 1)。
Network Layer
網絡層用來處理在網絡上流動的數據包(數據包:網絡上傳輸的最小數據單位)。
網絡層規定在衆多選項中經過怎樣的路徑(傳輸線路)到達對方的計算機,把數據包傳輸給對方。
該層中最突出的協議是Internet協議(IP)
,所以該層也稱爲IP
層。IP
的核心是兩個主要功能:地址和路由。
IP
的原始版本是
IPV4
,後來擴展了
IPV6
:
IPv4
中規定IP
地址長度爲32,即有2^32-1個節點(40億)。IPv6
中IP
地址的長度爲128,即有2^128-1個節點(2125億)IPV6
被普遍應用之後,全世界的每一粒沙子都會有相對應的一個IP地址。今天,大多數機器都有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
複製代碼
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
複製代碼
就會獲得下圖:
Link Layer
(又名數據鏈路層,網絡接口層)
用來處理鏈接網絡中的硬件部分,硬件上的範圍均在鏈路層中,包含
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地址之間的映射關係。
而後便一層層包裹,解析。
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,域名服務)
,用於完成地址查找,郵件轉發等工做。逛國外社區看到這篇,以爲挺簡潔明瞭的。
只是以爲好玩就簡單總結一下,有說錯的地方多擔待。
意思就是寫得略粗糙,別噴我。。。
若是你以爲這篇內容對你挺有啓發,我想邀請你幫我三個小忙: