我的问题发生环境:服务器
1.TCP服务器是虚拟机,IP地址是192.168.8.12。网络
2.TCP客户端是宿主机,IP地址是192.168.8.11。tcp
3.从宿主机(192.168.8.11)上启动Socket,发现无响应。spa
4.从服务器(192.168.8.12)上抓包,发现能抓到来自宿主机(192.168.8.11)的SYN消息。code
5.然而服务器不响应SYN,ACK。blog
排查过程:ip
1、去网上找了找,可能的缘由之一就是时间戳的问题。路由
1 当客户端发出的syn包带有时间戳的状况下,通过NAT转换后,若是使用的端口被以前使用过,并且时间戳大于本次syn包中的时间戳。系统将会直接丢弃。形成本次连接没法正常完成TCP/IP的3次握手。 2 解决的方法很简单,分为两种: 3 在客户端:关闭rfc1323 4 在服务端:设置sysctl.conf里面tcp_timestamps=0也能够只用命令sysctl -w net.ipv4.tcp_timestamps=0
尝试了一下,在个人环境里解决不了问题。开发
2、找不到其余的缘由了,因为以前个人客户端是可以成功链接服务器的。字符串
我用了一个最直接的方法,从新写了一个只链接的简单的TCP客户端连接例子。
奇怪的事情发生了,这个DEMO能连接成功!
3、步骤二是个好消息,我能够抓包对比了。
失望:全部的TCP设置参数都是同样的。
继续分析包的上层内容。
起色:网络层的MAC地址不同!
4、问题初步缘由找到了。
虚拟机不回复SYN的缘由是这个时候的包的目的地不是虚拟机,虚拟机起了个中转做用。
目的地是哪儿呢?我扫描局域网内的机器,发现是个人网关地址。
5、进一步的缘由?
为何看起来一样的代码,却导向了不一样的网络目的地,涉及网关,那就是跨网段路由了啊?
6、真相只有一个!
1 手动写的Demo,服务器的地址是静态的字符串“192.168.8.12”。 2 出问题的程序,我从配置文件里读取的配置信息,而配置的地址是“192.168.1.12”(两个开发环境的内网网段不同)。 3 简单的总结缘由就是【粗心】。