【问题标题】:How do I check whether an open port is TCP or UDP?如何检查打开的端口是 TCP 还是 UDP?
【发布时间】:2021-06-30 10:52:29
【问题描述】:

我正在做一个端口扫描器。我可以通过尝试与端口建立连接来检查端口是否打开,但是,我将如何检查打开的端口是 udp 还是 tcp?

【问题讨论】:

  • 您是使用 UDP 还是 TCP 建立连接?你必须说哪一个,当你创建套接字时......
  • 如果你在扫描本地机器,有平台API可以直接查询本地端口表。但是,如果您尝试扫描远程机器,则根本无法直接确定给定端口是使用 TCP 还是 UDP。你所能做的就是尝试两者,看看会发生什么。尝试connect()一个TCP套接字到该端口,看看它是否成功。尝试向端口发送 UDP 数据包,看看是否收到任何非 ICMP(主机不可达、端口不可达等)回复。

标签: sockets port


【解决方案1】:

...我将如何检查打开的端口是 udp 还是 tcp?

您似乎想到的是一条街道,其中端口是门牌号,并且每个房子中都可能存在 TCP 和/或 UDP。你敲门,然后需要弄清楚是UDP还是TCP打开了门。但这种观点是错误的。

这更像是两条独立的街道,只是门牌号相同。 TCP 有一条街道,UDP 有一条街道,您可以通过选择套接字类型来决定走哪条街道。无需检查谁住在那里,因为在 TCP 街上只有 TCP 可以住,而在 UDP 街上只有 UDP。

使用 AF_INET(或 AF_INET6)和 SOCK_STREAM 创建 TCP 套接字。 UDP 套接字使用 SOCK_DGRAM 而不是 SOCK_STREAM。因此,您可以通过创建套接字来了解您的期望,即走哪条街道。

除了 UDP 没有实际连接的概念:虽然可以connect 一个 UDP 套接字,但这将在本地套接字上设置目标地址。它实际上并不像 TCP 那样向对等方发送任何数据来建立连接。因此,UDP 套接字上的connect 基本上总是会成功,无论目标上是否有预期流量(即端口“打开”)。

【讨论】:

    【解决方案2】:

    一个端口可以运行任意数量的服务,使用不同的协议。仅连接意味着您使用特定协议进行连接,您需要检查其他协议。

    因此,虽然作为答案可能并不令人满意,但如果您一直在使用 TCP 进行探测,您可能从未找到过 UDP 服务,反之亦然。而且,如果您一直在使用 XTP 或类似的东西进行探索,您可能从未找到一个开放的端口。

    当然,要小心。 “连接”在不同的协议下有不同的含义,特别是像TCP这样面向流的协议。您可能在非正式意义上已经“连接”(促使服务器承认您),但在您肯定引起服务器注意的情况下建立连接的意义上,您可能没有“连接”。

    【讨论】:

    • “一个端口可以运行任意数量的服务,使用不同的协议。” - 我不会这样描述它。只有 TCP 和 UDP 是首先具有端口的协议,即 ICMP 没有。这不是一个可以支持多种协议的端口,它们是具有相同编号的不同端口。 TCP 和 UDP 更像是不同的街道,您拥有相同的门牌号码 - 它不是两方(TCP 和 UDP)居住的单一房屋。
    • @SteffenUllrich,有数百种协议,只有几十种最终出现在/etc/protocols。但即使在“官方”列表中,XTP、RDP(不是微软的)等在该领域也不难找到。
    • 没错,还有一些协议有端口,比如 SCTP。据我所知,XTP 虽然没有端口的概念。尽管如此,仍然没有端口和内部协议的通用概念。相反,有些协议有端口的概念,有些则没有。
    • @SteffenUllrich,因此,“一个端口可以运行任意数量的服务”,因为没有考虑到每个实验协议。但是没有理由假设“任何数字”会包括任何特定的协议,这就是我没有这么说的原因。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2011-08-18
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多