激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 詳解PHP Swoole與TCP三次握手

詳解PHP Swoole與TCP三次握手

2021-11-16 16:03八重櫻 PHP教程

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接(連接導(dǎo)向)的、可靠的、 基于IP的傳輸層協(xié)議。TCP在IP報文的協(xié)議號是6。TCP是一個超級麻煩的協(xié)議,而它又是互聯(lián)網(wǎng)的基礎(chǔ),也是每個程序員必備的基本功。本文將詳細介紹

握手常見問題

1、連接拒絕

2、Operation now in progress 多是因為丟包、錯誤ip、backlog滿了&阻塞&tcp_abort_on_overflow=0

3、min(maxconn, backlog) ss -lt

連接拒絕

在TCP三次握手的時候,客戶端發(fā)送SYN這個包給服務(wù)端,服務(wù)端不接受這個請求,操作系統(tǒng)直接返回了一個RST的包,來拒絕連接的請求。

最常見的情況就是客戶端去請求某個服務(wù)器,服務(wù)端沒有綁定對應(yīng)的端口。

測試代碼如下,服務(wù)端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
?
$server = new \Swoole\Server('127.0.0.1', 9501);
?
$server->set([
    'work_num' => 2,
    'backlog' => 128,
]);
?
$server->on('connect', function ($server, $fd)
{
    echo "Client: Connect.\n";
});
?
$server->on('receive', function ($server, $fd, $reactor_id, $data)
{
    var_dump($data);
});
?
$server->on('close', function ()
{
    var_dump('close');
});
?
$server->start();

這里,服務(wù)端綁定的端口是9501。

啟動服務(wù)器:

?
1
1 ~/codeDir/phpCode/hyperf-skeleton # php server.php

客戶端代碼:

?
1
2
3
4
<?php
?
$client = new \Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
var_dump($client->connect('127.0.0.1', 9500));

這里,客戶端請求的端口是9500。

啟動客戶端:

?
1
2
3
4
5
~/codeDir/phpCode/hyperf-skeleton # php client.php
?
Warning: Swoole\Client::connect(): connect to server[127.0.0.1:9500] failed, Error: Connection refused[111] in /root/codeDir/phpCode/hyperf-skeleton/client.php on line 4
bool(false)
~/codeDir/phpCode/hyperf-skeleton #

報錯:

Error: Connection refused[111]

Operation now in progress

這個錯誤的絕大部分原因是因為連接超時了。

丟包

例如路由器、網(wǎng)關(guān)出現(xiàn)了故障,包被丟了。

錯誤ip

例如客戶端請求了一個錯誤的ip,那么路由器自然也就路由不到。

測試代碼如下,客戶端代碼:

?
1
2
3
4
<?php
?
$client = new \Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
var_dump($client->connect('8.8.8.8', 9501));

這里,我訪問的是谷歌的DNS服務(wù)器。因為我沒有FQ,所以是訪問不了這個IP的。因此,我們發(fā)送的包是到達不了8.8.8.8服務(wù)器的。

啟動客戶端:

?
1
2
3
4
5
~/codeDir/phpCode/hyperf-skeleton # php client.php
?
Warning: Swoole\Client::connect(): connect to server[8.8.8.8:9501] failed, Error: Operation in progress[115] in /root/codeDir/phpCode/hyperf-skeleton/client.php on line 4
bool(false)
~/codeDir/phpCode/hyperf-skeleton #

報錯:

Error: Operation in progress[115]

backlog

服務(wù)器在三次握手的最后一次,即收到客戶端發(fā)來的ACK包的時候,會把建立好的連接放到backlog隊列里面。如果Swoole一直不accept連接,那么這個backlog隊列很快就會滿。backlog隊列滿了之后,服務(wù)端就會丟棄三次握手的SYN包,讓客戶端重新去連接服務(wù)端。

測試代碼如下,服務(wù)端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
?
$server = new \Swoole\Server('127.0.0.1', 9501, SWOOLE_BASE);
?
$server->set([
    'work_num' => 2,
    'backlog' => 128,
]);
?
$server->on('connect', function ($server, $fd)
{
    echo "Client: Connect.\n";
    sleep(1000);
});
?
$server->on('receive', function ($server, $fd, $reactor_id, $data)
{
    var_dump($data);
});
?
$server->on('close', function ()
{
    var_dump('close');
});
?
$server->start();

要想測試backlog問題必須在Swoole的SWOOLE_BASE模式下,默認的SWOOLE_PROCESS模式是沒有這個問題的。

這里,我們的backlog大小是128。

然后,我們通過sleep(1000);來阻塞住進程,使得Swoole不會繼續(xù)accept連接,從而導(dǎo)致backlog隊列在某個時刻變滿。

客戶端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
<?php
?
$i = 0;
while (true)
{
    $client = new \Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
    if ($client->connect('127.0.0.1', 9501) == false)
    {
        break;
    }
}

我們啟動服務(wù)器:

?
1
~/codeDir/phpCode/hyperf-skeleton # php server.php

然后啟動客戶端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
~/codeDir/phpCode/hyperf-skeleton # php client.php
省略了其他的輸出
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
?
Warning: Swoole\Client::connect(): connect to server[127.0.0.1:9501] failed, Error: Operation in progress[115] in /root/codeDir/phpCode/hyperf-skeleton/client.php on line 7
bool(false)
?
Warning: Swoole\Client::connect(): connect to server[127.0.0.1:9501] failed, Error: Operation in progress[115] in /root/codeDir/phpCode/hyperf-skeleton/client.php on line 7
bool(false)
^C
~/codeDir/phpCode/hyperf-skeleton #

我們會發(fā)現(xiàn),過一段時間,客戶端這邊會報錯:

Error: Operation in progress[115]

服務(wù)端這邊輸出:

~/codeDir/phpCode/hyperf-skeleton # php server.php 

Client: Connect.

因為當Swoole服務(wù)器從backlog隊列里面accept一個連接的時候,才會觸發(fā)onReceive回調(diào)函數(shù)。所以,當服務(wù)端accept一個連接之后,Swoole自己就會陷入阻塞,不會再accept了。但是需要注意的是,盡管Swoole服務(wù)器自身是阻塞的,操作系統(tǒng)還會繼續(xù)去把建立好的連接放入backlog隊列里面。所以,backlog隊列會滿。

SYN Flood

除了三次握手成功之后會使用到的backlog隊列,還有一個SYN隊列。也就是在三次握手時候,客戶端給服務(wù)端發(fā)送了SYN包,服務(wù)端會有一個SYN隊列來維護。

與其有關(guān)的內(nèi)核配置:

?
1
2
3
tcp_max_syn_backlog
tcp_synack_retries
tcp_syncookies

其中,tcp_max_syn_backlog就是這個SYN隊列的長度。如果大量的SYN包把SYN隊列塞滿了,那么其他正常的連接過來,服務(wù)端就無法處理。

SYN Flood攻擊就是客戶端瘋狂的給服務(wù)端發(fā)送SYN包,然后服務(wù)端每次都會把請求放到SYN隊列里面。但是,客戶端不給服務(wù)端回ACK包。如果客戶端不回ACK包,那么服務(wù)端就會給客戶端回SYN + ACK包,即第二次握手發(fā)送的包。而回復(fù)SYN + ACK包的次數(shù)就是由tcp_synack_retries參數(shù)決定的。如果把tcp_synack_retries設(shè)置為0,那么如果服務(wù)端沒有收到ACK包,那么服務(wù)端就不會重試發(fā)送SYN + ACK包了,這樣就減少了SYN隊列里面那個請求的存活時間。

tcp_syncookies的原理就是,客戶端發(fā)送SYN包的時候,不會維護SYN隊列,而是返回一個cookie給客戶端。然后客戶端發(fā)送第三次握手的時候,攜帶這個cookie值,只有這個cookie驗證通過,服務(wù)端才會給連接分配資源。

以上就是詳解PHP Swoole與TCP三次握手的詳細內(nèi)容,更多關(guān)于PHP Swoole與TCP三次握手的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/a609251438/p/11772411.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 加勒比色综合 | 亚洲导航深夜福利涩涩屋 | 91情侣在线偷精品国产 | 一本色道久久久888 国产一国产精品一级毛片 国产精品高潮视频 | 久久av喷吹av高潮av懂色 | 日韩黄色在线播放 | 羞羞网站视频 | 91久久极品少妇韩国 | 国产精品片一区二区三区 | 在线播放亚洲视频 | 正在播放91精 | 99在线在线视频免费视频观看 | 国产精品剧情一区二区三区 | 网站一区 | 人人舔人人舔 | 国产精品美女一区二区 | 青青操精品 | 久久亚洲春色中文字幕久久 | 一区二区三区四区免费 | 国产一级在线看 | 成年人国产视频 | 久久综合爱 | 在线中文字幕网站 | 暴力强行进如hdxxx | 欧美色大成网站www永久男同 | 最新一级毛片 | 伊人99re | 男女羞羞视频在线免费观看 | 一区二区三区黄色 | 成人性视频欧美一区二区三区 | 黄色7777| 在线a亚洲视频播放在线观看 | 亚洲一区播放 | 久草免费新视频 | 欧美性受xxxxxx黑人xyx性爽 | 国产精品久久久久久久久久大牛 | 国产精品爱久久久久久久 | a一级黄色大片 | 成人精品视频在线 | 欧美精品v国产精品v日韩精品 | 欧美日韩免费观看视频 |