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);