如何检查打开的端口是 TCP 还是 UDP?

How do I check whether an open port is TCP or UDP?

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

... how I will check the open port is udp or tcp?

您似乎想到的是一条街道,其中端口是门牌号,每个房子中可能存在 TCP and/or 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 基本上总是会成功,无论目的地是否有流量(即端口“打开”)。

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

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

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