我已经成为网络运营团队的一员很长一段时间了,并且使用以下命令提取证书:
openssl s_client -connect <IP>:<PORT> </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p'
尽管进程正在端口上运行,但我还是无法提取证书。一件事导致了另一件事,现在我想知道不同之处之间港口, A过程, 和应用!
我知道端口是 TCP/IP 框架的核心部分,由于操作系统 (OS) 基于此工作,因此一些资料提到端口是操作系统的概念。现在,让我们先这样理解,是的,操作系统使用端口来区分应用程序的流量。
所以问题是,即使没有进程/应用程序正在使用该端口(或在其上运行),我仍然可以连接到该端口吗?或者,如果没有服务或进程使用该端口,该端口是否毫无意义?
例如,以 HTTP 请求为例,在建立 TCP 连接时,进程是否重要,或者进程是否仅负责响应 HTTP 请求(实际有效负载)?
我的理解是,是的,没有流程的港口就没有意义,而且它们是一个一揽子交易(因此才有各种港口国家!)。
答案1
非常简单:考虑一个有编号公寓的多方房屋。
- IP地址是街道名称+门牌号。
- 端口是公寓的号码。
- 该应用程序就是公寓内部发生的事情。
- 应用程序需要运行一个或多个进程,这些进程是公寓里的居民所做的事情。
如果您连接到 IP 地址和端口,您可以通过该地址进入房屋,并按响端口定义的公寓的门。
如果没有人开门,那么可能里面没有人(没有流程、没有申请)或者他们可能只是目前不期待访客(没有人在听)。
如果有人打开门,他们可能会立即再次关门,因为他们不喜欢你,他们可能会用你听不懂的语言和你说话(使用了错误的应用程序协议),或者你可能实际上能够按计划进行交流(匹配的应用程序协议)。
你可能不能直接走进屋子,敲门,而是需要先通过一些门房它可能不喜欢你。在这种情况下,他们会直接拒绝你,或者干脆说公寓里没人,即使公寓里有人。这就是防火墙。
答案2
除非进程已告知堆栈它想要侦听该端口,否则端口不会打开(侦听、等待接收连接/流)。在用于 TCP/IP 编程的流行跨平台“BSD 套接字”API 术语中,这称为“打开侦听套接字”。BSD 套接字 API 的套接字概念是一种编程抽象,它与 TCP 或 UDP 中的端口概念紧密相关。
大多数操作系统还具有某种形式的“互联网守护进程”或“延迟启动守护进程”,这些守护进程保证始终运行,并配置为代表其他软件二进制文件在端口上打开侦听器。当它在这样的端口上获得连接尝试时,它会启动已配置为使用该端口的二进制文件,然后将连接交给新启动的进程。这样,您就不需要一直运行大量不同的服务器进程,占用 CPU 和 RAM,只需空闲等待罕见的连接尝试。延迟启动守护进程包括 inetd、xinetd、launchd 等。
有一些众所周知的端口是某些协议的常用默认端口,例如用于 HTTP 的端口 80 和用于 SSH 的端口 22,但这并不是硬性规定。您可以告诉 sshd 监听端口 80,让 httpd 监听端口 22,只要您在告诉客户端应用程序进行连接时指定其他端口,它就可以正常工作。
请注意,这意味着在建立 TCP 连接时,任何一端都无法确切知道另一端的进程将尝试使用哪种协议。服务器应用程序没有标准来识别彼此的协议并交出错误的连接尝试,因此如果您的 Web 浏览器连接到 sshd(而不是 httpd)正在监听的端口,则行为将无法预测。一端或另一端可能会放弃尝试处理另一端的意外行为,并重置(中止)连接。
如果 TCP SYN(连接尝试)到达某个端口,而该端口上没有进程打开侦听器,则操作系统的 TCP 堆栈将以 TCP 重置进行响应,也可能返回 ICMP“目标无法访问:端口无法访问”错误消息数据包。当然,与任何网络流量一样,您的系统上可能装有防火墙或其他策略执行软件,阻止这些响应到达尝试连接的主机,因此发起连接的主机可能根本听不到任何回复,并且可能会超时并在一段时间后放弃尝试。
答案3
所以问题是,即使没有进程/应用程序正在使用该端口(或在其上运行),我仍然可以连接到该端口吗?或者,如果没有服务或进程使用该端口,该端口是否毫无意义?
一般来说,不可以。
可以将端口号视为地址的扩展。IP 地址会将您引导至特定主机;端口号会进一步引导您至特定进程(或者更确切地说,特定插座1) 在该主机内。如果操作系统收到一个数据包,而没有与地址和端口绑定的套接字(处于适当状态),则通常会拒绝该数据包。
内核本身可以处理某些端口的数据包(例如,在 Linux 上,TCP 端口 2049 将由内核 NFS 服务器处理);这通常仍然表示为套接字,而没有相应的进程。
1进程不直接使用端口;它们使用套接字,套接字绑定到特定的地址:端口,但其他操作类似于文件句柄或文件描述符。与打开的文件非常相似,套接字可以由一个进程创建并由其子进程继承。