Socket原理探索

2021-08-28 01:32:50 字數 1740 閱讀 4189

在使用tcp/ip協議族進行網路通訊的過程中,網路層的ip位址可以唯一標識一台網路主機,而傳輸層的協議+埠可以唯一標識主機中的應用程式程序,利用這樣的三元組合(ip位址,協議,埠)就可以在網路中唯一標識網路中的程序,從而為程序在網路中的通訊建立了基石。

socket是在應用層和傳輸層之間的乙個抽象層,它把tcp/ip層複雜的操作抽象為幾個簡單的介面**用層呼叫已實現程序在網路中通訊。socket在通訊模型中的角色與位置如下圖:

建立socket通訊需要用到五大元素(協議,源ip,源埠,目的ip,目的埠),只要保證這樣的五元組合唯一便能建立socket通訊連線。

其通訊建立的過程大致為:1)服務端初始化socket,與埠(例如8080)繫結(bind),埠監聽(listen),呼叫accept等待客戶端連線。2)客戶端初始化socket,客戶端隨機分配乙個埠(例如6688)發起對服務端監聽埠(8080)的連線(connect),服務端ip層收到請求之後,根據具體協議型別交由傳輸層協議棧處理,傳輸層再交由socket層處理,socket層以監聽埠(8080)作為服務端埠建立與客戶端的連線,建立新的socket例項(該例項包含客戶端ip,客戶端埠6688,服務端埠8080,服務端ip)用於標識此次連線的服務端控制代碼,並將其放進連線佇列(連線佇列的大小是由服務端listen之時指定的,一旦連線數達到限制,將會拒絕或者延遲新的連線請求)。

連線建立之後,兩端可以通過各自的終端控制代碼socket例項(因為其包含有socket通訊的五元組合)進行資料傳輸(客戶端仍然向服務端的8080埠傳送資料),目的端主機的傳輸層接收到資料之後,仍然交由socket層處理,socket層根據源/宿對準確的分辨出資料報與socket例項的歸屬關係。通訊圖示如下:

這三次握手詳細流程大致為:

客戶端socket物件connect呼叫之後進行阻塞,此過程傳送了乙個syn(同步序列編號synchronize sequence numbers)。

服務端監聽到連線請求,如果請求被允許,便向客戶端傳送對收到的syn的確認包ack,同時自己也會傳送乙個syn。此時accept仍然處於阻塞狀態。

客戶端收到syn+ack之後,connect返回,並向服務端傳送ack確認包,服務端收到之後,accept返回,連線建立成功。

這四次握手詳細流程大致為:

某端首先呼叫close主動關閉連線,這時tcp向另一端傳送乙個fin m包。

另一端的read返回0表面收到了fin段,就知道另一端關閉了連線,那麼首先傳送乙個對fin的確認包ack

傳送確認包之後,也呼叫close關閉連線,從而導致它的tcp也會傳送乙個fin n包。

接收到這個fin的源端tcp最後發出確認包ack,完成四次握手。

注意:任何一方呼叫close()後,連線的兩個傳輸方向都關閉,不能再傳送資料了。如果一方呼叫shutdown()則連線處於半關閉狀態,仍可接收對方發來的資料。

socket程式設計原理

if newsock accept mysock.daemonsock,addr,len 1 return 1 accept error.set this socket as a non blocking socket.ioctl newsock,fionbio,flag fd set newsoc...

Socket工作原理

socket可以看成在兩個程式進行通訊連線中的乙個端點,是連線應用程式和網路驅動程式的橋梁,socket在應用程式中建立,通過繫結與網路驅動建立關係。此後,應用程式送給socket的資料,由socket交網路驅動程式向網路上傳送出去。計算機從網路上收到與該socket繫結ip位址和埠號相關的資料後,...

SOCKET 通訊原理

源 基於tcp ip協議的網路程式設計 定義變數 獲得winsock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放所有資源 整個程式架構分為兩大部分,伺服器端客戶端。伺服器socket程式流程 socket bind listen acce...