面试官:我问一个简单的问题,如何判断目标主机是否在监听一个UDP端口port?

我:给目标主机发送一个UDP报文(含目标port),如果收到回复,表示监听,否则表示没有监听。

面试官:有没有通用一点的方法

我:没有

目录

1、TCP监听端口

1.1、connect接口

1.2、telnet指令

1.3、nc 指令

2、UDP监听端口

2.1、nc + ping + traceroute


1、TCP监听端口

问题分析:

假设题目为是否在监听一个TCP端口,那就容易多了

1.1、connect接口

编程上:我们可以直接调用connect接口(unix),建链远端地址和端口,建链成功:在监听port;建链拒绝:表示未在监听

工具上:

1.2、telnet指令

格式:telnet [hostname] [port]   //仅适用TCP

//client
[root@localhost ~]# telnet 10.43.42.199 20000
Trying 10.43.42.199...
telnet: connect to address 10.43.42.199: Connection refused
telnet: Unable to connect to remote host: Connection refused
[root@localhost ~]# telnet 10.43.42.199 30000
Trying 10.43.42.199...
Connected to 10.43.42.199 (10.43.42.199).
Escape character is '^]'.
xxxxxxxddddddddd
Connection closed by foreign host.
[root@localhost ~]#==========================================================================//remote
[root@localhost ~]# ./tcp_server 10.43.42.199 30000
wait for clients connect----------
client IP :10.43.85.162 34494
recv_buf=xxxxxxxddddddddd^C
[root@localhost ~]#

报文:

1.3、nc 指令

//client
[root@localhost ~]# nc -vz 10.43.42.199 60001
nc: connect to 10.43.42.199 port 60001 (tcp) failed: Connection refused
[root@localhost ~]# nc -vz 10.43.42.199 60000
Connection to 10.43.42.199 60000 port [tcp/*] succeeded!
[root@localhost ~]#
===================================================================
//remote
[root@localhost ~]# ./tcp_server 10.43.42.199 60000
wait for clients connect----------
client IP :10.43.85.162 33741
^C
[root@localhost ~]#

报文:

2、UDP监听端口

connect 接口链接UDP套接字和远端主机UDP绑定的地址和端口,无论远端是否绑定,connect均可以链接成功,同时 telnet也仅适用于TCP,因此判断远端的存在监听UDP端口只能通过nc指令即netcat服务,假设UDP监听端口收到远端发来的探测包,直接弹回或者给予恢复应答,则客户端仅需判断是否有回环包回来即可,但是因为UDP是无连接的,可以收到包后不给以任何回复,编写服务器udp_server收到包直接打印输出。

2.1、nc + ping + traceroute

//client
[root@localhost ~]# nc -uvz 10.43.42.199 10000
[root@localhost ~]# nc -uvz 10.43.42.199 20000
Connection to 10.43.42.199 20000 port [udp/dnp] succeeded!
[root@localhost ~]#//remote
[root@localhost ~]# ./udp_server 10.43.42.199 20000
client [10.43.85.162: 38752]
lenx =1,buf=X
client [10.43.85.162: 38752]
lenx =1,buf=X
client [10.43.85.162: 38752]
lenx =1,buf=X
client [10.43.85.162: 38752]
lenx =1,buf=X
client [10.43.85.162: 38752]
lenx =1,buf=X

通常情况,当服务器收到的 udp 报文发现没有发现监听端口会使用 icmp 协议回复差错报文(type = 3,code = 3),关于linux内核udp协议收包流程参见《linux内核协议栈 UDP之数据报接收过程Ⅰ》,实际抓包信息如下:

这里还有一个很重要的问题,就是 UDP 服务器收到远端的探测报文不会回复问题,因此客户端需要确认发出UDP探测报文已经到了目标机而不是中途丢了,因此事先检测一下客户端到目标机之间的链路是通的,否则netcat会错误的认为没有收到UDP的回复报文而认为远端还在监听相应的端口,测试链路不通场景如下:

[root@localhost ~]# ping 10.43.42.200 -c 5
PING 10.43.42.200 (10.43.42.200) 56(84) bytes of data.--- 10.43.42.200 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 14010ms[root@localhost ~]# nc -uvz 10.43.42.200 20000
Connection to 10.43.42.200 20000 port [udp/dnp] succeeded!
[root@localhost ~]#

可以到 10.43.42.200 的链路本来就不通,但是nc还是回复远端绑定udp端口20000,因此nc需要结合ping来使用。再有一点需要注意的是 ping 包均是 ICMP 报文,即使链路正常,还是不能保证百分之百保证UDP报文一定能到达对端,因为还有极少数的路由器或者一些防火墙设备可能会丢去一些端口较大的 UDP 报文,因此,此时还要借助 traceroute 判断 UDP 包是否到达了远端主机。

如何判断目标主机是否在监听一个UDP端口(阿里云二面)相关推荐

  1. java 监听本地端口_JAVA本地监听与远程端口扫描

    摘 要 随着Internet的不断发展,信息技术已成为社会进步的巨大推动力.不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要.本地 ...

  2. TCP和UDP可以同时监听相同的端口

    TCP和UDP可以同时监听相同的端口吗(可以) IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他.操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文, ...

  3. python多进程关闭socket_用Python制作一个多进程UDP服务器,一个进程监听一个p

    我想用Python制作一个多进程UDP服务器,从一个类中为每个进程监听一个端口: processListener.py:import multiprocessing import socket cla ...

  4. php进程监听是什么意思,多进程监听同个端口及单进程监听多个端口的php版本实现...

    最近在看nginx设计原理时思考到两个问题,便是: 多个进程能否监听同个端口? 单个进程能否监听多个端口? 当然随着学习的深入,答案均是肯定的,在这个过程中笔者为了验证,用php写了两个例子,在这里分 ...

  5. Golang net/http包 同时监听多个端口

    背景 在golang中 需要同时监听多个端口 对http请求进行相同的处理(handler) 实现 代码如下 很简单 func handler1(w http.ResponseWriter, r *h ...

  6. java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?

    随着时代的不断进步与发展,人们对于科学技术的使用也越来越普遍化.人们都开始自己学习编程语言以更好的适应时代的发展.今天就来为大家介绍一下,java中监听一个客户端怎么做?监听多个怎么做?一起来看看吧. ...

  7. 本地启动 Hybris 服务器调试模式后,监听在 8000 端口

    使用命令行 hybrisserver.bat debug 启动后,在任务管理器查看 Java.exe 进程: 能看到监听在 8000端口,启用的命令行参数如下: "C:\Program Fi ...

  8. nginx 监听非标准端口80,重定向端口丢失问题解决

    nginx 监听非标准端口80,重定向端口丢失问题解决 参考文章: (1)nginx 监听非标准端口80,重定向端口丢失问题解决 (2)https://www.cnblogs.com/qianxunm ...

  9. 单个进程监听多个端口及多个进程监听同一个端口

    单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...

最新文章

  1. EOSRAM那么火,BANCOR协议白皮书了解一下?
  2. 分析Windows和Linux动态库
  3. PHP判断客户端的浏览器类型
  4. keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
  5. 华为畅享max有没有人脸识别_华为畅享7s有人脸识别吗 让我来告诉你
  6. SPRING IN ACTION 第4版笔记-第二章-004-Bean是否单例
  7. 理科本科,无考试,读诗《宣州谢脁楼饯别校书叔云》李白
  8. 21款数据恢复软件,包含电脑PC、手机安卓、与苹果IOS免费下载
  9. [网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
  10. 贷前调查必须采集的十大客户信息
  11. web页面左右双向箭头(利用CSS样式和图片)——20181130
  12. 最快的 Hexo 博客搭建方法
  13. 【UOJ#60】【UR #5】怎样提高智商
  14. word公式编辑器输入斜体
  15. layui富文本编辑器上传图片
  16. Autodesk Alias AutoStudio 2022.1 x64
  17. 华为9月12日发布鸿蒙系统,华为自研系统“鸿蒙”新机或已大规模测试 最快今年9月发布...
  18. Atitit 经济学常见的流派 古典主义与凯恩斯主义
  19. Linux系统结构和文件管理
  20. MATLAB中物体夹角的检测

热门文章

  1. 一个在黑客界引起轰动的菜鸟教材---跟我学编程系列
  2. 条码打印器如何制作超市价签
  3. socket:内核初始化及创建流(文件)详细过程
  4. 白色半透明html,3DMax白色半透明窗帘,这样的材质参数是多少?
  5. struts2 快速入门(01)第一个 struts2 程序
  6. 制作个人简历模板网页效果 | 码云端的开源项目
  7. html 中几次方,平方米,立方米.
  8. 买了联通CDMA无线上网卡
  9. 数据库事务隔离级别-- 脏读、幻读、不可重复读
  10. 论文笔记31 -- (ReID)【ICCV2021】TransReID: Transformer-based Object Re-Identification