首页 > 解决方案 > 使用 Ncat 模拟 TCP 客户端流量

问题描述

我正在尝试制作一个简单的脚本来模拟 TCP 客户端,该客户端定期启动与回显服务器的连接并生成一个随机字符串以发送到服务器,然后它应该将其发送回客户端。下面是我设置的简单 bash 脚本:

while :
do
        var="$(shuf -i 9-19 -n 1)" # generate a random number between 9-19
        rand="$(pwgen "$var" 1)" # generate a random string of size var
        echo "$rand" | nc localhost 1234 
        sleep 5
done

服务器本身只是在终端中运行的简单命令:

ncat -l 1234 -k --exec "/bin/cat"

我在 Wireshark 中注意到场景 1,TCP 3 方式的握手完成得很好,客户端发送的数据看起来很好,但是我从来没有看到来自服务器的响应或回显。似乎服务器仍然能够响应客户端关闭连接。第一个场景的捕获在这里。

如果我刚刚nc localhost 1234在终端中运行并开始输入内容,这与场景二形成鲜明对比。在这种情况下,我可以在 Wireshark 中看到服务器按预期响应,响应发生在此处的第 6 行。

为什么我不能像在案例 2 中那样看到案例 1 中的响应?我需要如何更改我的脚本以反映这种预期的行为(如果可能的话)?最后,在场景 2 中,为什么服务器会两次响应客户端,首先是没有数据的 [ACK],但是在包含“echo”数据后立即另一个 [PSH,ACK](如第 5 行和第 6 行所示)第二次捕获)?

编辑: 在浏览了更多之后,我想我已经找到了问题的解决方案。这是由于 netcat 在收到响应之前退出,详见https://unix.stackexchange.com/questions/289364/netcat-doesnt-print-response。因此,一个简单的解决方法是更改​​脚本,使其使用-q延迟选项。

 while :
    do
            var="$(shuf -i 9-19 -n 1)" 
            rand="$(pwgen "$var" 1)" 
            echo "$rand" | nc -q 1 localhost 1234 #change here
            sleep 5
    done

我仍然不确定我的第三个问题,但怀疑这可能是连接的新窗口大小的同步?再次感谢您的任何见解。

标签: bashtcpnetcat

解决方案


推荐阅读