使浏览器向特定端口发送请求

Making browser send requests to specific port

为了学习网络,我创建了一个 tcp 连接,例如:

$ nc -p 12345 google.com 80

现在,如果我发送 GET 请求,一切都很好,我可以在 Wireshark 中看到所有数据包。

但是如果我想在我的浏览器中尝试它并在我的浏览器栏中输入

localhost:12345

它拒绝连接,事实上什至没有发送任何数据包。 (TCP 连接还在)

那为什么我可以通过 shell 而不是通过浏览器进行通信,我在这里缺少什么?我的浏览器不应该只将 GET 请求转发到端口 12345 吗?

您混淆了源端口和目标端口。

$ nc -p 12345 google.com 80

此命令告诉 netcat 从您的源端口 12345 在其远程端口 80 上打开与服务器 google.com 的连接。

相比之下,localhost:12345 将远程端口指定为 12345,源端口可以是您的操作系统为请求分配的任何端口。这类似于您第一个示例中的 google.com:80。

源端口不响应新连接请求,因为没有服务侦听对发送给它的应答请求。

编辑:可以在 https://superuser.com/questions/704742/source-address-source-port-vs-destination-address-destination-port

找到有关源端口与目标端口的进一步阅读

编辑 2:如果您只想发出 HTTP 请求并强制使用本地端口,请查看 cURL。以下将做你想做的。

$ curl --local-port 12345 google.com:80

您不能让现代浏览器使用特定端口,因为有很多因素,包括并行请求和管道请求。基本上,每次加载网页时,可能会在数十个端口上同时打开数十个请求。 Web 比以前更复杂,指定单个端口来加载页面没有实际意义,因为访问页面时会触发许多同时连接。