监听某个端口是什么意思
“监听”并不是“接收所有发向该端口的数据”,而是:
进程向操作系统登记:“如果有人把数据送到这个端口,请把它转交给我。”
操作系统随后把目标 IP 和端口匹配的数据包复制到该进程的 socket 缓冲区;进程再调用 read/recv 把数据取走。
不匹配的数据包(目的端口不是 7001,或目的 IP 不是本机任一地址)会被内核直接丢弃,监听进程根本看不见。
- 一次 TCP 连接的典型路径
① 客户端 connect(2) 发出 SYN,目的端口 7001
② 内核看到目的端口 7001 已被 redis-server 的 socket 监听 → 把 SYN 放进该 socket 的未完成连接队列
③ 三次握手完成后,内核新建一个已连接 socket(四元组:客户端IP:端口 ↔ 服务器IP:7001)
④ redis-server 调用 accept(2) 拿到这个“新 socket”,后续读写都在这条连接上进行
⑤ 其他目的端口≠7001 的包,内核不会交给 redis-server
- 监听时可指定的“过滤条件”
- 协议:AF_INET(IPv4)、AF_INET6(IPv6)
- 类型:SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
- 本地地址:
–0.0.0.0:7001表示“本机任意 IPv4 地址”
–127.0.0.1:7001只收环回口数据,外部网卡来的包被丢弃
–192.168.1.10:7001只收该网卡 IP 的数据 - 端口:固定端口或内核随机分配(0)
因此“监听 7001”默认含义是
TCP, IPv4, 本地地址 *:7001——只收“目的端口=7001 且目的 IP=本机任一地址”的 TCP 连接请求。
- 不是“抓包”
抓包(tcpdump/Wireshark)工作在网卡驱动层,可以把所有经过网卡的包复制一份给用户;
监听 socket 工作在传输层入口,只能拿到内核判定属于自己的数据,且不会把原始以太网帧给你,而是已经去掉帧头/IP头/TCP头后的纯负载。
- 一句话总结
“监听 7001”就是告诉操作系统:
“以后凡是目标端口是 7001 并且目标 IP 匹配我的 TCP 包,请把它们放到我的队列里,我会来取。”
其他包内核直接丢弃,监听进程既看不到也收不到。
