网络问题排查实战经典案例汇总( 六 )

alive.onoff = TRUE;alive.keepalivetime = vhost->ka_time*1000;alive.keepaliveinterval = vhost->ka_interval*1000;if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive),, 0, &dwBytesRet, , ))return 1;}/* Disable Nagle */optval = 1;#ifndef _WIN32_WCEtcp_proto = getprotobyname("TCP");if (!tcp_proto) {lwsl_err("getprotobyname failed with error %dn", LWS_ERRNO);return 1;}protonbr = tcp_proto->p_proto;#elseprotonbr = 6;#endifsetsockopt(fd, protonbr, TCP_NODELAY, (const char *)&optval, optlen);/* We are nonblocking... */ioctlsocket(fd, FIONBIO, &optl);return 0;}
所以libwebsockets库的心跳设置 , 使用的还是TCPIP协议栈的心跳 , 不是应用层自己实现的心跳机制 。
关于TCPIP协议栈的三个心跳参数的详细说明如下:
 

(1)keepalivetime:心跳正常时 , 本端发送一个心跳包给对端 , 收到对端心跳包的回应 , 间隔keepalivetime时间后 , 发下一包心跳包 , windows默认的心跳包发送间隔是2小时 。(2)keepaliveinterval:心跳异常时 , 本端发送心跳包后没收到对端的回应 , 间隔keepaliveinterval时间后 , 发送下一个心跳包(继续探测) 。如果多次没有收到对端的回应 , 当探测次数达到上限(keep-alive probes)时 , 则协议栈认为连接出问题 。(3)keep-alive probes:windows系统中  , 心跳包探测次数keep-alive probes是不可改变的 , 协议栈固定为10次 。

7、在复杂网络环境中主从服务器切换时遇到的多个网络异常问题
网络问题排查实战经典案例汇总

文章插图
 
主服务器和从服务器共用一个IP , 当主服务器出问题时 , 切换到从服务器上 , 然后服务器以组播的方式将抢IP的数据包发出去 , 这个数据包始终没有发出来 , 导致抢IP操作失败 。通过排查得知 , 组播数据包会被客户网络环境中的一台华为路由器拦截 , 可能是这台华为路由器有问题 , 但客户要求我们从我们服务器这一侧去修改 , 后来将多播改成单播才解决问题 。
客户的网络设备上配置了很多安全规则 , 其中一个规则是将IP-mac地址绑定 , 如果设备的IP和MAC地址对不上 , 设备发出来的数据包就会被网络设备认为是不安全的数据 , 会直接被拦截 。在从服务器拿到主服务器的IP之后 , IP对应的MAC地址就变了 , 正好就触发了这个IP-MAC绑定规则 , 导致数据包被拦截 。后来的解决办法是将主从服务器公用的IP作为特例进行放行 , 即对这个IP不进行拦截 。
8、Linux系统的TCP/IP协议栈重定向选项被关闭 , 无法响应网关发来的ICMP重定向消息 , 导致收发数据时出现严重的丢包问题
网络问题排查实战经典案例汇总

文章插图
给客户部署的系统中 , 有台设备放置于某个网络节点下 , 给该设备配置了该节点下的默认网关 , 结果联调下来发现 , 所有的其他节点下的其他设备都没问题 , 就这台设备有问题 , 这台设备发出来的数据有严重的丢包问题 。
现场人员和客户一起做了对比测试 , 把客户之前购买的别的厂商的设备放置在该网络节点下 , 别的厂商的设备都没有丢包问题 , 就我们公司的设备有问题 。期间 , 我们给客户调拨了一个我们几年前研发的一款老式设备 , 放置在该节点下也没问题 , 就当前使用的新式设备有问题 。
这个问题折腾的比较久 , 始终没有查出来问题 , 后来找公司的顶级专家来排查 , 才查出来问题 。这台设备发出去的数据 , 默认情况下都要通过其配置的默认网关发出去 , 抓包发现 , 默认网关会给设备发了ICMP重定向消息 , 该消息中携带一个IP地址 , 该消息是用来告诉设备 , 要发送数据都从这个IP发出去 。


推荐阅读