如果多台具有本地地址(192.168.0.#)的计算机连接到一个路由器,每台计算机打开一个网络浏览器并通过HTTP请求一个页面,当这些TCP:80数据包发出时,路由器将本地地址与路由器的静态 IP(即提供商给定的 IP),以便服务器可以回复适当的地址。
但是路由器如何知道将 HTTP 回复转发到哪台计算机,因为 TCP 标头不包含本地 IP 地址(是吗?),并且所有计算机都使用端口 80?
这与MAC地址有什么关系吗?
这是如何工作的?
我使用的是 Windows 7。当我在命令提示符下键入“路由打印”时,我会得到一个 IPv4 路由表,在网关列下有几个“链接”值。例如,像这样:
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.5 25
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
137.132.0.0 255.255.0.0 172.18.180.1 172.18.180.10 31
137.132.80.16 255.255.255.255 192.168.1.1 192.168.1.5 26
169.254.0.0 255.255.0.0 On-link 172.18.180.10 306
169.254.255.255 255.255.255.255 On-link 172.18.180.10 286
172.18.0.0 255.254.0.0 172.18.180.1 172.18.180.10 31
172.18.180.0 255.255.255.0 On-link 172.18.180.10 286
172.18.180.10 255.255.255.255 On-link 172.18.180.10 286
172.18.180.255 255.255.255.255 On-link 172.18.180.10 286
172.25.64.0 255.255.240.0 172.18.180.1 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个侦听端口 3000 的应用程序。显然它的一个实例仍在侦听端口,因为每当我启动它时,它都无法创建侦听器(C#、TcpListener,但这无关紧要),因为端口已经采取。
现在,任务管理器中不存在该应用程序,所以我试图找到它的 PID 并杀死它,这导致了这个有趣的结果:
C:\Users\username>netstat -o -n -a | findstr 0.0:3000
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116
C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这种行为,并认为看看是否有人有解决方案很有趣。
更新:我启动了 Process Explorer 并搜索了 3000 并找到了这个:
<Non-existent Process>(3000): 5552
Run Code Online (Sandbox Code Playgroud)
我右键单击它并选择“关闭句柄”。它不再在 Process Explorer 中,但仍显示在 netstat 中,并且仍会阻止应用程序启动侦听器。
更新 2:找到了 Windows 的 TCPView,它将进程显示为"<non-existent>". 与 CurrPorts 一样,当我尝试关闭此工具中的连接时没有任何反应。
对于 TCP 连接,当我移除电缆并在 30-40 秒后重新连接时,没有丢包问题。但是当重新连接时间超过几分钟时,所有数据包都丢失了。我知道它可以在重传计时器用完的情况下工作,但我想知道拔掉网络电缆时到底发生了什么。
这是一直让我困惑的事情。为什么在您的计算机上打开端口是不好的?假设您的计算机上没有病毒,也没有其他侦听端口的程序可能会实际执行某些操作,为什么端口打开很重要?如果某个恶意的人开始向端口发送数据包,但没有任何东西可以接收数据并对其进行处理,为什么这很重要?计算机不只是任意执行它接收到的任何数据。我知道用数据包淹没计算机可能会导致它崩溃,因为它无法处理大量数据,但我只考虑实际更改计算机上文件的安全问题。
更新
感谢您到目前为止的答复。我现在明白了,一个端口被打开实际上意味着有一个程序可以被利用来监听那个端口。但是为什么编写不能被利用的软件就这么难呢?要对计算机造成任何真正的伤害,程序不必允许上传一个或多个文件,然后需要执行其中一个文件。似乎很难允许意外发生。
我的 Windows 11 上安装了 wsl2(ubuntu)。
我已经在 Windows 本地主机上设置了一个 gdb 侦听器服务器,并希望从 wsl2 访问它。但我的 Windows 机器和 wsl 虚拟机似乎使用不同的网络适配器。
>ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1114:bb:d0ad:93f8%18
IPv4 Address. . . . . . . . . . . : 172.29.192.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . …Run Code Online (Sandbox Code Playgroud) 当我连接到https://www.google.co.uk 时,它会更改为 216.58.198.228:443。然后在 [My IP Address]:63998 上打开与我的连接。
我的问题是如何选择 63998 端口,是否有办法将其强制为 63999。
每次我尝试过滤以仅显示特定 IP 地址时,都会收到一条错误消息,指出它“不是接口或字段”。我不知道这意味着什么。此外,无论如何我都没有在日志中看到任何本地主机流量。
如何显示 TCP 本地主机流量?
平台:Windows 7