套接字
套接字指通訊雙方在通訊時所使用的通訊點(Endpoint),通訊的雙方經過通訊點來交換信息和數據。不一樣類型的通訊會使用不一樣的類型通訊點,好比對於電話通訊而言,通訊點就是電話號碼和分機號碼的組合,這時由於若是你想和朋友通話,就須要撥打你朋友的電話號碼和分機號碼。對於IP網絡通訊而言,通訊點就是套接字,即兩個進程在進行網絡通訊的時候,他們經過套接字來交換信息和數據。服務器
和電話通訊相似,當一個進程想和另外一個進程進行網絡通訊時,它必須知道另一個進程所在的目標機器IP地址,同時也必須有一種機制來標識目標機器上的進程,這種機制就是咱們前面章節提到的端口號,目標機器正是經過端口號才能肯定應該把接收到的數據發往哪個進程。也就是說套接字這種通訊點必須經過端口號標識和IP地址,另外因爲網絡通訊也有不一樣類型,同一個端口號在使用不一樣的傳輸層協議時含義是不同的,因此套接字還和傳輸層協議有關。網絡
一個套接字包含:併發
一個已鏈接的TCP套接字對應以下:spa
【本地IP,端口,目標機IP,端口】線程
服務器能夠分爲迭代服務器和併發服務器
迭代服務器工做方式以下(UDP):進程
- 等待客戶請求
- 當接受到客戶請求時,處理該請求並把結果返回該客戶
- 回到步驟1,繼續等待下一個客戶請求。
併發服務器的工做方式以下(TCP):服務器端
- 等待客戶請求
- 當接收到客戶請求,爲該客戶開啓一個新的服務器實例(進程、線程等),而且由這個新的服務器實例來處理該客戶的請求並把結果返回客戶,以後該新的服務器實例就終止。
- 回到步驟一,繼續等待下一個客戶請求
TCP客戶端與服務器交互過程
TCP服務器端鏈接套接字建立、關閉交互過程說明以下:List
- 服務器建立一個套接字。
- 服務器把本地套接字地址(本地IP地址和本地端口)綁定(Bing)到該套接字。客戶端將使用在這裏的綁定的套接字地址來鏈接到該服務器
- 服務器把該套接字置爲等待狀態,也叫(Listen)這時套接字也被稱爲監聽套接字。
- 服務器開始接受(Accept)客戶端的鏈接請求。若是這時沒有鏈接求,則服務器就等待請求的到來;若是有鏈接請求,則服務器爲該鏈接請求建立一個新的套接字,該新的套接字用來描述這個鏈接,既它對應於一個四元組:[本地IP地址,本地端口,遠程IP地址,遠程端口]。咱們把這個新的套接字被稱爲已鏈接套接字,以便於區分監聽套接字。
- 服務器使用已經鏈接的套接字來接受來自客戶端的數據,或者發送數據到客戶端。
- 當完成和客戶端的數據交互以後,服務器關閉套接字。
通常來講,當服務器建立了已鏈接套接字後,會生成一個新的服務器實例(線程或進程等)。而後這個新的實例執行5,、6步,即處理和客戶端的數據交互。請求
TCP客戶端
TCP客戶端鏈接套接字建立,關閉過程說明通信
- 客戶端建立一個套接字
- 客戶端把本地套接字地址(本地IP地址和本地端口)綁定到套接字。注意,這個步驟對於客戶端來講不是必須的。若是執行的話就按四元組中的地址分配,若是沒有執行則系統自動分配地址。
- 客戶端使用在步驟1中建立的套接字來鏈接(Connect)到一個遠程套接字的地址(遠程IP地址和遠程端口),即服務器的監聽套接字地址。在鏈接成功以後,這個鏈接將由客戶端套接字來描述,這個客戶端套接字也對應於一個四元組:[本地IP地址,本地端口,遠程IP地址,遠端端口]。此時,這個客戶端套接字也成爲一個鏈接套接字。
- 客戶端使用已鏈接套接字發送來發送數據到服務器,或者接受來自服務器的數據。
- 當完成和服務器的數據交互以後,客戶端關閉鏈接套接字。
這整個過程都只有一個套接字和一個客戶端實例