Socket 理解

myjob發表於2019-06-18

Socket到底是什麼?
對Socket通訊的一些簡單理解
Socket就是TCP/IP協議的程式設計模型,通過一系列API來訪問作業系統的網路協議棧,從而建立TCP連線,傳送或接收資料。

可以先看下OSI七層參考模型,同時對照著看下tcp/ip協議模型。然後瞭解下socket的由來,和tcp/ip協議族的關係。然後詳細學習下socket程式設計模型,包括伺服器端和客戶端的,模型其中用到的每個函式和引數都要弄明白是什麼意思,再結合具體的例子實驗一下。這樣對socket就有了初級的理解了,然後可以深入研究一些較高階問題了

傳統意義上是類似於檔案描述符的存在形式,是一種抽象的資源定位,即程式埠資源。

  • 一個程式啟動後,有pid檔案標識鎖定該執行的程式。
  • 一個檔案開啟後,在程式中有一個fd標識著它。
  • 一個程式佔用了一個埠,並建立相關協議的通訊,由socket標識著它。

所以socket是什麼,就是一個資源標識,是一個三元組(協議,埠號,IP地址)。基於socket的程式設計,指的是在該資源(三元組)的基礎上,封裝對資料的處理。就好比開啟一個檔案後,對檔案的程式設計,如函式f.Close()。

socket程式設計必備的函式如下:

  • Socket():建立一個socket。Bind():繫結地址,即該socket負責哪個資源。
  • Listen():開始監聽。Accept():接收請求。
  • Connect():建立連線
  • Recv()/Send():資料傳送和接收
  • 客戶端->建立socket->Connect()建立連線->Close()。
  • 服務端->建立socket->Bind()->Listen()->Accept()接收請求->Close()。
  • TCP的三次握手就是發生在【Connect】和【Accept】之間。資料處理交由Recv()/Send()

socket程式設計就是使用socket api進行網路程式設計。

socket就是一套用於網路通訊的api。

就像printf, scanf這一類api進行輸入輸出的程式設計;strlen,strcpy這一類用於字串處理。socket就是用於網路通訊。你把它理解成類似的東西就行。

socket的難點並不在於socket介面自身。而是網路通訊固有的複雜性。所以要理解socket程式設計,就要把socket介面與網路通訊本身結合起來。首先要會socket的套路:bind/accept,connect,send/recv等等。然後瞭解和實踐各種網路程式設計模型。