1.協(xié)議分層
- 數(shù)據(jù)鏈路層(ARP洁闰、RARP)
- 網(wǎng)絡層(ICMP、IP)
- 傳輸層 (TCP皂吮、UDP)
- 應用層(PING、telnet税手、OSPF蜂筹、DNS)
2. tcp與udp介紹與區(qū)別
TCP(Transmission Control Protocol傳輸控制協(xié)議): 是一 種面向連接的、可靠的芦倒、基于字節(jié)流的傳輸層通信協(xié)議艺挪,使用三次握手協(xié)議建立連接、四次揮手斷開連接兵扬。面向連接意味著兩個使用TCP的應用(通常是一個
客戶端和一 個服務器)在彼此交換數(shù)據(jù)包之前必須先建立一一個TCP連接麻裳。在一一個TCP連接中,僅有兩方進行彼此通信周霉,廣播和多播不能用TCP掂器。TCP協(xié)議的作用是,保證數(shù)據(jù)通信的完整性和可靠性俱箱,防止丟包国瓮。TCP把
連接作為最基本的對象,每-條TCP連接都有兩個端點, 這種端點我們叫作套接字(socket),端口號拼接到IP地址即構(gòu)成了套接字。
UDP(User Datagram Protocol用戶數(shù)據(jù)報協(xié)議): 是OSI(Open System Interconnection開放式系統(tǒng)互聯(lián))參考模型中- -種無連接的傳輸層協(xié)議狞谱,提供面向事務的簡單不可靠信息傳送服務乃摹。UDP協(xié)議的主要作用是將網(wǎng)
絡數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。
區(qū)別:
- TCP提供的是面向連接的跟衅、可靠的數(shù)據(jù)流傳輸; UDP提供的是非面向連接的孵睬、不可靠的數(shù)據(jù)流傳輸。
- TCP提供可靠的服務伶跷,通過TCP連接傳送的數(shù)據(jù)掰读,無差錯秘狞、不丟失、不重復蹈集,按序到達; UDP盡最大努力交付烁试,即不保證可靠交付。
- TCP面向字節(jié)流; UDP面向報文拢肆。
- TCP連接只能是點到點的; UDP支持-對一减响、一對多 多對一和多對多的交互通信。
- UDP具有較好的實時性郭怪,工作效率比TCP高支示,適用于對高速傳輸和實時性有較高的通信或廣播通信。
- TCP對系統(tǒng)資源要求較多鄙才,UDP對系統(tǒng)資源要求較少颂鸿。TCP首部有20字節(jié); UDP的首部只有8個字節(jié)。
- TCP的邏輯通信信道是全雙工的可靠信道; UDP的邏輯通信信道是不可靠信道咒循。
TCP問題之粘包處理
出現(xiàn)的原因:
出現(xiàn)粘包現(xiàn)象的原因是多方面的据途,它既可能由發(fā)送方造成,也可能由接收方造成叙甸。發(fā)送方引起的粘包是由TCP協(xié)議本身造成的, TCP為提高傳輸效率,發(fā)送方往往要收集到足夠多的數(shù)據(jù)后才發(fā)送一包數(shù)據(jù)颖医。 若連續(xù)幾次發(fā)送的數(shù)據(jù)都很少,通常TCP會根據(jù)優(yōu)化算法把這些數(shù)據(jù)合成包后一次發(fā)送出去裆蒸,這樣接收方就收到了粘包數(shù)據(jù)熔萧。
接收方引起的粘包是由于接收方用戶進程不及時接收數(shù)據(jù),從而導致粘包現(xiàn)象僚祷。這是因為接收方先把收到的數(shù)據(jù)放在系統(tǒng)接收緩沖區(qū)佛致,用戶進程從該緩沖區(qū)取數(shù)據(jù),若下一包數(shù)據(jù)到達時前一包數(shù)據(jù)尚未被用戶進程取
走,則下一包數(shù)據(jù)放到系統(tǒng)接收緩沖區(qū)時就接到前一包數(shù)據(jù)之后辙谜,而用戶進程根據(jù)預先設定的緩沖區(qū)大小從系統(tǒng)接收緩沖區(qū)取數(shù)據(jù)俺榆,這樣就一次取到了多包數(shù)據(jù)。
解決方案:
- 特殊字符方式
<?php
// swoole_tcp_client
for ($i=0; $i < 100; $i++) {
$client->send("hello world\i");
}
// swoole_tcp_server
// 監(jiān)聽數(shù)據(jù)接收事件
$serv->on('Receive', function ($serv, $fd, $from_id, $data) {
// 接收客戶端的想你想
var_dump(explode('\i', $data));
// echo "接收到".$fd."信息的".$data."\n";
// echo "接收到".$fd."信息"."\n";
$serv->send($fd, "Server: ");
});
?>
- 統(tǒng)一粘包標準(固定包頭+包體協(xié)議)
<?php
// client 通過pack進行組包
for ($i=0; $i < 10; $i++) {
// 組包
// msg protocol
// | ---- dataLen ---- | data |
// | - fixed 2bytes - |
$context = "123";
$len = pack("n", strlen($context));
var_dump($len);
$send = $len . $context;
// var_dump($send);
$client->send($send);
}
// server
//監(jiān)聽數(shù)據(jù)接收事件
$serv->on('Receive', function ($serv, $fd, $from_id, $data){
var_dump($data);
$fooLen = unpack("n", substr($data, $count, 2))[1];
var_dump($fooLen);
$foo = substr($data, $count + 2, $fooLen);
var_dump($foo);
$serv->send($fd, "Server: ");
});
?>