【鏈塊技術49期】區塊鏈技術基礎語言(三十一):Go語言網絡編程(上)

原文鏈接:區塊鏈技術基礎語言(三十一):Go語言網絡編程(上)

 

一、網絡概述

 

1.1 網絡協議

網絡協議就是爲網絡數據交換而制定的規則、約定與標準。

 

1.2 分層模型

爲了降低網絡設計的複雜性,絕大多數網絡都組織成一堆相互疊加的層。每一層都建立在下一層的基礎之上,且每一層的目的都是向上一層提供特定的服務,但是把如何實現這些服務的細節對上一層加以屏蔽。用戶接觸到的是網絡體系的應用層,屬於最上層;網絡體系層級越低,越接近硬件。

常見的網絡體系結構分層模型有兩種:OSI模型和TCP/IP模型。OSI模型將網絡層分爲七層:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。TCP/IP模型將網絡層分爲四層:主機至網絡層、互聯網層、傳輸層和應用層。OSI模型對於討論計算機網絡非常有用,但是沒有流行;TCP/IP模型沒有被納入國際標準,但是協議被廣泛地使用。爲了更清晰地解釋網絡體系結構,本文采用如圖所示的五層模型。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)分層模型 1.2.png

 

1.3 每層協議的功能

網絡體系結構的每一層都是爲了實現一種功能。爲了實現這些功能,需要大家遵守共同的規則,因此每一層都定義了很多協議。這些協議的總稱叫做“互聯網協議(Internet Protocol Suite)”。

1.3.1 物理層

物理層就是把電腦連接起來的物理手段。它定義了物理設備的標準,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。

它的主要作用是傳輸比特流(就是將1、0轉化爲電流強弱來進行傳輸,到達目的地後再將電流強弱轉化爲1、0,也就是數模轉換與模數轉換),這一層的數據叫做比特。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)物理層 1.3.1.png

1.3.2數據鏈路層

☛ 1.3.2.1 設計數據鏈路層的原因

在原始的物理線路上傳輸數據信號是有差錯的,數據鏈路層採取差錯檢測、差錯控制與流量控制等方法,將有差錯的物理線路改進成邏輯上無差錯的數據鏈路,向網絡層提供高質量的服務。

☛ 1.3.2.2 數據鏈路層的基本功能

數據鏈路層位於物理層上方,它定義瞭如何讓格式化數據以幀(Frame)爲單位進行傳輸,以及如何控制對物理介質的訪問。數據鏈路層還提供了錯誤檢測和糾正措施,以確保數據的可靠傳輸。

在數據鏈路層,通過以幀爲單位進行數據傳輸、以獲取網卡MAC地址作爲對物理介質的訪問控制、以廣播作爲數據的發送方式,多臺計算機之間可以相互傳送數據。

☛ 1.3.2.3 以太網協議

以太網是目前最流行的一種局域網組網技術,它規定了在以太網中傳輸的數據幀結構。

以太網協議將一組電信號構成的一個數據包叫做“幀”,幀分爲兩個部分:標頭(Head)和數據(Data)。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)以太網協議 1.3.2.3.png

標頭(Head):數據包的說明項,比如發送者、接受者、數據類型等,固定爲18字節;

數據(Data):數據包的具體內容,最短爲46字節,最長爲1500字節。

因此,整個幀最短爲64字節,最長爲1518字節。如果數據很長,就必須分割成多個幀進行發送。

☛ 1.3.2.4 MAC地址

介質訪問控制(Medium Access Control)簡稱MAC,它是解決當局域網中共用信道的使用產生競爭時,如何分配信道的使用權問題。

MAC(Medium Access Control)地址,也稱爲物理地址、硬件地址,用來定義網絡設備的位置。一個主機有一個MAC地址,MAC地址是網卡決定的,是固定的。

以太網規定,連入網絡的所有設備,都必須具有“網卡”接口。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,也就是MAC地址。

每塊網卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進制位,通常用12個十六進制數表示。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)MAC地址 1.3.2.4.png

前6個十六進制數是廠商編號,後6個是該廠商的網卡流水號。有了MAC地址,就可以定位網卡和數據包的路徑了。

☛ 1.3.2.5 廣播

以太網規定數據包必須從一塊網卡傳送到另一塊網卡,但是一塊網卡無法直接獲取另一塊網卡的MAC地址。在網絡層中會介紹一種ARP協議(Address Resolution Protocol,地址解析協議),如果兩臺主機位於同一個子網絡(由活性節點組成的局部網絡),通過對方的IP(Internet Protocol,網絡之間互連的協議)可以獲得對方的MAC地址。

雖然獲得了對方的MAC地址,系統並不是把數據包準確地發送給接收方。其中一種實現數據包發送到接收方的方式就是廣播,就是以廣播的方式向本網絡內所有計算機發送,讓每臺計算機自己判斷,是否爲接收方。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)廣播 1.3.2.5.png

上圖中,1號計算機向2號計算機發送一個數據包,同一個子網絡的3號、4號、5號計算機都會收到這個包。它們讀取這個包的“標頭”,找到接收方的MAC地址,然後與自身的MAC地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫作“廣播(broadcasting)”。

有了數據包的定義、網卡的MAC地址、廣播的發送方式,數據鏈路層就可以在多臺計算機之間傳送數據了。

1.3.3 網絡層

網絡層的目的是兩個端系統之間的數據實現透明傳送。具體功能包括尋址、路由選擇、建立連接、保持連接和終止連接等。這使得位於不同地理位置網絡中的兩個主機系統之間提供連接和路徑選擇,世界各站點訪問信息的用戶數大大增加。

☛ 1.3.3.1 網絡層的由來

當兩臺主機位於同一個子網絡,可以通過廣播的方式把數據包發送給本網絡內所有的計算機,讓每臺計算機自己判斷是否爲接收方。但是當兩個主機不在一個子網絡,例如一個在北京,一個在紐約,這樣發送信息的方式就不合理了。

網絡層引進了一套地址,用來判斷不同的計算機是否屬於同一個子網絡,這套地址叫作網絡地址,也就是網址。屬於同一個子網絡的採用廣播方式發送數據包,否則就採用路由方式發送數據包。

因此每臺計算機有了兩種地址:MAC地址和網絡地址。這兩種地址之間沒有任何聯繫,MAC地址是綁定在網卡上的,網絡地址則是管理員分配的,它們只是隨機組合在一起。網絡地址幫助我們確定計算機所在的子網絡,MAC地址則是將數據包送到該子網絡中的目標網卡。因此,必定是先處理網絡地址,然後再處理MAC地址。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)網絡層的由來 1.3.3.1.png

☛ 1.3.3.2 IP協議

IP協議就是規定網絡地址的協議。它所定義的地址,就叫作IP地址。

目前的IP版本有IPv4和IPv6兩種,最流行的版本是Ipv4。Ipv4有十進制和二進制兩種表示方法,用點分爲四組,每一組的範圍是0~255。如圖所示,IP地址的兩種表示方法爲:

十進制表示爲:172.16.254.1;

二進制表示爲:10101100.00010000.11111110.00000001。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)IP協議 1.3.3.2.png

互聯網上的每一臺計算機都會擁有一個IP地址。IP地址分爲兩個部分,前一部分代表網絡,後一部分代表主機。但是從一個IP地址無法判斷哪一段代表網絡,哪一段代表主機。當兩臺聯網的計算機的IP地址的網絡部分完全相同,說明兩臺計算機位於同一個子網絡。但是要從兩臺計算機的IP地址判斷兩臺計算機是否屬於同一個子網絡,需要用到一個表示子網絡特徵的參數——“子網掩碼(subnet mask)”。子網掩碼在形式上等同於IP地址,例如IPv4版本的子網掩碼也是一個32位二進制數字,一般子網掩碼地址都是255.255.255.0。

根據子網掩碼可以判斷任意兩個IP地址是否處於同一個子網絡。先將兩個IP地址分別和子網掩碼(255.255.255.0)換算爲二進制形式;然後將兩個IP地址分別與子網掩碼進行按位與運算;最後比較結果是否相同,相同表明兩個IP地址在同一個子網絡,否則不在一個子網絡。

例如IP地址分別爲172.16.254.1和172.16.254.233,它們分別與子網掩碼255.255.255.0按位與的運算結果都是172.16.254.0,這說明這兩個IP地址在同一個子網絡。

總得來說,IP協議一個作用是爲每一臺計算機分配IP地址,另一個作用是確定哪些IP地址位於同一個子網絡。

☛ 1.3.3.3 IP數據包

根據IP協議發送的數據叫作IP數據包,其中數據包包括IP地址信息。

在數據鏈路層中,以太網協議將一組電信號構成的一個數據包叫做“幀”,幀包含MAC地址,但沒有IP地址。在網絡層,不需要修改以太網的規格,直接將IP數據包放進以太網數據包的Data部分。

IP數據包分爲“標頭”和“數據”兩個部分。標頭Head包括版本、長度、IP地址等信息,數據Data則是IP數據包的具體內容。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)IP數據包 1.3.3.3.png

☛ 1.3.3.4 ARP協議

因爲IP數據包是放在以太網數據包裏發送的,所以在發送數據包時必須同時知道接收方的MAC地址和IP地址。一般接收方的IP地址已知,但是MAC地址無法直接獲取。

在數據鏈路層中提到過,一塊網卡無法直接獲取另一塊網卡的MAC地址,如果兩臺主機位於同一個子網絡,需要根據ARP協議(Address Resolution Protocol,地址解析協議),通過對方的IP獲得對方的MAC地址。ARP協議就是向子網絡的每一臺主機發送數據包,從中取出IP地址,並與自身的IP地址進行比較。如果兩者相同,都做出回覆,向對方報告自己的MAC地址,否則就丟棄這個包。

如果兩臺主機不在同一個子網絡,要在網絡層上實現網絡互連,就需要網絡互聯設備——網關(Gateway)。它又稱網間連接器、協議轉換器,其本質上是一個網絡通向其他網絡的IP地址。假如兩臺主機分別在不同的子網絡A和B,網絡A中的某一主機將數據包傳送到網絡B中的某一主機,需要經過以下步驟:首先網絡A中的主機將數據包傳送到網絡A所在的網關;然後網絡A所在的網關將數據包轉發給網絡B所在的網關,最後網絡B所在的網關將數據包轉發給網絡B的那臺主機。

總的來說,有了ARP協議和網關,一臺主機可以把數據包發送到任意一臺主機。

1.3.4 傳輸層

☛ 1.3.4.1 傳輸層的由來

有了MAC地址和IP地址就可以在互聯網上的任意兩臺主機上建立通信。但是從互聯網上發送過來的數據包到底供給哪個程序(進程)使用,需要用到傳輸層。

傳輸層(Transport Layer)是最重要,最關鍵的一層,唯一負責總體的數據傳輸和數據控制,實現了端到端的數據傳輸。傳輸層在終端用戶之間提供透明的數據傳輸,向上層提供可靠的數據傳輸服務。傳輸層在給定的鏈路上通過流量控、分段/重組和差錯控制,保持對分段的跟蹤,並且重傳那些失敗的分段。

在傳輸層中,端口(port)表示一個數據包到底供哪個程序(進程)使用,它是每一個使用網卡的程序編號,每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。

網絡層建立了主機到主機的通信,而傳輸層建立了端口到端口的通信。只要確定主機和端口,就能實現程序之間的交流。因此,Unix系統把主機+端口,叫作“套接字(socket)”。有了它,就可以進行網絡應用程序開發。

☛ 1.3.4.2 UDP協議

UDP(User Datagram Protocol,用戶數據報協議)是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地抓取來自應用程序的數據,並儘可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。

由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的鏈接狀態表。

UDP協議數據包由“標頭”和“數據”兩部分組成。“標頭”定義了發出端口和接收端口,“數據”就是具體的內容。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)UDP協議 1.3.4.2_a.png

UDP數據包是IP數據包中“數據”的一部分,而IP數據包又是以太網數據包中的一部分,所以整個以太網數據包如下圖所示:

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)UDP協議 1.3.4.2_b.png

UDP協議比較簡單,容易實現,但是可靠性較差,一旦數據包發出,無法知道對方是否收到。因此對於傳輸可靠性要求不高、數據量小的數據,如QQ聊天的數據,就是通過這種方式傳輸的。

☛ 1.3.4.3 TCP協議

TCP(Transmission Control Protocol,傳輸控制協議)是面向連接的協議,也就是在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來:

第一次對話,客戶端通過向服務器發送一個含有同步序列號的標誌位(SYN)的數據段給服務器,向服務器請求建立連接,通過這個數據段,客戶端告訴服務器兩件事:我想要和你通信;你可以用哪個序列號作爲起始數據段來回應我。

第二次對話,服務器收到客戶端的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的數據段響應客戶端,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸數據了;你要用哪個序列號作爲起始數據段來回應我。

第三次對話,客戶端再發出一個數據包確認服務器的要求同步。客戶端收到這個數據段後,再發送一個確認應答(ACK),確認已收到服務器的數據段:“我已收到回覆,我現在要開始傳輸實際數據了。”這樣3次握手就完成了,客戶端和服務器就可以傳輸數據了。

三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之後,客戶端才向服務器正式發送數據。這個協議雖然傳輸效率低,但它可靠性強,主要用於傳輸可靠性要求高、數據量大的數據。

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)TCP協議 1.3.4.3.png

1.3.5 應用層

應用層是最靠近用戶的網絡層,它對“傳輸層”傳上來的數據進行解讀。由於數據來源五花八門,必須事先規定好格式,否則無法解讀。例如,TCP協議可以爲各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那麼,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了“應用層”。

應用層是網絡層最高的一層,直接面對用戶。它的數據就放在TCP數據包的Data部分。因此,以太網的數據包如下圖所示:

區塊鏈技術教程 區塊鏈技術語言(三十一) Go語言網絡編程(上)應用層 1.3.5.png

 

參考資料

[1] http://www.baike.com/wiki/TCP%0D%0A

[2] https://www.cnblogs.com/annieyu/p/3918323.html

 

-END-

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章