使用QT做网络调试助手心得

TCP协议在局域网中一般没什么问题

客户端使用

cpp 复制代码
client->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());

连接服务端

客户端的IP地址确定方式取决于网络环境和应用场景,以下是关键要点总结:

1. ‌操作系统自动分配

  • 默认行为‌:客户端发起连接时,操作系统会根据本地网络配置自动选择源IP地址,无需手动指定
  • 路由决策‌:系统基于目标服务器IP的路由表选择对应出口网卡,自动绑定该网卡IP为源地址

客户端在多网卡时它会自动选择合适的源IP

但是UDP就不一样了,如果你UDP这样子分配源IP

cpp 复制代码
udpSocket->bind(QHostAddress(QHostAddress::Any),0);  // 0表示自动分配端口

它会随机在众多网卡IP中给你分配一个,如果刚好分配到的这个IP地址与目的IP不在一个网络下,那就不能进行通信了。

默认不会,Windows本身不是一个正常的路由器 ,即使开启了Internet Connection Sharing(ICS)或NAT,它默认也不处理来自WAN发向LAN的"本地目标"的流量,除非配置端口映射(NAT规则())。

(可以自行通过网络结构来判断)

例子:

根据你提供的网络信息,我们分析一下:


网络结构概述:

  • Linux设备:

    • IP:192.168.20.66(假设它在192.168.20.0/24子网内)
  • Windows电脑:

    • WAN口 IP:192.168.31.2(连接上级路由器)

    • LAN口 IP:192.168.20.1(给下级网络提供DHCP/NAT服务)

  • Linux和Windows之间的连接:

    • Linux通过连接到 Windows 的 LAN 网段(192.168.20.0/24)通信。

你的问题是:

Windows发送一个数据包,源地址是192.168.31.2目的地址是192.168.20.66,能否送达到Linux?


答案:

不能直接送达到 Linux,除非 Windows 做了特殊路由或NAT配置。


原因分析:

  • Windows 的 源地址是192.168.31.2 ,也就是说这个数据包是从 Windows 的WAN口 发出来的。

  • 目的地址是192.168.20.66,这是在 Windows 的LAN口(192.168.20.1)下面的设备。

  • 正常情况下,Windows 不会把发往 LAN 的流量从 WAN 发出,尤其是当源地址不是 LAN 内地址时。


更具体的问题点:

  1. Linux是否能接收到发往自己的数据包?

    • 是,如果数据包 确实从192.168.20.x网络进入,且目标是192.168.20.66。

    • 否,如果数据包从 上级网络192.168.31.0/24 发出,Linux 设备(在192.168.20.0/24)不会收到它 ,除非中间网关(即Windows电脑)做了 DNAT 或路由设置,并且允许这样的"回流"。

  2. Windows是否会转发192.168.31.2 → 192.168.20.66的数据包?

    • 默认不会,Windows本身不是一个正常的路由器 ,即使开启了Internet Connection Sharing(ICS)或NAT,它默认也不处理来自WAN发向LAN的"本地目标"的流量,除非配置端口映射(NAT规则)。它看到不是自己网段的就直接丢到wan口(即电脑网口里)了,不像路由器还可以转发到下级,除非你特别做映射。

      默认情况是单向 NAT 映射:
    • Linux 向外访问(例如 ping 192.168.31.5):

      • Windows 做 SNAT(源地址转换),将 Linux 发出的包源地址改为 192.168.31.2;

      • 对端设备会把响应包发回给 192.168.31.2;

      • Windows 根据 NAT 表转发给 Linux;

      • 通信成功,单向是通的。

    • 反过来,如果外部(192.168.31.x)主动访问 Linux 的 IP(192.168.20.66)

      • ❌ 默认是不通的!因为 Windows 没有为这个目标做 DNAT(目标地址转换)或端口映射。

      • NAT网关(Windows)并不知道要把这个流量转发给 LAN 中的哪个主机。


解决办法(如果你想让Linux接收到来自Windows WAN口的数据):

✅ 方案1:在Windows上做NAT/端口转发(推荐)
  • 在 Windows 上配置如下规则(假设你要访问Linux的SSH服务):

    复制代码
    netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.31.2 connectport=22 connectaddress=192.168.20.66
  • 这样,在访问 192.168.31.2:2222 时,Windows会把请求转发到 192.168.20.66:22

✅ 方案2:从上级路由器转发数据到Windows的LAN设备
  • 如果数据包原本在 192.168.31.0/24 发出,需要中间的 Windows 做桥接或设置静态路由才能让其送达 Linux。

✅ 总结:

情况 能否送达? 备注
Windows从LAN口发送(源地址192.168.20.1) ✅ 能 Linux和Windows同网段
Windows从WAN口(源地址192.168.31.2)发往Linux LAN网段 ❌ 默认不能 除非做了端口映射/NAT
配置端口转发后从192.168.31.2发往Linux ✅ 能 Windows做转发代理

如你想实现某个特定服务访问或配置具体 NAT 转发规则,可以告诉我目标端口或访问方式,我可以给出具体的命令或设置指导。

相关推荐
好多渔鱼好多3 分钟前
【流媒体协议】RTSP / RTP / RTCP 协议全景介绍
网络·网络协议·rtp·rtsp·rtcp·ipc摄像头
映秀小子24 分钟前
Wireshark加减显示列
网络·测试工具·wireshark
捷米研发三部34 分钟前
EtherNet/IP转CAN协议转换网关实现罗克韦尔 PLC与压力传感器通讯在轮胎压力监测系统的应用案例
服务器·网络
飞睿科技42 分钟前
UWB技术在机器人领域的创新应用与前景
网络·人工智能·机器人·定位技术·uwb技术
石像鬼₧魂石1 小时前
80 端口(Web 服务)渗透测试完整总结(含踩坑 + 绕过 + 实战流程)
linux·运维·服务器·前端·网络·阿里云
MrTung.1 小时前
ensp VARP
网络
Boyle. Z1 小时前
校园网环境中iKuai 二级路由联网与 DNS 优化指南
网络·智能路由器
五仁火烧2 小时前
HTTP 服务器
服务器·网络·网络协议·http
sww_10262 小时前
TCP协议
服务器·网络·tcp/ip
SamtecChina20232 小时前
Electronica现场演示 | 严苛环境下的56G互连
大数据·网络·人工智能·算法·计算机外设