爲什麼網絡要分層?每一層的職責、包含哪些協議?

這是一道我秋招面試字節遇到的真題。

這篇文章我會首先結合我們日常的軟件系統開發介紹 「“爲什麼網絡要分層”?」 ,隨後我會介紹 「“OSI 7 層模型”」 以及 「“TCP/IP 4 層模型”」。我會詳細介紹目前廣泛使用的 「“TCP/IP 4 層模型”」 包括每一層做的事情以及相關的協議介紹。

01 爲什麼網絡要分層?

說到分層,我們先從我們平時使用框架開發一個後臺程序來說,我們往往會按照每一層做不同的事情的原則將系統分爲 三層(複雜的系統分層可能會更多):

  1. Repository(數據庫操作)

  2. Service(業務操作)

  3. Controller(前後端數據交互)

「複雜的系統需要分層,因爲每一層都需要專注於一類事情。我們的網絡分層的原因也是一樣,每一層只專注於做一類事情。」

「爲什麼計算機網絡要分層呢?」 , 我們再來較爲系統的說一說:

  1. 「各層之間相互獨立」:各層之間相互獨立,各層之間不需要關心其他層是如何實現的,只需要知道自己如何調用下層提供好的功能就可以了(可以簡單理解爲接口調用)「。這個和我們對開發時系統進行分層是一個道理。」

  2. 「提高了整體靈活性」 :每一層都可以使用最適合的技術來實現,你只需要保證你提供的功能以及暴露的接口的規則沒有改變就行了。「這個和我們平時開發系統的時候要求的高內聚、低耦合的原則也是可以對應上的。」

  3. 「大問題化小」 :分層可以將複雜的網絡間題分解爲許多比較小的、界線比較清晰簡單的小問題來處理和解決。這樣使得複雜的計算機網絡系統變得易於設計,實現和標準化。 「這個和我們平時開發的時候,一般會將系統功能分解,然後將複雜的問題分解爲容易理解的更小的問題是相對應的,這些較小的問題具有更好的邊界(目標和接口)定義。」

說到計算機網絡分層,我想到了計算機世界非常非常有名的一句話,這裏分享一下:

「計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決,計算機整個體系從上到下都是按照嚴格的層次結構設計的。」

大白:如果一層不夠那就加兩層吧!

「爲了更好地去了解網絡分層,我們先來看一個雖然失敗,但是卻提供了很多不錯的理論基礎的 OSI 七層模型。」

02 OSI 七層模型

OSI 七層模型的大體結構以及每一層提供的功能如下。「每一層都專注做一件事情,並且每一層都需要使用下一層提供的功能比如傳輸層需要使用網絡層提供的路有和尋址功能,這樣傳輸層才知道把數據傳輸到哪裏去。」

OSI 七層模型

「OSI 的七層體系結構概念清楚,理論也很完整,但是它比較複雜而且不實用,而且有些功能在多個層中重複出現。」

上面這種圖可能比較抽象,再來一個比較生動的圖片。下面這個圖片是我在國外的一個網站上看到的,非常贊!

在這裏順帶提一下:「爲什麼最開始的時候一直被一些大公司甚至一些國家政府支持的 OSI 七層模型會失敗呢?」

  1. OSI 的專家缺乏實際經驗,他們在完成 OSI 標準時缺乏商業驅動力

  2. OSI 的協議實現起來過分複雜,而且運行效率很低

  3. OSI 制定標準的週期太長,因而使得按 OSI 標準生產的設備無法及時進入市場(20 世紀 90 年代初期,雖然整套的 OSI 國際標準都已經制定出來,但基於 TCP/IP 的互聯網已經搶先在全球相當大的範圍成功運行了)

  4. OSI 的層次劃分不太合理,有些功能在多個層次中重複出現。

03 TCP/IP 4 層模型

這是目前被廣泛採用的一種模型, 我們可以將 TCP / IP 模型看作是 OSI 7 層模型的精簡版本,由以下 4 層組成:

  1. 應用層

  2. 傳輸層

  3. 網絡層

  4. 網絡接口層

需要注意的是,我們並不能將 TCP/IP4 層模型 和 OSI7 層模型完全精確地匹配起來,不過可以簡單將兩者對應起來,如下圖所示:

TCP-IP-4-model

04 TCP/IP 4 層模型網絡協議概覽

network-protocol-overview

「應用層協議」 :

「傳輸層協議」 :

「網絡層協議」 :

「網絡接口層」 :

應用層(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 協議這塊後面不會花費太多篇幅來講解,直接提一下兩個比較重要的問題:

  1. 電子郵件的發送過程

  2. 如何判斷郵箱是真正存在的?

「電子郵件的發送過程?」

比如我的郵箱是 “dabai@cszhinan.com”,我要向 “xiaoma@qq.com” 發送郵件,整個過程可以簡單分爲下面幾步:

  1. 通過 「SMTP」 協議,我將我寫好的郵件交給 163 郵箱服務器(郵局)。

  2. 163 郵箱服務器發現我發送的郵箱是 qq 郵箱,然後它使用 SMTP 協議將我的郵件轉發到 qq 郵箱服務器。

  3. qq 郵箱服務器接收郵件之後就通知郵箱爲 “xiaoma@qq.com” 的用戶來收郵件,然後用戶就通過 「POP3/IMAP」 協議將郵件取出。

一個電子郵件被髮送的過程

「如何判斷郵箱是真正存在的?」

很多場景 (比如郵件營銷) 下面我們需要判斷我們要發送的郵箱地址是否真的存在,這個時候我們可以利用 SMTP 協議來檢測。這裏就不多扯,再扯的話,估計這篇文章的內容會很多,這並不是我的一貫風格。推薦幾個在線郵箱是否有效檢測工具:

  1. https://verify-email.org/

  2. http://tool.chacuo.net/mailverify

  3. 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 連接):

  1. 控制連接:用於傳送控制信息(命令和響應)

  2. 數據連接:用於數據傳送;

這種將命令和數據分開傳送的思想大大提高了 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)

「傳輸層的主要任務就是負責向兩臺主機進程之間的通信提供通用的數據傳輸服務」。應用進程利用該服務傳送應用層報文。“通用的” 是指並不針對某一個特定的網絡應用,而是多種應用可以使用同一個運輸層服務。

「運輸層主要使用以下兩種協議:」

  1. 「傳輸控制協議 TCP」(Transmisson Control Protocol)-- 提供「面向連接」的,「可靠的」數據傳輸服務。

  2. 「用戶數據協議 UDP」(User Datagram Protocol)-- 提供「無連接」的,盡最大努力的數據傳輸服務(「不保證數據傳輸的可靠性」)。

關於 TCP 和 UDP 的詳細介紹會在後面的文章中介紹到。

網絡層(Network layer)

網絡層負責爲分組交換網上的不同主機提供通信服務。在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網絡層使用 IP 協議,因此分組也叫 IP 數據報,簡稱數據報。

注意⚠️:「不要把運輸層的 “用戶數據報 UDP” 和網絡層的 “IP 數據報” 弄混」。

「網絡層的還有一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分株,能通過網絡層中的路由器找到目的主機。」

這裏強調指出,網絡層中的 “網絡” 二字已經不是我們通常談到的具體網絡,而是指計算機網絡體系結構模型中第三層的名稱.

互聯網是由大量的異構(heterogeneous)網絡通過路由器(router)相互連接起來的。互聯網使用的網絡層協議是無連接的網際協議(Intert Prococol)和許多路由選擇協議,因此互聯網的網絡層也叫做「網際層」或「IP 層」。

網絡接口層

我們可以把網絡接口層看作是數據鏈路層和物理層的合體。

  1. 數據鏈路層 (data link layer) 通常簡稱爲鏈路層( 兩臺主機之間的數據傳輸,總是在一段一段的鏈路上傳送的)。「數據鏈路層的作用是將網絡層交下來的 IP 數據報組裝成幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。」

  2. 「物理層的作用是實現相鄰計算機節點之間比特流的透明傳送,儘可能屏蔽掉具體傳輸介質和物理設備的差異」

最後再分享一個關於 OSI 七層模型非常不錯的總結圖片!

Reference

  1. https://medium.com/@james_aka_yale/the-4-layer-internet-model-network-engineers-need-to-know-e78432614a4f

  2. https://www.guru99.com/tcp-ip-model.html

  3. https://www.freeccnastudyguide.com/study-guides/ccna/ch1/1-4-tcpip-model/

  4. OSI 七層模型與 TCP/IP 四層模型— https://wsgzao.github.io/post/osi/

歡迎關注 「CS 指南」

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Vm30Ks_FQle-IKA663z7Qg