众所周知,在传输层有两个常用的协议TCP和UDP,本文介绍在Linux命令行下,如何使用nc命令发送或接收UDP数据包,这些命令的用法对调试UDP通信程序将有所帮助。
1. 问题的提出
编写了一个使用raw socket在数据链路层接收原始UDP数据包的程序,调试的时候,需要使用局域网中的另一台机器发送UDP数据包,突然发现居然一下子想不出如何在命令行上发送数据包;首先想到的是用curl,但又一想不对,curl只能使用应用层协议透过TCP协议发送数据包,所以可以发HTTP请求包,FTP请求包等,是不能发送UDP数据包的。
终于想起了不怎么使用的nc命令,可以很方便地发送UDP数据包
2. 文章要点
- 理解Linux下的nc命令;
- 使用nc命令在网络上发送或接收UDP报文;
- 抓取nc命令发送的UDP报文;
- 介绍其它可以发送UDP报文的命令。
3. netcat 命令
- nc是netcat的简写,大多数的Linux发行版中默认是安装netcat的,打开一个终端窗口(ctrl+alt_t),用下面命令检查一下是否已经安装了netcat:
nc
- 在ubuntu 20.04下的输出:
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
[-m minttl] [-O length] [-P proxy_username] [-p source_port]
[-q seconds] [-s source] [-T keyword] [-V rtable] [-W recvlimit] [-w timeout]
[-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]
- 这个输出表示当前的Linux下已经有nc命令了。
4. 发送 UDP 数据包
- 举个例子,假定我们要从A机发送一个UDP报文到B机,按照server-client的概念,我们把B机作为server端,A机作为client端;
- A机的IP: 192.168.2.112;B机的IP:192.168.2.114
- 启动server
在B机上用如下命令启动Server
nc -u -l 8888
下面是屏幕截图
启动后,并没有更多的提示,当收到信息时,会显示收到的信息
- 检查server是否启动
在B机上启动一个新的终端窗口;
在B机上使用如下命令检查是否已经启动server;
netstat -a|grep 8888
屏幕截图
- 发送UDP报文
在A机上启动client
nc -n 192.168.2.114 8888
client启动后,和server端一样,并没有更多的提示,可以直接输入你要发出的信息
在A机输入信息:I am from ubuntu system A.
下面是A机上的屏幕截图
下面是B机上的屏幕截图
也可以在B机输入信息,信息会发送到A机
在B机输入信息:I am from ubuntu system B.
下面是在B机的截图
下面是在A机的截图
5. 其它可以发送UDP数据包的命令
- 还有一个可以简单地发送UDP报文的方法,我们在A机上退出nc,然后使用下面命令发出信息
echo -n "I am sending an UDP packet using echo command" > /dev/udp/192.168.2.114/8888
- 下面是在A机上的截屏
- 下面是在B机上的截屏
- 很显然使用cat命令也可以发送UDP报文:
欢迎访问我的博客:https://whowin.cn
Tags:ncftp