Go語言Socket程式設計詳解

2020-07-16 10:05:20
大部分底層網路的程式設計都離不開 socket 程式設計,HTTP 程式設計、Web 開發、IM 通訊、視訊流傳輸的底層都是 socket 程式設計。

什麼是 Socket

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個 socket。

建立網路通訊連線至少要一對埠號(socket),socket 本質是程式設計介面(API),對 TCP/IP 的封裝,TCP/IP 也要提供可供程式設計師做網路開發所用的介面,這就是 Socket 程式設計介面。

可以將 HTTP 比作轎車,它提供了封裝或者顯示資料的具體形式;那麼 Socket 就是發動機,它提供了網路通訊的能力。

Socket 的英文意思是“孔”或“插座”,作為 BSD UNIX 的進程通訊機制,取後一種意思,通常也稱作“通訊端”,用於描述 IP 地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計算機之間的通訊。

每種服務都開啟一個 Socket,並繫結到一個埠上,不同的埠對應於不同的服務。Socket 正如其英文意思那樣,像一個多孔插座。插座是用來給插頭提供一個介面讓其通電的,此時我們就可以將插座當做一個伺服器端,不同的插頭當做用戶端。

常用的 Socket 型別有兩種,分別是流式 Socket(SOCK_STREAM)和資料包式 Socket(SOCK_DGRAM):
  • 流式是一種面向連線的 Socket,針對於面向連線的 TCP 服務應用;
  • 資料包式 Socket 是一種無連線的 Socket,對應於無連線的 UDP 服務應用。

Socket 如何通訊

網路中的進程之間如何通過 Socket 通訊呢?首要解決的問題是如何唯一標識一個進程,否則通訊無從談起!在本地可以通過進程 PID 來唯一標識一個進程,但是在網路中這是行不通的。

其實 TCP/IP 協定族已經幫我們解決了這個問題,網路層的“ip 地址”可以唯一標識網路中的主機,而傳輸層的“協定+埠”可以唯一標識主機中的應用程式(進程)。這樣利用三元組(ip 地址,協定,埠)就可以標識網路的進程了,網路中需要互相通訊的進程,就可以利用這個標誌在他們之間進行互動。請看下面這個 TCP/IP 協定結構圖:

七層網絡協議圖
圖:七層網路協定圖