php socket 初解

TCP鏈接:
TCP是主機(jī)對(duì)主機(jī)層的傳輸控制協(xié)議,提供可靠的連接服務(wù),采用三次握確認(rèn)建立一個(gè)連接。位碼即tcp標(biāo)志位,有6種 標(biāo)示:SYN(synchronous建立聯(lián)機(jī)) ACK(acknowledgement 確認(rèn)) PSH(push傳送) FIN(finish結(jié)束) RST(reset重置) URG(urgent緊急)Sequence number(順序號(hào)碼) Acknowledge number(確認(rèn)號(hào)碼)

建立TCP鏈接需要三次握手:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。握手完成后,兩臺(tái)主機(jī)開始傳輸數(shù)據(jù)了。

實(shí)例理解:
1.pc:seq=0 ack=0 syn=1 ack=0 發(fā)送給服務(wù)器建立同步請(qǐng)求。
2.server: seq=0 ack=1 syn=1 ack=1 發(fā)送給客戶端建立同步響應(yīng).
3.pc:seq=1 ack=1 syn=0 ack=1 發(fā)送給服務(wù)器,三次握手完成建立同步信息成功.
4.pc產(chǎn)生http數(shù)據(jù)消息,向服務(wù)器發(fā)送get請(qǐng)求.
5.服務(wù)器收到請(qǐng)求并發(fā)送TCP確認(rèn),然后發(fā)送http數(shù)據(jù)信息給客戶端的瀏覽器.
6.客戶端收到服務(wù)器的http信息,然后發(fā)送TCP確認(rèn)信息給服務(wù)器.
7.客戶端發(fā)送FIN+ACK給服務(wù)器,要求結(jié)束數(shù)據(jù)傳輸.
8.服務(wù)器發(fā)送TCP確認(rèn)消息用于確認(rèn)pc的TCP的FIN消息
9.服務(wù)器向客戶端發(fā)送FIN+ACK消息用于結(jié)束TCP會(huì)話.
10.客戶端發(fā)送確認(rèn)信息給服務(wù)器,整個(gè)會(huì)話結(jié)束.

示列:php創(chuàng)建TCP鏈接

server 服務(wù)端:
$host = ''; $port='';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket, 5);
while(true){
? ? $client = socket_accept($socket);
? ? $buf = socket_read($client, 2024);
? ? echo $buf;
}
socket_close($socket);

client 客戶端:
$host = ''; $port='';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port );
socket_write($socket, "hello? socket");
socket_close($socket);

以上就是TCP通信的基本模型。

基于socket創(chuàng)建http服務(wù):

$host='';? $port='';
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket, 5);
while(true){
? ? $client = socket_accept($socket);
? ? $buf = socket_read($client, 2024);
? ? if(preg_match('/GET\s\/(.*)\sHTTP\/1.1/i', $buf, $mathes)){
? ?????? $page_path = $matches[1];?
? ? ? ? ?if(file_exists($page_path)){
?????????????$html_content = 'HTTP/1.1 200 OK'.PHP_EOL
????????????????.'Content-Type: text/html;'.PHP_EOL
????????????????.PHP_EOL
????????????????.file_get_contents($page_path);
????????????????socket_write($client,$html_content);
????????}
}
socket_close($socket);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容