一篇文章,只用看三遍,終生不忘網路分層

原文出自:公眾號 程式新視界

原文連結:https://mp。weixin。qq。com/s/3t3-HWYPbuTIhJ4p5m3ZlA

前言

如果你對網路分層不太瞭解,當聽到三層協議、五層協議時是不是一頭霧水?不知道所謂的層是什麼,所謂的協議是什麼?甚至對網路通訊都知之甚少,那麼這篇文章一定能夠讓你快速學到,如果沒有收穫就別點贊。

網路、通訊、協議

在深入學習之前,先了解一些基本的概念。

網路是什麼?網路是用物理鏈路將工作站或主機相連在一起,組成資料鏈路,從而達到資源共享和通訊的目的。這裡的物理鏈路不僅僅指的是我們能夠看得到的雙絞線、光纖,也可能是無線電波。

網路通訊,狹義的講,可以理解為計算機與計算機之間基於網路進行的資料交換。當然,這個過程中也有人與計算機的互動。

就像人與人溝通一樣,既然想“聊天”,最起碼得有一個基本條件,比如都使用漢語或英語,這算是一個比較寬泛的協議了。而在計算機通訊當中,也差不多,就是約定好咱們互動時的資料格式是什麼,每個資料項什麼意思,然後你收到之後應該怎麼處理或怎麼迴應。

暫且不管官方的定義,簡單來說,網際網路協議就是在網際網路上傳輸資料的規則。當然,協議是非常多的,比如TCP、UDP、IP協議、FTP協議等等。而使用這些協議最基本的要求就是傳送方和接收方所使用的協議必須一致,否則不就雞同鴨講了嘛。

當我們說幾層協議時,一般來說:一臺裝置上的第X層與另一臺裝置上的第X層進行通訊的規則就是第X層協議。

網路分層模型

就像一家公司,有老闆、經理、組長、成員,不同層面的人有不同的溝通方式,但最終還是從上而下的進行實施。老闆與老闆的溝通就相當於應用層之間的溝通,而老闆的目標又需要下面經理的支援,就像應用層需要傳輸層的支援一樣。

理解了網路分層的基本作用,來看看網路分層的幾種方式。標準的七層網路分層,也就是OSI七層模型。TCP/IP五層模型和TCP/IP四層模型是從OSI七層最佳化而來。

一篇文章,只用看三遍,終生不忘網路分層

通常,作為使用者來講,使用最多的就是應用層了,大多數情況下可能都感知不到其他層的存在。

那麼,為什麼要分層呢?這樣與我們設計軟體架構的思想差不多,就是要具有高內聚、低耦合、複用、擴充套件性等特性。試想一下,如果沒有分層,當一個業務或協議需要改變時,我們只能針對整個系統做修改或擴充套件。而分層之後,便可以很方便的把不同功能的模組抽離出來,修改對應的模組即可。而且不同層還可以被複用,只要確保按照這個層的協議來處理就可以了。

後面呢,我們就主要針對TCP/IP五層模型來進行逐個講解。

網路分層與協議

上面瞭解了協議和網路分層,這裡透過一張圖來對照一下常見的協議都位於哪個層。

一篇文章,只用看三遍,終生不忘網路分層

網路分層與物理裝置

透過一張圖,看一下不同網路分層通常對應的硬體裝置:

一篇文章,只用看三遍,終生不忘網路分層

物理層

瞭解了上面的基礎知識,我們下面就來看看每層的作用,而透過功能的關聯性來記憶網路的分層是一個非常好的記憶方法。我們首先來看物理層。

這一層就是把各個網路裝置連線起來,讓其可以傳輸0 1 0 1的電訊號

物理層,顧名思義,用物理手段將電腦連線起來,基本上是用雙絞線、光纖、無線電波的方式來實現物理層。網路裝置連線起來之後,就可以基於它來發送高低電壓(電訊號)進行通訊,高電壓對應數字1,低電壓對應數字0。0、1訊號本身沒有任何的現實意義,所有需要用另一層用來規定不同0、1組合的意義。

資料鏈路層

單純的電訊號0和1沒有任何意義,必須規定電訊號多少位一組,每組什麼意思。資料鏈路層的功能就是透過規定一套協議來定義電訊號的分組方式,以及規定不同的組代表什麼意思,從而雙方計算機都能夠進行識別,這個協議就是“乙太網協議”。

乙太網協議規定,一組電訊號構成一個數據包,我們把這個資料包稱之為幀。每一個楨由包頭(Head)和資料(Data)兩部分組成。

一篇文章,只用看三遍,終生不忘網路分層

其中Head包含資料包的一些說明資訊,包括髮送者、接收者、資料型別;Data則是資料包的具體內容。

Head部分包含固定的18個位元組:

傳送者/源地址,6個位元組;

接收者/目標地址,6個位元組;

資料型別,6個位元組。

Data部分的長度,最短為46位元組,最長為1500位元組。因此,整個”幀”最短為64位元組,最長為1518位元組。如果資料很長,就必須分割成多個幀進行傳送。

有了資料包的定義,那麼計算機是如何標識誰是誰?以及如何知道對方的地址呢?這就涉及到MAC地址和廣播。

MAC地址

乙太網規定,連入網路的所有裝置都必須具有網絡卡。資料包的傳送地址和接收地址指的就是網絡卡地址,也就是MAC地址。

MAC地址作為網路中計算機裝置的唯一標識,從計算機在廠商生產出來就被十六進位制的數標識為MAC地址,MAC地址理論上是獨一無二的。這也是為什麼很多軟體校驗裝置唯一性時,會用到MAC地址。

MAC地址長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)。

一篇文章,只用看三遍,終生不忘網路分層

有了MAC地址,那麼兩臺機器之間是找到對方進行通訊的呢?

廣播

有了MAC地址,在同一網路內的兩臺主機就可以通訊了。

一篇文章,只用看三遍,終生不忘網路分層

在同一個子網中,計算機1要向計算機4傳送一個數據包,資料包中包含接收方的MAC地址。計算機1向本網路內所有計算機都發送(以廣播的方式),這時同一子網中的每臺計算機 (包括2、3)都會收到這個資料包的。然後每臺計算機都會把資料包的MAC地址取出來,與自身的MAC地址進行對比,如果兩者相同,則接受這個資料包,否則就丟棄這個資料包。計算機4發現包含自己的MAC地址,於是就進行響應。

網路層

乙太網透過廣播這種很原始的形式,解決了兩臺計算機之間的通訊問題。但很明顯,它不是把資料包準確的送達接收方,而是向網路中所有的計算機發送資料包。

而我們所處的網路是由無數個子網路構成的。即便忽略掉子網的存在,如果所有的通訊都採用乙太網的廣播方式,那麼一臺機器傳送的包全世界都會收到,整個網路是會奔潰的。

而實現的網路又是由無數個子網路構成的,乙太網採用廣播方式傳送資料包,效率低且傳送的資料只能侷限在傳送者所在的子網路。

此時就需要另想辦法,如果是同一個子網路,就採用廣播方式傳送,如果不是在同一個子網 , 那就透過閘道器和路由向不同廣播域/子網分發資料包。所以就有了網路層,它是處理分組在網路中的活動,比如分組的選路。

網路層引入一套新的協議用來區分不同的廣播域/子網,於是就有了IP 協議。

IP 協議

網路地址協議,叫做IP協議。相對於上面講到的MAC地址, IP 地址可以理解成邏輯地址,也就是說 MAC 地址是物理上的地址,是固定的。IP 地址是動態分配的,是不固定的。現在廣泛採用的IPv4地址,同時IPv6也在不斷的發展壯大。

透過IP協議傳送的資料,就叫做IP資料包,也分為“包頭”和“資料”兩個部分:“包頭”部分主要包括版本、長度、IP地址等資訊;“資料”部分則是IP資料包的具體內容。IP資料包的”包頭”部分的長度為20到60位元組,整個資料包的總長度最大為65535位元組。

IPv4地址是由32位的二進位制陣列成,一般把它分成4段的十進位制表示,地址範圍為0。0。0。0~255。255。255。255。

IP地址分成兩部分:網路部分(標識子網)和主機部分(標識主機)。網路部分和主機部分所佔用的二進位制位數是不固定的。

IP地址段只是標識了IP地址的種類,從網路部分或主機部分都無法辨識一個IP所處的子網。如果兩個IP的網路部分相同,則說明它們處於同一個子網中。例如192。168。33。1和192。168。33。2,如果它們的網路部分為24位,主機部分為8位,網路部分都為 192。168。33,處於同一個子網中。

但如果像192。16。10。1與192。16。10。2,並不知道網路部分和主機部分各幾位,就不能確定是否處於同一子網。於是就有了子網掩碼。

子網掩碼

子網掩碼就是用來標識同一區域網中的 IP 地址的資訊的。子網掩碼也是由 32 個二進位制位組成的,但是隻能用 0 或 1 來表示,如11111111。11111111。11111111。00000000。

子網掩碼的網路部分全部為1,主機部分全部為0。兩臺計算機的 IP 地址分別和子網掩碼進行一種AND 運算(兩個數位都為1,運算結果為1,否則為0),如果結果相同,兩臺計算機就在同一區域網中,否則就不在同一區域網中。

比如IP地址為192。16。10。1,如果已知網路部分是前24位,主機部分是後8位,那麼子網路掩碼就是11111111。11111111。11111111。00000000,寫成十進位制就是255。255。255。0。

假設192。168。33。1和192。168。33。2的子碼掩碼都為255。255。255。0,把IP與子碼掩碼相與,結果都為192。168。33。0,那麼它們說明處於同一個子網中。

ARP協議

有了IP協議,可以判斷計算機屬於哪個子網了。在鏈路層時我們透過MAC地址進行通訊的,現在只有目標的IP地址,如何才能拿到它的MAC地址呢?這就又要用到ARP協議。

ARP協議可以透過廣播的方式傳送資料包,獲取目標主機的MAC地址。具體實現為:傳送端主機透過廣播的方式傳送資料包,所有主機接收後拆開包,如果發現目標IP為自己就響應,返回MAC地址。

資料包格式:(傳送端的MAC地址,目標MAC地址,傳送端IP地址,目標IP地址,資料)。

傳輸層

經過資料鏈路層和網路層的支援,我們已經可以正常在兩臺計算機之間進行通訊了,但是計算機會同時執行著許多程式,比如同時開著QQ與WX,那麼怎麼區分訊息是QQ的還是WX的呢?

通常我們會看到計算機上執行的不同程式都會分配不同的埠,而傳輸層的功能就是建立埠到埠的通訊,使得資料能夠正確的傳送給不同的應用程式。

埠是每一個使用網絡卡的程式的編號,每一個埠號標誌一個可執行程式。埠號是0到65535之間的一個整數,正好16個二進位制位,0-1023為系統佔用埠,其他應用程式只能選用大於1023的埠。

至此,用IP + 埠,已經能實現唯一確定網際網路上一個程式,進而實現網路間的程式通訊了。

傳輸層最常見的兩大協議是 TCP(Transmission Control Protocol,傳輸控制協議) 協議和 UDP(User Data Protocol,使用者資料報協議) 協議。

UDP協議就是在資料前面加上埠號,“包頭”部分主要定義了發出埠和接收埠,一共只有8個位元組。“資料”部分就是具體的內容。總長度不超過65,535位元組,正好放進一個IP資料包。

UDP協議簡單且容易實現,這是它的優點。但同樣也有缺點,就是進行通訊時不知道對方是否接收到資料了。此時需要再定義一套規則,讓其可以和對方進行確認,那麼TCP出現了。

TCP資料包沒有長度限制,理論上可以無限長,可是為了保證網路的效率,通常TCP資料包的長度不會超過IP資料包的長度,也就是小於65,535位元組,這也確保單個TCP資料包不必再分割。像我們通常說 TCP 三次握手和四次揮手,就是傳輸層完成的。關於TCP實現部分的內容比較多,我們這裡就不再拓展了。

TCP的優點是能夠確保資料不會遺失,安全可靠的傳輸。缺點是過程複雜、實現困難、消耗較多的資源。

應用層

終於說到應用層了,應用層算是我們最經常看到的一層了。應用層的功能就是規定了應用程式的資料格式。我們經常用的電子郵件、HTTP協議以及FTP資料的格式,就是在應用層定義的。

應用層的主要協議有:FTP(檔案傳送協議、21埠)、Telnet(遠端登入協議)、DNS(域名解析協議)、SMTP(郵件傳送協議、25埠),POP3協議(郵局協議),HTTP協議(Hyper Text Transfer Protocol、80埠)。

正反俄羅斯套娃

最後,我們以HTTP請求為例,來梳理一下整個網路分層中各種的職責與處理流程。在整個通訊過程中,就像俄羅斯套娃一樣,一層層的包裝起來,然後再一層層的開啟。

一篇文章,只用看三遍,終生不忘網路分層

小結

經過這篇文章,我們從最下方的物理層到最上方的應用層,按照故事性的形式進行了講解,想必你已經有一個感性的認識了,是不是發現再也不用死記硬背網路分層了?你就說值不值得來個贊?