我正在学习使用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就无法连接到该网站?
谢谢。
我正在学习使用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就无法连接到该网站?
谢谢。
local port
就是一个套接字描述符(或者是一个非常高的端口号)
每当一个进程进行 API 调用时,请求通过内核创建一个套接字描述符,以便绑定(和标识)这个特定请求的响应。任何出站调用都会导致创建一个套接字,当响应到达 NIC(网络接口),然后到达内核时,内核会找出此响应的目标应用程序。
这是通过检查具有一对一映射到运行进程(pid)的端口来完成的。然后它检查附加在响应元数据中的套接字描述符值(在创建连接时传递此值),并将响应流发送到套接字缓冲区。
然后 CPU 唤醒进程以收集响应。
所以回答你的主要问题,
local port
就是一个 套接字描述符
尝试使用ls -li /proc/<pid>/fd/
命令查看所有打开的套接字描述符
其中<pid>是您的应用程序进程ID