使用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 转发规则,可以告诉我目标端口或访问方式,我可以给出具体的命令或设置指导。

相关推荐
fulangxisikexi1 小时前
bgp笔记
服务器·网络·笔记
星哥说事2 小时前
腾讯云iOA:全面提升企业办公安全与效率的智能解决方案
网络·安全·腾讯云
武晓兵2 小时前
Ethernet, WiFi, Cellular, BLE, LoRa 分别解释
网络
哈基米喜欢哈哈哈3 小时前
Cookies和Sessions
网络·后端·计算机网络
wanhengidc4 小时前
云手机网速和本机网速的关系
网络·智能手机
猫头虎6 小时前
如何实现在多跳UDP传输场景,保证单文件和多文件完整传输的成功率?
java·开发语言·网络·python·网络协议·golang·udp
期待未来的男孩6 小时前
Cisco IOS Classic Firewall
网络·安全
丰锋ff7 小时前
计算机网络摘星题库800题笔记 第4章 网络层
网络·笔记·计算机网络
weixin_446260858 小时前
使用 NetBird 创建安全的私有网络,简化远程连接!
网络·安全
岚天start11 小时前
iptables -L 显示无目标链规则,但是iptables-save显示仍存在链规则原因分析
linux·服务器·网络·iptables·nat·filter·mangle