原文鏈接:
https://mp.weixin.qq.com/s/-xW8La3fjjN0Lc_aWXEofQ
這是一道我在秋招面試位元組遇到的真題,
這篇文章我會首先結合我們日常的軟體系統開發介紹 「“為什么網路要分層”?」 ,隨后我會介紹 「“OSI 7 層模型”」 以及 「“ TCP/IP 4層模型 ”」,我會詳細介紹目前廣泛使用的 「“ TCP/IP 4層模型 ”」 包括每一層做的事情以及相關的協議介紹,
01 為什么網路要分層?
說到分層,我們先從我們平時使用框架開發一個后臺程式來說,我們往往會按照每一層做不同的事情的原則將系統分為 三層(復雜的系統分層可能會更多):
- Repository(資料庫操作)
- Service(業務操作)
- Controller(前后端資料互動)
「復雜的系統需要分層,因為每一層都需要專注于一類事情,我們的網路分層的原因也是一樣,每一層只專注于做一類事情,」
「為什么計算機網路要分層呢?」 ,我們再來較為系統的說一說:
- 「各層之間相互獨立」:各層之間相互獨立,各層之間不需要關心其他層是如何實作的,只需要知道自己如何呼叫下層提供好的功能就可以了(可以簡單理解為介面呼叫)「,這個和我們對開發時系統進行分層是一個道理,」
- 「提高了整體靈活性」 :每一層都可以使用最適合的技術來實作,你只需要保證你提供的功能以及暴露的介面的規則沒有改變就行了,「這個和我們平時開發系統的時候要求的高內聚、低耦合的原則也是可以對應上的,」
- 「大問題化小」 :分層可以將復雜的網路間題分解為許多比較小的、界線比較清晰簡單的小問題來處理和解決,這樣使得復雜的計算機網路系統變得易于設計,實作和標準化, 「這個和我們平時開發的時候,一般會將系統功能分解,然后將復雜的問題分解為容易理解的更小的問題是相對應的,這些較小的問題具有更好的邊界(目標和介面)定義,」
說到計算機網路分層,我想到了計算機世界非常非常有名的一句話,這里分享一下:
「計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決,計算機整個體系從上到下都是按照嚴格的層次結構設計的,」
大白:如果一層不夠那就加兩層吧!
「為了更好地去了解網路分層,我們先來看一個雖然失敗,但是卻提供了很多不錯的理論基礎的OSI七層模型,」
02 OSI七層模型
OSI七層模型的大體結構以及每一層提供的功能如下,「每一層都專注做一件事情,并且每一層都需要使用下一層提供的功能比如傳輸層需要使用網路層提供的路有和尋址功能,這樣傳輸層才知道把資料傳輸到哪里去,」

OSI七層模型
「OSI的七層體系結構概念清楚,理論也很完整,但是它比較復雜而且不實用,而且有些功能在多個層中重復出現,」
上面這種圖可能比較抽象,再來一個比較生動的圖片,下面這個圖片是我在國外的一個網站上看到的,非常贊!

在這里順帶提一下:「為什么最開始的時候一直被一些大公司甚至一些國家政府支持的OSI七層模型會失敗呢?」
- OSI的專家缺乏實際經驗,他們在完成OSI標準時缺乏商業驅動力
- OSI的協議實作起來過分復雜,而且運行效率很低
- OSI制定標準的周期太長,因而使得按OSI標準生產的設備無法及時進入市場(20世紀90年代初期,雖然整套的OSI國際標準都已經制定出來,但基于TCP/IP的互聯網已經搶先在全球相當大的范圍成功運行了)
- OSI的層次劃分不太合理,有些功能在多個層次中重復出現,
03 TCP/IP 4層模型
這是目前被廣泛采用的一種模型,我們可以將 TCP / IP 模型看作是 OSI 7層模型的精簡版本,由以下4層組成:
- 應用層
- 傳輸層
- 網路層
- 網路介面層
需要注意的是,我們并不能將 TCP/IP4層模型 和OSI7層模型完全精確地匹配起來,不過可以簡單將兩者對應起來,如下圖所示:

TCP-IP-4-model
04 TCP/IP 4層模型網路協議概覽

network-protocol-overview
「應用層協議」 :
- HTTP 協議(超文本傳輸協議,網頁瀏覽常用的協議)
- DHCP 協議(動態主機配置)
- DNS 系統原理(域名系統)
- FTP 協議(檔案傳輸協議)
- Telnet協議(遠程登陸協議)
- 電子郵件協議等(SMTP、POP3、IMAP)
- ......
「傳輸層協議」 :
- TCP 協議
- 報文段結構
- 可靠資料傳輸
- 流量控制
- 擁塞控制
- UDP 協議
- 報文段結構
- RDT(可靠資料傳輸協議)
「網路層協議」 :
- IP 協議(TCP/IP 協議的基礎,分為 IPv4 和 IPv6)
- ARP 協議(地址決議協議,用于決議 IP 地址和 MAC 地址之間的映射)
- ICMP 協議(控制報文協議,用于發送控制訊息)
- NAT 協議(網路地址轉換協議)
- RIP 協議、OSPF 協議、BGP 協議(路由選擇協議)
- ......
「網路介面層」 :
- 差錯檢測技術
- 多路訪問協議(信道復用技術)
- CSMA/CD 協議
- MAC 協議
- 以太網技術
- ......
應用層(Application layer)
應用層的任務是通過應用行程間的互動來完成特定網路應用,我們把應用層互動的資料單元稱為報文,「應用層協議定義的是應用行程(行程:主機中正在運行的程式,比如微信、QQ)間的通信和互動的規則,對于不同的網路應用需要不同的應用層協議,」 在互聯網中應用層協議很多,如域名系統DNS,支持Web應用的HTTP協議,支持電子郵件的SMTP協議等等,
簡單總結一下當今使用的一些最常見的應用層協議:
HTTP:超文本傳輸協議
「超文本傳輸協議(HTTP,HyperText Transfer Protocol)主要是為 Web 瀏覽器與 Web 服務器之間的通信而設計的,」
當我們使用瀏覽器瀏覽網頁的時候,我們網頁就是通過 HTTP 請求進行加載的,整個程序如下圖所示,

HTTP請求程序
「HTTP 協議是基于 TCP協議的」,發送 HTTP 請求之前首先要建立 TCP 連接也就是要經歷 3 次握手,目前使用的 HTTP 協議大部分都是 1.1,在 1.1 的協議里面,默認是開啟了 Keep-Alive 的,這樣的話建立的連接就可以在多次請求中被復用了,
另外, 「HTTP 協議是”無狀態”的協議,它無法記錄客戶端用戶的狀態」 一般我們都是通過 Session 來記錄客戶端用戶的狀態,
SMTP:簡單郵件傳輸(發送)協議
「簡單郵件傳輸協議(SMTP,Simple Mail Transfer Protocol)的縮寫,基于 TCP 協議,用來發送電子郵件,」
注意??:「接受郵件的協議不是 SMTP 二是POP3協議,」
SMTP 協議這塊后面不會花費太多篇幅來講解,直接提一下兩個比較重要的問題:
- 電子郵件的發送程序
- 如何判斷郵箱是真正存在的?
「電子郵件的發送程序?」
比如我的郵箱是“dabai@cszhinan.com”,我要向“xiaoma@qq.com”發送郵件,整個程序可以簡單分為下面幾步:
- 通過 「SMTP」 協議,我將我寫好的郵件交給163郵箱服務器(郵局),
- 163郵箱服務器發現我發送的郵箱是qq郵箱,然后它使用 SMTP協議將我的郵件轉發到 qq郵箱服務器,
- qq郵箱服務器接收郵件之后就通知郵箱為“xiaoma@qq.com”的用戶來收郵件,然后用戶就通過 「POP3/IMAP」 協議將郵件取出,

一個電子郵件被發送的程序
「如何判斷郵箱是真正存在的?」
很多場景(比如郵件營銷)下面我們需要判斷我們要發送的郵箱地址是否真的存在,這個時候我們可以利用 SMTP 協議來檢測,這里就不多扯,再扯的話,估計這篇文章的內容會很多,這并不是我的一貫風格,推薦幾個在線郵箱是否有效檢測工具:
- https://verify-email.org/
- http://tool.chacuo.net/mailverify
- https://www.emailcamel.com/
POP3/IMAP:郵件接收的協議
這兩個協議不多做闡述,只需要了解 「POP3 和 IMAP 兩者都是負責郵件接收的協議」即可,另外,需要注意不要將這兩者和 SMTP 協議搞混淆了,「SMTP 協議只負責郵件的發送,真正負責接收的協議是POP3/IMAP,」
IMAP 協議相比于POP3更新一點,為用戶提供的可選功能也更多一點,幾乎所有現代電子郵件客戶端和服務器都支持IMAP,大部分網路郵件服務提供商都支持POP3和IMAP,
FTP:檔案傳輸協議
「檔案傳輸協議 FTP(File Transfer Protocol),提供檔案傳輸服務,基于 TCP 實作可靠的傳輸,使用 FTP 傳輸檔案的好處是可以屏蔽作業系統和檔案存盤方式,」
FTP 是基于客戶—服務器(C/S)模型而設計的,在客戶端與 FTP 服務器之間建立兩個連接,如果我們要基于 FTP 協議開發一個檔案傳輸的軟體的話,首先需要搞清楚 FTP 的原理,關于 FTP 的原理,很多書籍上已經描述的非常詳細了:
FTP 的獨特的優勢同時也是與其它客戶服務器程式最大的不同點就在于它在兩臺通信的主機之間使用了兩條 TCP 連接(其它客戶服務器應用程式一般只有一條 TCP 連接):
控制連接:用于傳送控制資訊(命令和回應)
資料連接:用于資料傳送;
這種將命令和資料分開傳送的思想大大提高了 FTP 的效率,

FTP作業程序
DNS:域名系統
「域名系統(DNS,Domain Name System)將人類可讀的域名 (例如,www.baidu.com) 轉換為機器可讀的 IP 地址 (例如,220.181.38.148),」我們可以將其理解為專為互聯網設計的電話薄,

dns-overview
IP 地址是一個網卡再網路世界中的通訊地址,我們可以把它理解為我們現實世界中的家庭地址,
「DNS 決議的完整流程是怎樣的呢?」 (這個會在后面的文章中詳細介紹到)

DNS 決議的完整流程
Telnet:遠程登陸協議
遠程登陸協議,通過一個終端登陸到其他服務器,建立在可靠的傳輸協議 TCP 之上,
「Telnet協議的最大缺點之一是所有資料(包括用戶名和密碼)均以明文形式發送,這有潛在的安全風險,這就是為什么如今很少使用Telnet并被一種稱為SSH的非常安全的協議所取代的主要原因,」
SSH:安全的網路傳輸協議
SSH( Secure Shell)是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議,利用 SSH 協議可以有效防止遠程管理程序中的資訊泄露問題,SSH 建立在可靠的傳輸協議 TCP 之上,
「Telnet 和 SSH 之間的主要區別在于 SSH 協議會對傳輸的資料進行加密保證資料安全性,」
傳輸層(Transport layer)
「傳輸層的主要任務就是負責向兩臺主機行程之間的通信提供通用的資料傳輸服務」,應用行程利用該服務傳送應用層報文,“通用的”是指并不針對某一個特定的網路應用,而是多種應用可以使用同一個運輸層服務,
「運輸層主要使用以下兩種協議:」
- 「傳輸控制協議TCP」(Transmisson Control Protocol)--提供「面向連接」的,「可靠的」資料傳輸服務,
- 「用戶資料協議UDP」(User Datagram Protocol)--提供「無連接」的,盡最大努力的資料傳輸服務(「不保證資料傳輸的可靠性」),
關于 TCP 和 UDP 的詳細介紹會在后面的文章中介紹到,
網路層(Network layer)
網路層負責為分組交換網上的不同主機提供通信服務,在發送資料時,網路層把運輸層產生的報文段或用戶資料報封裝成分組和包進行傳送,在TCP/IP體系結構中,由于網路層使用IP協議,因此分組也叫IP資料報,簡稱資料報,
注意??:「不要把運輸層的“用戶資料報UDP”和網路層的“IP資料報”弄混」,
「網路層的還有一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分株,能通過網路層中的路由器找到目的主機,」
這里強調指出,網路層中的“網路”二字已經不是我們通常談到的具體網路,而是指計算機網路體系結構模型中第三層的名稱.
互聯網是由大量的異構(heterogeneous)網路通過路由器(router)相互連接起來的,互聯網使用的網路層協議是無連接的網際協議(Intert Prococol)和許多路由選擇協議,因此互聯網的網路層也叫做「網際層」或「IP層」,
網路介面層
我們可以把網路介面層看作是資料鏈路層和物理層的合體,
- 資料鏈路層(data link layer)通常簡稱為鏈路層( 兩臺主機之間的資料傳輸,總是在一段一段的鏈路上傳送的),「資料鏈路層的作用是將網路層交下來的 IP 資料報組裝成幀,在兩個相鄰節點間的鏈路上傳送幀,每一幀包括資料和必要的控制資訊(如同步資訊,地址資訊,差錯控制等),」
- 「物理層的作用是實作相鄰計算機節點之間位元流的透明傳送,盡可能屏蔽掉具體傳輸介質和物理設備的差異」
最后再分享一個關于OSI 七層模型非常不錯的總結圖片!

Reference
- https://medium.com/@james_aka_yale/the-4-layer-internet-model-network-engineers-need-to-know-e78432614a4f
- https://www.guru99.com/tcp-ip-model.html
- https://www.freeccnastudyguide.com/study-guides/ccna/ch1/1-4-tcpip-model/
- OSI 七層模型與 TCP/IP 四層模型— https://wsgzao.github.io/post/osi/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301286.html
標籤:其他
