1. 程式人生 > >區塊鏈技術基礎語言(三十一):Go語言網路程式設計(上)

區塊鏈技術基礎語言(三十一):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-