Netcat丢弃传入的数据包

时间:2014-03-25 10:42:26

标签: bash telnet netcat

我在Ubuntu机器上使用bash命令来控制测量仪器。两台机器都连接到同一个LAN。测量仪器在TCP端口5025上侦听SCPI命令。标准测试 - 询问仪器的ID - 效果很好:

mjh@Ubuntu:~$ echo "*IDN?" | netcat 192.168.0.10 5025
Rohde&Schwarz,ZVL-3,12345

但是当我查询数据时(我期望1818个ASCII字符),netcat立即返回:

mjh@Ubuntu:~$ echo "TRAC? TRACE1" | netcat 192.168.0.10 5025
mjh@Ubuntu:~$

但是,我可以在交互式telnet会话中查询数据而不会出现问题:

mjh@Ubuntu:~$ telnet 192.168.0.10 5025
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is '^]'.
TRAC? TRACE1
-6.993319702E+001,-6.755982208E+001, ... (1818 chars in total)

我想在脚本中使用这些命令,这就是我想使用netcat的原因。

我怎样才能找出为什么telnet有效并且netcat没有?可能是大包装尺寸?

到目前为止,我(未成功)尝试了以下内容:

  • netcat -C用于CRLF作为行结尾
  • 使用netcat -t获取更多telnet兼容性
  • 绝望地使用netcat -u

1 个答案:

答案 0 :(得分:0)

根本原因

Netcat和telnet以不同方式处理连接。

<强>的Telnet

  • 与仪器建立TCP连接
  • 当用户输入数据时,将其发送到仪器(在这种情况下为#34; TRAC?TRACE1&#34;)
  • 从仪器接收数据(若干包,如果需要)
  • 当用户结束交互式会话时,关闭与仪器的TCP连接
  • 退出程序

<强> Netcat的

  • 与仪器建立TCP连接
  • 发送通过管道传输到netcat的数据(在本例中为#34; TRAC?TRACE1&#34;)
  • 立即要求终止连接
  • 接收仪器压缩的任何数据
  • 仪器确认并完成TCP连接关闭后退出程序。

具体来说,当使用netcat查询ID时,仪器会立即在其ACK内返回ID。但是在询问数据时,仪器需要更长的时间才能获取数据,仪器中的网络适配器会在数据发送之前关闭连接。

找出根本原因

评论建议使用这些工具,但这不是微不足道的,所以我将深入研究一般程序:

  • 在Ubuntu机器上,安装tcpdump

    sudo apt-get install tcpdump
    
  • 找到您的网络适配器的ID(查找eth0,eth1或任何提醒您网络适配器的内容。在我的情况下,我获得了eth1。)

    sudo tcpdump -D
    
  • 捕获所有来自或来自端口5025(SCPI端口)的流量。 s0选项告诉tcpdump捕获整个包,而不仅仅是前几个字节。 -w选项使tcpdump将原始数据保存到文件中。

    sudo tcpdump -i eth1 -s0 port 5025 -w netcat_trac.dump
    
  • 打开第二个终端窗口并执行netcat命令(或telnet会话):

     echo "TRAC? TRACE1" | netcat 192.168.0.10 5025
    
  • 在第一个终端窗口中,按CTRL+C

  • 停止tcpdump
  • 对几种不同的风格重复此操作,每次都将输出保存到不同的.dump文件中。

  • 在任何带有GUI的PC上(Windows,在我的情况下,但也适用于Ubuntu),安装Wireshark并查看.dump文件。

  • 注意SYN系列{&#34;我想建立联系&#34;),SYN+ACK(&#34;我理解你,也想要与你建立联系&#34;),FIN+ACK(我想停止与你交谈)捕获数据包中的标志。比较这些标志在不同方案中的显示顺序。如果您不知道这意味着什么,this is a great introduction。 (如果你想了解粗略的细节,也要注意&#34; seq&#34;和#34; ack&#34;数字。)

解决方案

使用-q开关告诉netcat在关闭连接之前等待。

echo "TRAC? TRACE1" | netcat -q 1 192.168.0.10 5025

在上面的命令中,等待时间是1秒。

我确信有更好的解决方案(等待设置为PSH的数据包而不是可能太短或太长的固定时间),但这对我来说效果不错。