TCP/IP四層協議
計算機網路的結構分層
OSI七層模型 | TCP/IP協議族層次 | 功能 | TCP/IP協議族 |
應用層 | 應用層 | 電子郵件、遠端傳輸、檔案傳輸 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示層 | 資料格式化、程式碼轉換、資料加密 | 沒有協議 | |
會話層 | 解除或建立別的節點的聯絡 | 沒有協議 | |
傳輸層 | 傳輸層 | 提供端對端的介面,處理端到端的通訊細節 | TCP,UDP |
網路層 | 網路層 | 資料在網路中分組傳輸,網路層處理分組在網路中的活動 | IP,ICMP,RIP,OSPF,BGP,IGMP |
資料鏈路層 | 鏈路層 | 傳輸有地址的幀和錯誤檢測功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理層 | 以二進位制資料形式在物理媒體上傳輸資料 | ISO2110,IEEE802,IEEE802.2 |
- 物理層,相當於是那些物流公司裡的
送貨汽車
。 - 資料鏈路層,可以看作是物流公司的
司機
,他們駕駛著汽車,將打包好的貨物(資料幀)從一個城市(物理節點)運輸到另一個城市。 - 網路層,這好比是物流公司的路線規劃者。物流公司有很多集散中心,根據集散中心的情況(是否擁堵),找出一條經過n個集散中心的路徑將貨物(資料)沿路運過去。
- 傳輸層,可以將其看作是物流公司的
跟單員
。負責任的跟單員(使用 TCP 協議)
會保證資料
送到客戶手上,如果送不到(需要三次握手,四次揮手)
就讓公司再發一次。不負責任的跟單員(使用 UDP 協議)
層只管將快遞送到客戶指定的地方,不管快遞是否送到客戶手上。 - 會話層,可看作是物流公司的
排程員
。他管理著這次物流的相關的資訊。例如這次客戶要發很多資料,發到哪,到底是一車一車發、還是用輪船一次運過去。這些都是他的職責。而運完之後,相關資訊(連線)也可以被銷燬了,這也是排程員的職責。 - 表示層,相當於物流公司的
打包員
。如果快遞(資料)太臃腫,他會在不破壞快遞的情況下壓扁(壓縮)它。如果客戶注重安全線,全能的快遞公司還能用密碼箱( SSL/TLS)打包快遞再快送。當然,打包員會確定,目的地快遞站的拆包員,能無損地拆開包裹,將快遞交給使用者。 - 應用層,可以想象成物流公司的
收件員
,當客戶(應用)打電話(發起請求)給收件員(應用層)時,收件員可以根據使用者的不同需求提供不同的服務(不同協議),比如隔天送達、指定時間送達等等。
TCP/IP協議族
- 用
TCP/IP
從上往下走的時候,會分層的傳輸進行通訊。 - 傳送端是從
應用層
到鏈路層
,接收端是從鏈路層
往上到應用層
取資料。 - 其中通過各種首部的包裝來讓相應的層進行
識別
。 - 這裡我拿了網上copy的一張通用的圖來看一下。
- 每層協議需要實現的功能:
- 將上層協議傳遞的
資料包
包裝為滿足該層協議的資料包
- 將下層協議傳遞的
資料包
解析為滿足上層協議的資料包
- 處理其他層的互動
- 將上層協議傳遞的
- 這和上圖要表達的意思差不多,需要注意的是
- 從底往上傳的
二進位制包
,只要該層能處理就不需要
按照嚴格意義上的分層解析 - 比如說,網路層往上傳
二進位制包
的時候,你可以在傳輸層包一層tcp頭
,也可以不包,直接交給應用層解析
- 從底往上傳的
資料包
幀、資料包、段、訊息(傳輸資料單位)
- 幀:用於表示資料鏈路層中包的單位;
- 資料包: IP 和 UDP 等網路層以上的分層中包的單位;
- 段:表示 TCP 資料流中的資訊;
- 訊息:指應用協議中資料的單位。
資料在每個分層中的體現
- 每個分層中,都會對所傳送的資料附加一個
首部
。 - 在這個
首部
中包含了該層必要的資訊,如傳送的目標地址以及協議相關資訊。 - 通常,為協議提供的資訊為包
首部
,所要傳送的內容為資料。在下一層的角度看,從上一層收到的包全部都被認為是本層的資料。
在上面我們就能直觀地看到,每一層的資料之外,其實包了很多層協議的首部
資料鏈路層
探究:資料鏈路層到底幹了什麼?
- 主要是做了接受IP資料包,併傳送IP資料包至IP模組
- 與ARP及RARP模組互動
- 它的結構可以分為如下
- 業務區:最底下的那些物理機構成的區域,是物理層流出的起點。
- 接入層:業務區往上的千兆交換機,這裡的物流機如果想互相通訊,就必須通過這個交換機。
- 核心交換機:由一組千兆交換機組成。
- IDC路由骨幹:路由器組成。
Wireshark抓包,看看資料鏈路層在傳輸時變成了什麼?
- 首先這個是
Wireshark
給我們解析出來的TCP/IP協議族的四層。 - 從上至下,分別是
鏈路
、網路
、傳輸
、應用
- 我們著重看鏈路層,因為鏈路層在網路層之下,此時的地址都為硬體地址。
- 只有通過
硬體地址
,物理層才能將資料包通過路由傳至目標地址。 - 這裡就會有一個問題:
怎麼通過IP地址去獲取硬體地址呢?
ARP協議
作用:
- 將32bit的IP地址,轉換為48bit的乙太網地址。
- 傳送ARP廣播,獲得目的端的IP地址和硬體地址。
要注意的問題
- 訪問不存在的主機地址超過時間一般為
75s
,這個時間其實一般就是TCP連線
請求的超時時間。 - 如果
ARP
回答未返回,那麼任何TCP
報文段都不會傳送。
如何捕獲ARP資料?
- telnet
- tcpdump(相當於無介面的Wireshark)
- 命令:
- arp -a:檢視arp
快取記憶體
。(每個已經找到的mac地址都會在arp中快取
) - tcpdump -i 網路介面arp:監聽網路介面的
ARP
。 - tcpdump -D:檢視可監聽的網路介面。
- arp -a:檢視arp
MTU是什麼?
最大傳輸單元。
- IPMTU就是最大的
傳輸單元
。 - 每個路由都會有一個規定的
MTU大小
。 - 如果我們傳送的IP資料包大於這個
MTU
,就會漏傳
。 - 需要遵循
短板原理
,根據最小的MTU
來設定IP資料包大小。
總結
- 主要就是通過傳送端的
IP地址
,在內網(區域網)中通過廣播
的方式,去詢問對應IP的乙太網地址
。 - 如果訪問不到,超過
75s
,就不會繼續廣播
。 MTU
控制我們傳輸的大小。- 如果我們訪問的不是
區域網
,屬於公網
,那麼我們還通過ARP來尋找mac地址
嗎?如果是這樣,那麼我們將會給每個公網
傳送一個廣播
,那得有多恐怖
,所以ARP只存在區域網
。 - 上面這種情況,我們先通過
DNS解析
得到對應的網路IP地址
,再通過找上層的路由
去尋找,此時路由發現不是區域網
,將會在往上尋找ISP(Internet Service Provider)
,最後找到對應的mac地址
。
網路層(IP協議)
上面說到的路由,和它息息相關的就是我們的網路層,最為
核心
的一層。
協議組成(必須嚴格遵守順序)
- 版本:4位
- 首部長度:4位,⚠️注意,這裡的每1位表示
10進位制x4個位元組的數目
。因為4位最大的個數為1111,即15,所以首部最長為15x4,60位元組
。 - 服務型別:8位,大部分實現不支援,
無需關注
。 - 總長度:16位,所以最大的IP包為
65536
。 - 標識:16位,唯一標識主機傳送的每一份
資料包
。 - 3位標誌+13位片偏移:
暫時不關注
。 - 生存時間:8位,資料包最多可經過的
路由數
(如果不設定這個,就會無限回傳)。 - 上層協議:8位,表明該IP資料包對應的
上層協議
是什麼。 - 首部校驗和:16位,保證IP資料包傳輸正確。
- 源IP地址:32位。
- 目的IP地址:32位。
- 上面是Wireshark抓的包的IP層,可以清楚看到每個協議的組成。
- 需要注意⚠️
- 假如我們發的是
公網IP
,此時我們無法用ARP
找到遠端mac地址
。 - 需要通過傳送給路由,所以我們需要路由的
mac地址
。 - 本來
資料鏈路層
的乙太網首部
放的是本機mac地址
和目標mac地址
。 - 現在放的是本機
mac地址
和路由mac地址
。 - 而我們的目標
IP地址
和源IP地址
則是包在IP首部之中,最後交給路由,讓路由處理。
- 假如我們發的是
路由選擇
- 每一個IP資料包在網路中進行
傳輸
的目的,要找到目的IP的主機地址
,並最終到達該主機。所以IP資料包經過的每一個節點
都相當於是一個中轉站
,也就是路由
。 - IP資料包被路由節點的操作稱為
路由選擇
。動態選路
:根據當前網路狀況
,權值
,選出一條最佳路徑。靜態選路
:以手工方式
為每臺路由器的路由選擇表新增路由。
- 常規的路由機制
- 目的主機與源主機直接相連,或處於共享網路,
直接送達
目標主機(相同內網下)。 - 預設
轉發
至該網路存在的路由器上,再由其統一處理。
- 目的主機與源主機直接相連,或處於共享網路,
- 路由匹配演算法
- 路由表中存在與目的IP地址完全相同的條目,直接傳送至下一跳。
- 路由表中存在與目的IP地址網路號相同的條目,傳送至該條目指定的下一跳。
- 以上條件均不成立,尋找預設條目,傳送至該條目指定的下一跳。
- 均不成立,返回主機或網路不可達。
- 假如我們此時的目標IP地址為
192.168.0.100
,此時會匹配第一條
,他的Gateway
就是目標的mac地址
,en0是網路卡
,我們可以通過ifconfig
檢視(windows用ipconfig) - 假如我們此時目標IP地址為
192.168.0.103
,此時路由表沒有對應IP地址,則會去尋找相同網路號
,此時找到第二條,他的Gateway
是link#8
相當於廣播
出去。 - 假如我們此時目標IP地址為
192.168.1.2
,此時無法在路由表中匹配,則走default
,對應第三條,他的Gateway
對應192.168.0.1
,192.168.0.1
其實就是我們的路由器
。
上面有提到判斷
網路號
相同,這個我們怎麼來做呢?
如何判斷兩個IP地址網路號相同
IP地址的分類
類別 | 最大網路數 | IP地址範圍 | 最大主機數 | 私有IP地址範圍 |
---|---|---|---|---|
A | 126(2^7-2) | 0.0.0.0-127.255.255.255 | 16777214 | 10.0.0.0-10.255.255.255 |
B | 16384(2^14) | 128.0.0.0-191.255.255.255 | 65534 | 172.16.0.0-172.31.255.255 |
C | 2097152(2^21) | 192.0.0.0-223.255.255.255 | 254 | 192.168.0.0-192.168.255.255 |
- IP 地址分為五個級別,分別為A類、B類、C類、D類、E類。它根據 IP 地址中從第 1 位到第 4 位的位元列對其網路標識和主機標識進行區分。D、E類屬特殊地址。
- A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網路標識。用十進位制表示的話,0.0.0.0~127.0.0.0 是 A 類的網路地址。A 類地址的後 24 位相當於主機標識。因此,一個網段內可容納的主機地址上限為16,777,214個。
- B 類 IP 地址是前兩位 “10” 的地址,一般是公網。從第 1 位到第 16 位是它的網路標識。用十進位制表示的話,128.0.0.0~191.255.0.0 是 B 類的網路地址。B 類地址的後 16 位相當於主機標識。因此,一個網段內可容納的主機地址上限為65,534個。
- C 類 IP 地址是前三位為 “110” 的地址。從第 1 位到第 24 位是它的網路標識。用十進位制表示的話,192.0.0.0~223.255.255.0 是 C 類的網路地址。C 類地址的後 8 位相當於主機標識。因此,一個網段內可容納的主機地址上限為254個。
子網掩碼
- 為了
細分
更小力度的網路。 - 他讓A、B、C類地址的主機地址部分用作
子網地址
,可以將原網路分為多個
物理網路的一種機制
。 - 每類的都有自己預設的網路地址
類別 | 子網掩碼 |
---|---|
A | 255.0.0.0 |
B | 255.255.0.0 |
C | 255.255.255.0 |
- 通過和IP地址進行
與
運算(1&0=0;0&0=0;1&1=1)來得到網路號
,這裡的與
操作需要將IP地址轉為二進位制
在進行與
。
為什麼細分了網路?
從上面的圖,我們可以看出,每類地址的網路分段
- 題目
- 1、10.0.0.1和10.1.1.1的網路號相同嗎?
- 2、172.16.0.1和172.16.1.1的網路號呢?
- 3、192.168.10.103和192.168.0.102呢?
- 答案
- 1、相同。首先我們知道這兩個IP地址同屬A類,再將他們和預設子網掩碼
(255.0.0.0)
相與
,得到結果兩個都是10.0.0.0
,這就是他們的網路號,也正好符合圖中的前8位,10轉為二進位制就是00001010
- 2、同理可得,屬於B類,相同,並且網路號為
172.16.0.0
。 - 3、屬於C類,網路號不同,分別為
192.168.10.0
和192.168.0.0
。
- 1、相同。首先我們知道這兩個IP地址同屬A類,再將他們和預設子網掩碼
上面的題目都是在預設的子網掩碼之下,那麼如果我們改了子網掩碼呢?
- 題目
- 1、172.16.0.1和172.16.1.1的子網掩碼是255.255.255.0,此時網路號相同嗎?
- 答案
- 1、不同,此時我們在算一次,把每個IP地址都和
255.255.255.0
相與
,此時網路號分別為,172.16.0.0
和172.16.1.0
,則不同。
- 1、不同,此時我們在算一次,把每個IP地址都和
- 我們可以看到經過
子網掩碼
,把我們本來相同網段
的IP地址
,劃為不通網段
的地址,這樣就細分
了網路,有更多的物理網路
。
IP分片
當我們的MTU
最大傳輸單元(1500位元組,去掉乙太網首部,就是1480位元組)
滿足不了我們的需求時,我們就需要IP分片
(分成一片片傳輸)。
- 回顧IP協議組成中的:標誌欄位、片偏移
- 16位標識():
IP分片
時,該值被複制每一個分片中,相當於每個分片的id
。 - 三位標誌:
- 首位:保留欄位,一般為0。
- 中間位:不進行
IP分片
時為0,進行時為1。 - 末位:假如此時有3片
IP分片
,前兩片末位都為1,最後一片末位為0。
- 13位片偏移:該片偏移原始資料包開始處的位置。假如此時5片IP分片,那麼第一片的13位片偏移為1,第二片為2,讓路由知道
先後順序
。
- 16位標識():
- 錯誤處理
- 當
IP分片
時,只丟失一片
資料,也需要重傳
整個IP資料包。 - 當給定資料包的第一個資料包片到達時,開始
定時器
,過期
丟棄所有資料包片。
- 當
ICMP協議
- 屬於IP協議的
一部分
。 - 確認 IP 包
是否
成功送達目標地址,通知在傳送過程當中 IP 包被廢棄的具體原因,改善
網路設定等。 - IP包首部有一個欄位
TTL
,每經過一個路由器就會減1
,直到減到0時IP報就會被丟棄。 - 此時,IP路由器將會傳送一個ICMP超時的訊息給傳送端,通知該包已被
丟棄
。 traceroute
命令的原理就是通過ICMP超時訊息來顯示傳送主機到達特定主機之前經歷了多少路由器。
總結:
- 處理資料包在網路中的行為(路由選擇)。
- 承載端到端的資料互動方式(兩個ip的host之間的傳遞資料)。
- 缺點:
- 只是保證資料基本達到,資料可能是無序的。
- 可能是缺失的。
傳輸層(TCP協議)
解決IP層的痛點,是一種安全的協議,主要通過
連線
疏通了整一個通道,安全傳輸。
三次握手和四次揮手
三次握手
- 看前三個
箭頭
:- 客戶端傳送
SYN A1
來請求建立連線
,SYN就是synchronization(同步)
,而且此時A1是被傳在sequence(序列)
中的,此時服務端接收到客戶端傳來的A1
訊號。 - 服務端
迴應
客戶端我接收到了
,所以傳送ACK A2(只是確認應答,所以只需在原有的A1+1=A2)
,這裡的ACK就是acknowledge(確認)
。並且請求客戶端建立連線
, 此時傳送一個訊號SYN B1
。 - 客戶端接受並
確認應答
,告知服務端接收到了訊號,所以傳送ACK B2(因為上次推過來的SYN B1)
。
- 客戶端傳送
四次揮手
- 看後四個
箭頭
:- 客戶端傳送結束訊號
FIN C1
。 - 服務端接收到結束訊號,
迴應接收到了
,此時傳送訊號ACK C2
,客戶端已經關閉,但是伺服器處於半關閉狀態(客戶端不能向伺服器傳送請求,伺服器還是能接受客戶端請求)
。 - 服務端向客戶端傳送結束訊號
FIN D1
。 - 客戶端接收到結束訊號,
迴應接收到了
,此時傳送訊號ACK D2
,伺服器也關閉。
- 客戶端傳送結束訊號
通過序列號與確認應答提高可靠性
序列號
是按照順序
給傳送資料的每一個位元組(8位位元組)
都標上號碼的編號。接收端查詢接收資料TCP首部中的序列號
和資料的長度
,將自己下一步應該接收的序列號
作為確認應答
返送回去。通過序列號
和確認應答號
,TCP能夠識別是否
已經接收資料,又能夠判斷是否需要接收,從而實現可靠傳輸。
重發超時的確定
重發超時
是指在重發資料之前,等待確認應答到來的那個特定時間間隔。如果超過這個時間仍未收到確認應答,傳送端將進行資料重發
。最理想的是,找到一個最小時間
,它能保證“確認應答一定能在這個時間內返回”。- TCP 要求不論處在何種網路環境下都要提供高效能通訊,並且無論網路擁堵情況發生何種變化,都必須保持這一特性。為此,它在每次發包時都會計算往返時間及其
偏差
。將這個往返時間和偏差時間相加,重發超時
的時間就是比這個總和要稍大一點的值。 - 在 BSD 的 Unix 以及Windows系統中,超時都以0.5秒為單位進行控制,因此重發超時都是0.5秒的
整數倍
。不過,最初其重發超時
的預設值一般設定為6秒
左右。 - 資料被重發之後若還是收不到確認應答,則進行
再次傳送
。此時,等待確認應答的時間將會以2倍、4倍
的指數函式延長
。 - 此外,資料也不會被無限、反覆地重發。達到一定重發次數之後,如果仍沒有任何確認應答返回,就會判斷為網路或對端主機發生了異常,
強制關閉連線
。並且通知應用通訊異常強行終止
。
以段為單位傳送資料
- 在建立
TCP
連線的同時,也可以確定傳送資料包的單位,我們也可以稱其為“最大訊息長度”(MSS)
。最理想的情況是,最大訊息長度正好是IP中不會被分片處理的最大資料長度。 TCP
在傳送大量資料時,是以MSS
的大小將資料進行分割傳送。進行重發時也是以MSS
為單位。MSS
在三次握手的時候,在兩端主機之間被計算得出。兩端的主機在發出建立連線的請求時,會在TCP
首部中寫入MSS
選項,告訴對方自己的介面能夠適應的MSS
的大小。然後會在兩者之間選擇一個較小的值投入使用。
利用視窗控制提高速度
TCP
以1個段為單位,每傳送一個段進行一次確認應答的處理。這樣的傳輸方式有一個缺點
,就是包的往返時間越長通訊效能
就越低。- 為解決這個問題,TCP引入了
視窗
這個概念。確認應答不再是以每個分段
,而是以更大的單位
進行確認,轉發時間將會被大幅地縮短
。也就是說,傳送端主機,在傳送了一個段以後不必要
一直等待確認應答,而是繼續傳送
。 - 視窗大小就是指無需等待確認應答而可以繼續傳送資料的最大值。這個機制實現了使用大量的
緩衝區
,通過對多個段同時進行確認應答的功能。
總結:
- 抽象出
連線
的概念,在一個TCP連線中,僅有兩方彼此通訊
。 - 保證了可靠資料傳輸及正確順序的
資料處理
。 - 提供
流量控制
(Node.js中的流)
應用層(HTTP協議)
我會留到下一篇再講,同時我會結合
node
來講解其中的http
的應用和原理,敬請期待。