tcpdump学习与实践

在分析非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[.]

列参数含义

  • 11:24:18.062098 时间带有精确到微妙
  • localhost.8816 > localhost.9501 表示通信的流向,8816是客户端,9501是服务器端
  • [S] 表示这是一个SYN请求
  • [.] 表示这是一个ACK确认包,(client)SYN->(server)SYN->(client)ACK 就是3次握手过程
  • [P] 表示这个是一个数据推送,可以是从服务器端向客户端推送,也可以从客户端向服务器端推
  • [F] 表示这是一个FIN包,是关闭连接操作,client/server都有可能发起
  • [R] 表示这是一个RST包,与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理。可以理解为是强制切断连接
  • win 342是指滑动窗口大小
  • length 12指数据包的大小

发送数据

客户端 》服务端

服务端 》客户端

关闭连接(客户端主动关闭,四次挥手)

关闭连接(服务端退出,三次挥手)

标签:Tcpdump 发布于:2019-11-10 07:19:47