10

我正在学习使用 Java 进行套接字编程。我使用以下语句连接到网站:

s = new Socket("www.nba.com", 80);

当我调试应用程序并查看 s 的内容时,我看到:

Socket[addr=www.nba.com/2.21.246.97,port=80,localport=7846]

1)我想知道这个本地端口 7846 来自哪里以及它到底是什么。

2) 如果网站的 IP 地址是 2.21.246.97,为什么我在浏览器的地址栏中输入 2.21.246.97 就无法连接到网站?


谢谢

4

2 回答 2

7

它是一个本地套接字端口号。它通常由系统分配。

请参阅什么是套接字?.

在客户端:客户端知道服务器正在运行的机器的主机名和服务器正在侦听的端口号。为了发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,以便绑定到将在此连接期间使用的本地端口号。这通常由系统分配。

至于第二个问题:

我假设这个 IP 地址是您在查找时通过 DNS 服务器获得的www.nba.com(我的不同)。问题可能是该地址的 HTTP 服务器服务于多个虚拟主机和/或它关心Host您的浏览器发送的标头。在您的情况下,它是 IP 地址而不是www.nba.com.

于 2012-11-21T23:53:00.857 回答
0

local port只不过是一个套接字描述符(或一个非常高编号的端口)

每当一个进程进行 API 调用时,该请求通过内核创建一个套接字描述符,以便绑定(并识别)这个特定请求的响应。任何出站调用都会导致创建一个套接字,当响应到达 NIC(网络接口)然后到达内核时,内核会计算出此响应的目标应用程序。

这是通过检查与正在运行的进程 (pid) 具有一对一映射的端口来完成的。然后它检查响应元数据中附加的套接字描述符值(该值在创建连接时传递)并将响应流发送到套接字缓冲区。

然后 CPU 唤醒进程以收集响应。

所以回答你的主要问题,

  • local port只不过是一个socket descriptor
  • 理想情况下,如果没有虚拟化并且您拥有硬件,那么您应该能够做到。通过ip连接到它。但通常情况并非如此,很多 NAT(网络地址转换)可能会阻止这种情况发生

尝试,ls -li /proc/<pid>/fd/查看所有打开的套接字描述符
,您的应用程序进程 ID 在哪里

于 2020-07-17T13:43:04.043 回答