深入理解网络监听:TCP、UDP、IPv4 和 IPv6

文章目录

深入理解网络监听: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                :::*                    
解释
  1. 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)进行监听。
  2. 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)进行监听,仅本地访问。
  3. tcp6 0 0 :::80 ::: LISTEN*

    • Proto: TCP6
    • Local Address: :::80
    • Foreign Address: ::😗
    • State: LISTEN
    • 解释: 系统正在所有 IPv6 网络接口上的端口 80(HTTP)进行监听。
  4. *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)进行监听。
  5. *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 的监听关系

  1. 独立监听 : 在大多数现代操作系统中,IPv6 和 IPv4 的监听是独立的。这意味着如果你在某个端口上监听 IPv6 地址(例如 ::),它不会自动监听相应的 IPv4 地址(例如 0.0.0.0)。你需要分别为 IPv4 和 IPv6 配置监听。

  2. 双栈监听(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
解释
  1. 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)进行监听。
  2. 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)。

监听模式的类型

监听模式主要有以下几种:

  1. LISTEN: 服务器正在监听来自客户端的连接请求。
  2. ESTABLISHED: 连接已经建立,正在进行数据传输。
  3. CLOSE_WAIT: 远程主机已经关闭连接,等待本地主机关闭。
  4. TIME_WAIT: 本地主机已经关闭连接,等待足够的时间以确保远程主机收到关闭确认。
  5. SYN_SENT: 本地主机已经发送连接请求,等待远程主机确认。
  6. SYN_RECV: 远程主机已经收到并确认连接请求,等待本地主机确认。
  7. FIN_WAIT1: 本地主机已经关闭连接,等待远程主机确认。
  8. FIN_WAIT2: 远程主机已经确认关闭连接,等待远程主机关闭。
  9. CLOSING: 双方都尝试关闭连接,但还未完成。
  10. 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 之间的连接已经建立。
相关推荐
PersistJiao27 分钟前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
黑客Ash3 小时前
【D01】网络安全概论
网络·安全·web安全·php
->yjy3 小时前
计算机网络(第一章)
网络·计算机网络·php
摘星星ʕ•̫͡•ʔ4 小时前
计算机网络 第三章:数据链路层(关于争用期的超详细内容)
网络·计算机网络
.Ayang5 小时前
SSRF漏洞利用
网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
好想打kuo碎5 小时前
1、HCIP之RSTP协议与STP相关安全配置
网络·安全
虚拟网络工程师6 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
JosieBook7 小时前
【网络工程】查看自己电脑网络IP,检查网络是否连通
服务器·网络·tcp/ip
inter_peng8 小时前
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
tcp/ip·docker·eureka