簡單理解Socket

2021-07-12 05:40:51 字數 3806 閱讀 6891

tcp/ip:

要想理解socket首先得熟悉一下tcp/ip協議族, tcp/ip(transmission control protocol/internet protocol)即傳輸控制協議/網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,

從字面意思來看tcp/ip是tcp和ip協議的合稱,但實際上tcp/ip協議是指網際網路整個tcp/ip協議族。不同於iso模型的七個分層,tcp/ip協議參考模型把所有的tcp/ip系列協議歸類到四個抽象層中

應用層:tftp,http,snmp,ftp,smtp,dns,telnet 等等

傳輸層:tcp,udp

網路層:ip,icmp,ospf,eigrp,igmp

資料鏈路層:slip,cslip,ppp,mtu

每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的:

在tcp/ip協議中兩個網際網路主機通過兩個路由器和對應的層連線。各主機上的應用通過一些資料通道相互執行讀取操作。

我們知道兩個程序如果需要進行通訊最基本的乙個前提能能夠唯一的標示乙個程序,在本地程序通訊中我們可以使用pid來唯一標示乙個程序,但pid只在本地唯一,網路中的兩個程序pid衝突機率很大,這時候我們需要另闢它徑了,我們知道ip層的ip位址可以唯一標示主機,而tcp層協議和埠號可以唯一標示主機的乙個程序,這樣我們可以利用ip位址+協議+埠號唯一標示網路中的乙個程序。

能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了,什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的乙個抽象層,它把tcp/ip層複雜的操作抽象為幾個簡單的介面**用層呼叫已實現程序在網路中通訊。

socket起源於unix,在unix一切皆檔案哲學的思想下,socket是一種」開啟—讀/寫—關閉」模式的實現,伺服器和客戶端各自維護乙個」檔案」,在建立連線開啟後,可以向自己檔案寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉檔案。

socket通訊流程

socket是」開啟—讀/寫—關閉」模式的實現,以使用tcp協議通訊的socket為例,其互動流程大概是這樣子的:

三次握手:

在tcp/ip協議中,tcp協議通過三次握手建立乙個可靠的連線。

伺服器socket與客戶端socket建立連線的部分其實就是大名鼎鼎的三次握手。

下面是乙個用php實現的socket通訊:

<?php 

/*伺服器端***/

//確保在連線客戶端時不會超時

set_time_limit(0);

$ip = '127.0.0.1';

$port = 1935;/**

+-------------------------

*socket通訊過程

*+-------------------------

*/if(($socket = socket_create(af_inet, sock_stream, sol_tcp)) < 0)

if(($ret = socket_bind($socket, $ip, $port)) < 0)

if(($ret = socket_listen($socket, 4)) < 0)

echo

"binding the socket on $ip:$port ... \n";

$count = 0;

do else \n";

echo

$talkback;

//傳送到客戶端

$msg = $buf." 你好!\n";

socket_write($msgsock, $msg, strlen($msg));

if(++$count >= 5)

socket_close($msgsock);

} while (true);

socket_close($socket);

使用php server1.php開啟服務端監聽:

現在什麼都沒有。

下面啟用客戶端socket:

客戶端**:

<?php 

set_time_limit(0);

echo

"+--------tcp/ip connection--------+\n\n";

$ip = '127.0.0.1';

$port = 1935;

$socket = socket_create(af_inet, sock_stream, sol_tcp);

if($socket

< 0) else

echo

"試圖連線『『埠『』......\n";

$result = socket_connect($socket, $ip, $port);

if($result

< 0) else

$in = "張三: ";

//$in .= "first blood \r\n";

$out = '';

if(!socket_write($socket, $in, strlen($in))) else **\n";

}while($out = socket_read($socket, 8192))

echo

"\n關閉socket...\n";

socket_close($socket);

echo

"關閉成功\n";

通過php client1.php啟用客戶端socket,啟用後效果如下圖:

[客戶端效果圖]

[服務端效果圖]

乙個用php實現的簡單socket就完成了。

簡單理解Socket

鏈結 要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準 從字面意思來看tcp ip是tcp和ip協議的...

簡單理解Socket

要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,...

簡單理解Socket

要想理解socket首先得熟悉一下tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,...