在分析非HTTP协议网络时,在服务端一般使用tcpdump,客户端是wireshark(有一本书《wireshark网络分析就是这么简单》),利用空闲时间学习一下如何使用。
为了结合实践,这里用了swoole_server的一个简单的echo服务器。
<?php
$serv = new swoole_server("0.0.0.0", 9501);
$port = $serv->listen('127.0.0.1', 9501, SWOOLE_SOCK_UDP);
$port->on('packet', function($serv, $data, $addr){
var_dump($serv, $data, $addr);
});
$serv->on('connect', function ($serv, $fd, $from_id){
echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Connect.\n";
});
$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) {
echo "[#".$serv->worker_id."]\tClient[$fd]: $data\n";
if ($serv->send($fd, "hello\n") == false)
{
echo "error\n";
}
});
$serv->on('close', function ($serv, $fd, $from_id) {
echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Close.\n";
});
$serv->start();
客户端使用telnet
$ telnet 127.0.0.1 9501
实验开始
(由于在命令行下操作,所以需要启动多个窗口)
窗口1:
$ php echo.php # 开启服务
窗口2:
$ sudo tcpdump -i any tcp port 9501 # 开启tcpdump
窗口3:
$ telnet 127.0.0.1 9501 # 客户端连接
观察窗口2:
首先,tcpdump需要在root用户下运行,
-i 参数制定了网卡,any表示所有网卡,监听tcp协议,端口为9501
可以发现,倒数三行是一个完整的TCP三次握手,
客户端发送SYN[S]
服务端回答SYN,ACK[S.]
客户端发送ACK[.]
列参数含义
发送数据
客户端 》服务端
服务端 》客户端
关闭连接(客户端主动关闭,四次挥手)
关闭连接(服务端退出,三次挥手)