tcp连接在断网后能恢复吗?
做项目中遇到一个问题。两台机器上用socket建立一个TCP连接,双向通信,流量很大,这时,通过在路由器上设置100%的丢包率将网络断开,这时 socket当然是发不了包,也收不了,出现大量的重传,然后,取消路由器上的设置,恢复网络,结果,TCP连接client去往server的流量正常了,但server去往client却不通,任凭你如何使劲的send,返回值就是0,而且errno为EAGAIN。
我用tcpdump看了一下此时的包数据(tc2是server,tc1是client):
12:08:21。020291 IP tc1。corp。com。42171 > tc2。corp。co...全部
做项目中遇到一个问题。两台机器上用socket建立一个TCP连接,双向通信,流量很大,这时,通过在路由器上设置100%的丢包率将网络断开,这时 socket当然是发不了包,也收不了,出现大量的重传,然后,取消路由器上的设置,恢复网络,结果,TCP连接client去往server的流量正常了,但server去往client却不通,任凭你如何使劲的send,返回值就是0,而且errno为EAGAIN。
我用tcpdump看了一下此时的包数据(tc2是server,tc1是client):
12:08:21。020291 IP tc1。corp。com。42171 > tc2。corp。com。
3003: S 4009389430:4009389430(0) win 5840
12:08:21。020571 IP tc2。corp。com。3003 > tc1。corp。com。42171: R 0:0(0) ack 4009389431 win 0
12:08:38。
934329 IP tc2。corp。com。3903 > tc1。corp。com。3904: P 2398055392:2398056153(761) ack 2538876742 win 724
12:08:38。
934519 IP tc1。corp。com。3904 > tc2。corp。com。3903: 。 ack 2165 win 13756
12:08:39。958457 IP tc1。corp。
com。3904 > tc2。corp。com。3903: P 1:763(762) ack 2165 win 13756
12:08:39。958485 IP tc2。corp。com。3903 > tc1。
corp。com。3904: 。 ack 763 win 1448
12:08:39。958653 IP tc1。corp。com。3904 > tc2。corp。com。3903: P 763:881(118) ack 2165 win 13756
12:08:39。
958660 IP tc1。corp。com。3904 > tc2。corp。com。3903: P 881:997(116) ack 2165 win 13756
12:08:39。958719 IP tc2。
corp。com。3903 > tc1。corp。com。3904: 。 ack 997 win 1448
12:08:39。958890 IP tc1。corp。com。3904 > tc2。
corp。com。3903: P 997:1114(117) ack 2165 win 13756
12:08:39。958898 IP tc1。corp。com。3904 > tc2。corp。
com。3903: P 1114:1232(118) ack 2165 win 13756
12:08:39。958903 IP tc1。corp。com。3904 > tc2。corp。com。
3903: P 1232:1349(117) ack 2165 win 13756
12:08:39。958971 IP tc2。corp。com。3903 > tc1。corp。com。3904: 。
ack 1349 win 1448
12:08:39。959141 IP tc1。corp。com。3904 > tc2。corp。com。3903: P 1349:1466(117) ack 2165 win 13756
12:08:39。
959149 IP tc1。corp。com。3904 > tc2。corp。com。3903: P 1466:1583(117) ack 2165 win 13756
12:08:39。959154 IP tc1。
corp。com。3904 > tc2。corp。com。3903: P 1583:1700(117) ack 2165 win 13756
12:08:39。959222 IP tc2。corp。
com。3903 > tc1。corp。com。3904: 。 ack 1700 win 1448
tc2不发自己的数据,却只是一味的ACK从tc1传来的数据,等上半个小时,依然如此。它为什么不发呢?
最后发现是因为我们在socket上设了TCP_NODELAY。
去掉这个设置,重启程序,断网恢复以后,TCP双向正常工作。同样用tcpdump看:
16:05:38。782427 IP tc2。corp。alimama。com。3903 > tc1。corp。
alimama。com。3904: P 0:887(887) ack 1 win 26064
16:05:38。782619 IP tc1。corp。alimama。com。3904 > tc2。
corp。alimama。com。3903: 。 ack 3783 win 25352
16:05:38。782634 IP tc2。corp。alimama。com。3903 > tc1。corp。
alimama。com。3904: 。 3783:5231(1448) ack 1 win 26064
16:05:38。782637 IP tc2。corp。alimama。com。3903 > tc1。
corp。alimama。com。3904: 。 5231:6679(1448) ack 1 win 26064
16:05:38。782890 IP tc1。corp。alimama。com。
3904 > tc2。corp。alimama。com。3903: 。 ack 5231 win 25352
16:05:38。782896 IP tc2。corp。alimama。com。3903 > tc1。
corp。alimama。com。3904: 。 6679:8127(1448) ack 1 win 26064
16:05:38。782898 IP tc2。corp。alimama。com。
3903 > tc1。corp。alimama。com。3904: 。 8127:9575(1448) ack 1 win 26064
16:05:38。782901 IP tc1。corp。
alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 6679 win 25352
16:05:38。782904 IP tc2。corp。alimama。
com。3903 > tc1。corp。alimama。com。3904: 。 9575:11023(1448) ack 1 win 26064
16:05:38。783183 IP tc1。
corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 8127 win 25352
16:05:38。783188 IP tc2。corp。
alimama。com。3903 > tc1。corp。alimama。com。3904: 。 11023:12471(1448) ack 1 win 26064
16:05:38。783191 IP tc1。
corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 9575 win 25352
16:05:38。783193 IP tc2。corp。
alimama。com。3903 > tc1。corp。alimama。com。3904: 。 12471:13919(1448) ack 1 win 26064
16:05:38。783196 IP tc1。
corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 11023 win 25352
16:05:38。783199 IP tc2。
corp。alimama。com。3903 > tc1。corp。alimama。com。3904: 。 13919:15367(1448) ack 1 win 26064
16:05:38。
783201 IP tc2。corp。alimama。com。3903 > tc1。corp。alimama。com。3904: 。 15367:16815(1448) ack 1 win 26064
16:05:38。
783502 IP tc1。corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 12471 win 25352
16:05:38。
783506 IP tc2。corp。alimama。com。3903 > tc1。corp。alimama。com。3904: 。 16815:18263(1448) ack 1 win 26064
16:05:38。
783509 IP tc1。corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 13919 win 25352
16:05:38。
783512 IP tc2。corp。alimama。com。3903 > tc1。corp。alimama。com。3904: 。 18263:19711(1448) ack 1 win 26064
16:05:38。
783514 IP tc1。corp。alimama。com。3904 > tc2。corp。alimama。com。3903: 。 ack 15367 win 25352。收起