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


文章插图
而Windows操作系统只允许设置一个默认网关 , 所以只能有一个网卡配置默认网关 , 一般是连接外网的网卡配置默认网关 , 因为外网的IP地址是不固定的 。内网的网卡则不配置网关 , 对于内网的IP地址是相对固定的 , 比如以192.168开头的、以172.16开头的、以10.开头的 。当要访问这些地址时 , 可以通过添加策略路由的方式指定访问这些开头的IP地址从指定的局域网的网关出去 。
只要是有网卡配置了默认网关 , 都会在路由表中添加一条走默认网关的默认路由 , 如下所示:

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

文章插图
通过命令去添加策略路由时 , 也会向系统中添加对应的路由条目 , 添加策略路由的命令如下:
route add 172.16.0.0 mask 255.255.0.0 172.16.125.88(内网的网关)
这条添加路由命令的含义是:所有访问以172.16开头的IP地址 , 都从网关172.16.125.88出去 。
当我们发起对一个IP地址的访问时(也可能通过域名去访问 , 会先将域名解析为IP地址 , 然后用IP地址去访问) , 系统在查找路由时 , 会优先匹配系统的非默认路由 , 即会匹配添加的策略路由 , 当匹配不上时才会去使用默认路由 。
所以 , 访问外网的地址时会走连接外网的网卡出去 , 访问以192.168开头的、以172.16开头的等内网地址时 , 会走策略路由中指定的连接内网的网关出去 。
6、连接线路中的网络设备将客户端与其之间的连接单方面关闭掉 , 导致后续登录服务器时出现异常
在公司局域网的测试环境中 , 客户端自动重连服务器出现问题 。根据打印日志发现 , 客户端和服务器之间的TCP长连接因为网络问题出现断链 , 客户端在收到断链通知后 , 会去自动重连服务器 , 但始终都连接不上 。
根据打印日志看到 , 服务器返回的错误码是用户已登录 。这个就奇怪了 , 明明是客户端收到与服务器的连接断开的通知后去重连的 , 为啥服务器侧还反馈我们的账号还处于登录状态呢?既然连接断了 , 服务器应该也能感知到的 , 账户不太可能还出于连接状态的!
于是使用SSH远程登录到服务器上 , 使用netstat查看服务器当前的TCP连接列表 , 在列表中看到了客户端的IP , 客户端居然和服务器还处于连接状态 。
于是找公司大牛帮忙排查分析一下 , 他查下来怀疑可能是客户端与服务器之间的路由器单方面将路由器与客户端之间的链路给断开了 , 但路由器与服务器之间的链路还保持着 , 还没断开 。该路由器是好多年前购买的老式华为路由器 , 可能是路由器有问题 , 估计是因为客户端与服务器长时间没有数据交互 , 路由器认为客户端与其的链路失去活性了 , 强行将其与客户端之间的链路释放了 。
网络问题排查实战经典案例汇总

文章插图
客户端与服务器之间使用websocket网络库(libwebsockets开源库)进行通信的 , libwebsockets库支持开启心跳机制、设置心跳参数的 。为了解决连接链路上长时间不跑数据导致链路被释放问题 , 在初始化libwebsockets库时 , 设置一下心跳参数就可以了 。
libwebsockets库中设置心跳参数的结构体如下所示:
* struct lws_context_creation_info - parameters to create context with* This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS* is not given, then for backwards compatibility one vhost is created at* context-creation time using the info from this struct.* If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created* at the same time as the context, they are expected to be created afterwards.* @port: VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to* suppress listening on any port, that's what you want if you are* not running a websocket server at all but just using it as a


推荐阅读