修改IP后TCP socket连接还能继续使用么?
1 背景
最近处理一个CME下发MML命令修改网元IP的问题,最终表现是在网管上修改IP之后,过了大概15分钟网元才使用新IP连接正常。最诡异的问题就是网元修改IP了,还使用老IP和网管之间的TCP连接发数据。
2 问题处理过程
2.1 整个问题处理的时间顺序如下:
这个流程最诡异的流程是第5~7步,老IP已经不不在了,那么TCP连接有没有失效,还能不能发数据?
2.2 过程分析
1. 网管上修改网元IP后,网管使用新IP连接网元,连接过程中下发设置公英制命令“NEG OPT“命令给网元,网元返回失败,导致连接终止。直到15分钟后,网元才返回RETCODE为0。
12-1 0:12:47 modify_ne+2823|31291|31670|OLD IP=100.92.5.25 New IP=100.92.5.26 //修改网元的IP
12-1 0:12:47 set_ne_connect_break+2353|31291|31670|OID=3221287416,state change to break
12-1 0:12:48 set_login_err_code+5406|31291|31645|OID=3221287416 setErrCode Err=855703779
12-1 0:12:48 analyse_ret_mml+986|31291|31645|OID=3221287416 name=RETCODE value=855703779 //网元返回的错误码855703779
12-1 0:12:48 send_ne_status_change+3357|31291|31645|STATUS change medIndex=0 CTLMEDFD=1948 OID=3221287416 linkID=0 status=2 reason=26:855703779 port=6007 want=79 send=79
2. 网元侧分析是由于网管未下发END BATCHFILEESN命令,网元一直处于批命令执行状态,所以“NEG OPT“命令执行才报错。15分钟超时后可以正常处理命令。
3. 分析Med日志,发现只收到过网元上报70%的进度,后面的进度和执行成功的命令网管均未收到。根据之前的机制,CME只会在收到进度100%的时候下发 END BATCHFILEESN命令。由于未收到网元100%进度报文,因此CME也不会下发END 命令。
I044:12-1 00:11:05.173(504|13909)Med.Cm.Bulk: NE=760 ProgressHandler::handlePdu progress: 70
I256:12-1 00:11:05.173(504|8473)timer: task runner:ne=NE=760, id=41295, name=BulkCM_ReportTaskRun_MML
I088:12-1 00:11:05.174(504|13909)MED_SWM: <<SwmCommand-NEProgressHandler>> display the report m_strReportType===激活批命令 m_strNeFDN===NE=760 m_strResponse=== m_strMML===0 m_iProgress===70 m_iStatus===0 m_iSessionID===77613 m_strDetailRsp===
4. 这就引入了开始的问题,网元老IP从网元上删掉后,网管使用新IP连接网元这段时间内。原来网管和网元老IP已经建立的TCP连接还有效么?还能正常进行通信么?由于网管和网元两侧对这种情况的意见有较大的分歧,于是在家里进行了类似的复现。
3 实验室复现
1. 构造了一个客户端和一个服务器程序,客户端(11.1.1.1)模拟网管,服务器端(11.1.1.2)模拟网元。在第13帧和第14帧修改服务器端IP为11.1.1.3。然后通过服务器端给客户端发数据。
2. 从调试信息看,这种情况下,客户端可以正常收到服务器端的报文,并且正常发出了ACK报文,但是从上面的抓包信息看,服务器端一直未收到ACK报文,一直在发重传报文。
小结:修改IP后,老的TCP连接还能正常发出数据,但是无法接受到数据,老IP删掉后, IP地址在网络已经不存在了,从客户端发出来的数据无法到达目标地址,在传输过程中丢弃。
4 结论
网元修改IP地址的流程存在缺陷,IP修改后,之前的TCP socket连接出现类似单工通信的情况,TCP无法正常工作。需要联系两边的SE从根本上修改目前的机制。
- 点赞
- 收藏
- 关注作者
评论(0)