ESFramework 经验分享 -- 故障排查:服务器端口telnet失败
telnet命令的主要作用是与目标端口进行TCP连接(即完成TCP三次握手)。
当服务端启动后,但是telnet其监听的端口,却失败了。或者,当服务端运行了一段时间后,突然其监听的端口telnet不通了。当类似这样的telnet失败的情况出现时,都可以按照如下方面进行排查:
1.观察一下服务端进程的CPU和内存是否有异常。
比如,当CPU持续在100%时,就有可能导致来自客户端的TCP连接请求被丢弃或无暇处理。
2.端口监听器是否运行正常?
可以通过IRapidServerEngine的Advanced属性的GetPortListenerState方法来获取端口监听器的状态,该方法返回一个PortListenerState对象,其包含5个属性:
(1)IsAuthorized:服务端实例是否被授权。
(2)IsMaxConnection:是否达到了最大连接数的限制。比如,某些授权的服务端实例只允许最多100个客户端同时在线。
(3)IsListening:是否正在监听端口。如果未授权,或达到了最大连接数限制,则将会停止监听端口。
(4)LastDetectTime:最后一次检测TCP连接队列(已完成OS底层的三次握手,但尚未被ESFramework提取的TCP连接存放于该队列中)的时间。
(5)PendingInQueue :队列中是否有待提取的TCP连接。(即 TcpListener 的 Pending()方法的返回值)
----------------------------------------------------------------------------------------------------------------
如果上述两点都正常,则接下来,需要专业的运维人员或网管人当员参与进来协助排查。
3.在当前服务器上执行telnet命令,看能否连接成功?
如果能连接成功,至少表明本机的TCP握手请求是能正常地被接收和处理的。
4.在服务器上执行netstat命令
netstat是一个非常有用的查看端口状态的命令,执行netstat命令后,请注意查看以下信息:
(1)目标端口是否处于监听状态?
(2)目标端口上是否存在已成功建立的TCP连接(ESTABLISHED)?其数量是多少?
(3)是否存在半开连接(SYN_RECV)?其数量是多少?
(4)是否存在等待关闭的连接(TIME_WAIT)?其数量是多少?
这里,最有可能的原因是半开连接数达到最大限制,导致windows系统丢弃后续的TCP连接请求。 要查看或修改半开连接数限制,请查看本文最后的附录说明。
5.TCP三次握手是否正常?
对于一些奇怪现象的跟踪与分析,数据抓包工具是不可缺少的。
在服务器上将抓包工具(如Sniffer)运行起来,然后在其他的电脑上telnet该服务器的目标端口,通过抓包工具观察目标端口上TCP三次握手的过程是否正常:
(1)目标端口是否收到了来自客户端的SYN请求?
(2)目标端口有回复SYN_ACK给客户端?
(3)目标端口有收到来自客户端的第三次握手?
只有当TCP三次握手顺利完成后,windows底层才会将建立好的TCP连接放入队列中,提交给上层的应用程序。
6. 技术顾问服务
如果通过以上步骤的排查,还是找不到问题所在,那我们可以为您提供技术顾问性质的有偿服务,该服务将针对您项目的实际情况(我们会深入了解服务器部署的网络拓扑结构、防火墙、路由器的规则设定、网路安全监控软硬件等相关的详细信息),提供专业的更具针对性的排查指导和解决方案。
附:如何查看与修改半开连接数限制值
执行regedit命令,打开注册表,按照顺序依次打开一下选项: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
在窗口右侧选项栏内找到这个EnableConnectionRateLimiting键值。
(1)如果没有此键:表示系统没有半开连接数的限制。
(2)键值为0:也表示系统没有半开连接数的限制。
(3)键值为一个正数:即半开连接数的限制值。可以修改它。
----------------------------------------------------------------------------------------------------------------------------
Q Q:168757008