文章目录
- [深入理解网络监听:TCP、UDP、IPv4 和 IPv6](#深入理解网络监听:TCP、UDP、IPv4 和 IPv6)
- 监听模式的类型
-
-
- 查看某个端口的监听模式
- [`netstat` 输出解释](#
netstat
输出解释) - 监听模式的类型
- 示例
- 查看特定端口的监听模式
-
深入理解网络监听:TCP、UDP、IPv4 和 IPv6
在网络编程和系统管理中,监听端口是一个非常重要的概念。通过监听端口,服务器可以接收来自客户端的连接请求。本文将详细介绍如何使用 netstat
命令查看系统上哪些端口正在监听,以及它们的监听模式。我们还将探讨 TCP 和 UDP 协议在 IPv4 和 IPv6 上的监听关系。
使用 netstat
查看监听端口
netstat
是一个强大的网络工具,用于显示网络连接、路由表、接口统计信息等。要查看系统上所有正在监听的端口,可以使用以下命令:
sh
netstat -an | grep LISTEN
netstat
输出解释
netstat
的输出通常包含以下几列:
- Proto: 协议类型(TCP、UDP 等)。
- Recv-Q: 接收队列的字节数。
- Send-Q: 发送队列的字节数。
- Local Address: 本地地址和端口。
- Foreign Address: 远程地址和端口。
- State: 连接的状态(仅适用于 TCP)。
示例和解释
假设你运行以下命令来查看所有正在监听的端口:
sh
netstat -an | grep LISTEN
输出示例:
sh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp6 0 0 :::123 :::*
解释
-
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN*
- Proto: TCP
- Local Address: 0.0.0.0:22
- Foreign Address: 0.0.0.0:*
- State: LISTEN
- 解释: 系统正在所有 IPv4 网络接口上的端口 22(SSH)进行监听。
-
tcp 0 0 127.0.0.1:3306 0.0.0.0: LISTEN*
- Proto: TCP
- Local Address: 127.0.0.1:3306
- Foreign Address: 0.0.0.0:*
- State: LISTEN
- 解释: 系统正在本地回环地址(127.0.0.1)上的端口 3306(MySQL)进行监听,仅本地访问。
-
tcp6 0 0 :::80 ::: LISTEN*
- Proto: TCP6
- Local Address: :::80
- Foreign Address: ::😗
- State: LISTEN
- 解释: 系统正在所有 IPv6 网络接口上的端口 80(HTTP)进行监听。
-
*udp 0 0 0.0.0.0:123 0.0.0.0: **
- Proto: UDP
- Local Address: 0.0.0.0:123
- Foreign Address: 0.0.0.0:*
- State: 无(UDP 无状态)
- 解释: 系统正在所有 IPv4 网络接口上的端口 123(NTP)进行监听。
-
*udp6 0 0 :::123 ::: **
- Proto: UDP6
- Local Address: :::123
- Foreign Address: ::😗
- State: 无(UDP 无状态)
- 解释: 系统正在所有 IPv6 网络接口上的端口 123(NTP)进行监听。
特殊地址解释
- 0.0.0.0: 表示所有 IPv4 地址。监听在 0.0.0.0 上的服务会接受来自任何 IPv4 地址的连接。
- :::: 表示所有 IPv6
在网络编程中,TCP 和 UDP 协议可以分别在 IPv4 和 IPv6 上运行。关于 TCP6(IPv6)监听是否会包含 TCP4(IPv4)监听,这取决于操作系统和具体的网络栈实现。
IPv6 和 IPv4 的监听关系
-
独立监听 : 在大多数现代操作系统中,IPv6 和 IPv4 的监听是独立的。这意味着如果你在某个端口上监听 IPv6 地址(例如
::
),它不会自动监听相应的 IPv4 地址(例如0.0.0.0
)。你需要分别为 IPv4 和 IPv6 配置监听。 -
双栈监听(Dual Stack Sockets) : 一些操作系统支持双栈监听,这意味着你可以在一个 IPv6 套接字上同时监听 IPv4 和 IPv6 地址。这种情况下,监听
::
地址可以同时接受 IPv4 和 IPv6 的连接。这种行为通常由套接字选项IPV6_V6ONLY
控制。
示例
假设你在一个支持双栈监听的系统上运行以下命令:
sh
netstat -an | grep LISTEN
输出示例:
sh
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
解释
-
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN*
- Proto: TCP
- Local Address: 0.0.0.0:80
- Foreign Address: 0.0.0.0:*
- State: LISTEN
- 解释: 系统正在所有 IPv4 网络接口上的端口 80(HTTP)进行监听。
-
tcp6 0 0 :::80 ::: LISTEN*
- Proto: TCP6
- Local Address: :::80
- Foreign Address: ::😗
- State: LISTEN
- 解释: 系统正在所有 IPv6 网络接口上的端口 80(HTTP)进行监听。
独立监听与双栈监听
在这种情况下,如果系统支持双栈监听,并且 IPV6_V6ONLY
选项未启用,那么 tcp6 :::80
可能会同时接受 IPv4 和 IPv6 的连接。
检查 IPV6_V6ONLY
选项
你可以通过检查 IPV6_V6ONLY
选项来确定是否启用了双栈监听。以下是一个示例代码,展示如何在编程中检查和设置这个选项:
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd;
int optval;
socklen_t optlen = sizeof(optval);
// 创建一个 IPv6 套接字
sockfd = socket(AF_INET6, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 获取 IPV6_V6ONLY 选项的值
if (getsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, &optlen) < 0) {
perror("getsockopt");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("IPV6_V6ONLY is %s\n", optval ? "enabled" : "disabled");
// 关闭套接字
close(sockfd);
return 0;
}
独立监听与双栈监听总结
- 独立监听: 在大多数情况下,IPv4 和 IPv6 的监听是独立的,需要分别配置。
- 双栈监听 : 一些操作系统支持双栈监听,可以在一个 IPv6 套接字上同时监听 IPv4 和 IPv6 地址,这取决于
IPV6_V6ONLY
选项的设置。
要确定你的系统是否支持双栈监听以及如何配置,可以参考系统的文档或使用编程方式检查 IPV6_V6ONLY
选项。
监听模式的类型
netstat
是一个网络工具,用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员等信息。它可以帮助你查看系统上哪些端口正在监听,以及它们的监听模式。
查看某个端口的监听模式
要查看某个特定端口的监听模式,可以使用 netstat
命令结合 grep
过滤结果。例如,要查看端口 80 的监听模式,可以使用以下命令:
sh
netstat -an | grep :80
netstat
输出解释
netstat
的输出通常包含以下几列:
- Proto: 协议类型(TCP、UDP 等)。
- Recv-Q: 接收队列的字节数。
- Send-Q: 发送队列的字节数。
- Local Address: 本地地址和端口。
- Foreign Address: 远程地址和端口。
- State: 连接的状态(仅适用于 TCP)。
监听模式的类型
监听模式主要有以下几种:
- LISTEN: 服务器正在监听来自客户端的连接请求。
- ESTABLISHED: 连接已经建立,正在进行数据传输。
- CLOSE_WAIT: 远程主机已经关闭连接,等待本地主机关闭。
- TIME_WAIT: 本地主机已经关闭连接,等待足够的时间以确保远程主机收到关闭确认。
- SYN_SENT: 本地主机已经发送连接请求,等待远程主机确认。
- SYN_RECV: 远程主机已经收到并确认连接请求,等待本地主机确认。
- FIN_WAIT1: 本地主机已经关闭连接,等待远程主机确认。
- FIN_WAIT2: 远程主机已经确认关闭连接,等待远程主机关闭。
- CLOSING: 双方都尝试关闭连接,但还未完成。
- LAST_ACK: 本地主机已经关闭连接,等待远程主机的最后确认。
示例
假设你想查看系统上所有正在监听的端口,可以使用以下命令:
sh
netstat -an | grep LISTEN
输出示例:
sh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
解释:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
: 这表示系统正在监听所有网络接口上的端口 22(SSH)。tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
: 这表示系统正在本地回环地址(127.0.0.1)上的端口 3306(MySQL)进行监听。tcp6 0 0 :::80 :::* LISTEN
: 这表示系统正在所有 IPv6 网络接口上的端口 80(HTTP)进行监听。
查看特定端口的监听模式
假设你想查看端口 80 的监听模式,可以使用以下命令:
sh
netstat -an | grep :80
输出示例:
sh
tcp6 0 0 :::80 :::* LISTEN
tcp 0 0 192.168.1.100:80 192.168.1.1:12345 ESTABLISHED
解释:
tcp6 0 0 :::80 :::* LISTEN
: 这表示系统正在所有 IPv6 网络接口上的端口 80 进行监听。tcp 0 0 192.168.1.100:80 192.168.1.1:12345 ESTABLISHED
: 这表示系统的 IP 地址192.168.1.100
上的端口 80 与远程 IP 地址192.168.1.1
上的端口 12345 之间的连接已经建立。