linux – 为什么套接字连接被阻止,TCP内核保留重传[ACK]数据包
我们面临的问题是,从一段时间后,特定的套接字连接被阻止,客户端的tcp内核不断重传[ACK]数据包.
拓扑流程如下: Client A ←→ Switch A ← Router A:NAT ← .. Internet .. → Router B:NAT → Switch B ←→ Server B 以下是WireShark捕获的数据包: 1. 8013 > 6757 [PSH,ACK] Seq=56 Ack=132 Win=5840 Len=55 2. 6757 > 8013 [ACK] Seq=132 Ack=111 Win=65425 Len=0 B)客户 //lines 3 and 4 are exactly the same as line 1 and 2 3. 8013 > 13000 [PSH,ACK] Seq=56 Ack=132 Win=5840 Len=55 4. 13000 > 8013 [ACK] Seq=132 Ack=111 Win=65425 Len=0 5. 13000 > 8013 [PSH,ACK] Seq=132 Ack=111 Win=65425 Len=17 [TCP Retransmission] 6. 13000 > 8013 [PSH,ACK] Seq=132 Ack=111 Win=65425 Len=17 8013是服务器端口,6757是客户端NAT端口. 为什么TCP内核继续传输[ACK]数据包 在数据包6之后,连接丢失,我们无法发送任何内容 psuedocode: //client serverAddr.port =htons(8013) ; serverAddr.ip = inet_addr(publicIPB); connect(fdA,serverAddr,...); //server listenfd = socket(,SO_STREAM,); localAddr.port = htons(8013); localAddr.ip = inet_addr(INADDR_ANY); bind(localAddr...) listen(listenfd,100); ... //using select model select(fdSet,NULL,NULL); for(...) { if (FD_ISSET(listenfd)) { ... } ... } UPDATE >鉴于三台计算机是PC1,PC2和PC3. 表示与Server对应的套接字号 表示与Server对应的套接字号 从服务器端,它更新其会话时 4.1.在步骤3之后大约30秒,我们发现了U1 IS 4.2.在步骤3中,如果服务器不调用close(U1-OldSocketFd) UP2.路由器B在端口8013上使用端口转发. net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 解决方法
数据包1(相同于3)和2(相同于4)经过后,您的客户端似乎正在向服务器传输17个字节的数据(数据包5).我不知道在第一次交换数据包之后数据包5有多少,所以我不知道这发生了多少时间.您的伪代码不会澄清它,因为它只显示套接字初始化,它没有显示哪一方尝试在什么时间传输什么数据.在此实例中,ladder diagram可能有助于表示协议交换.
在任何情况下,服务器显然不会确认17字节的数据,因此它们会再次传输(数据包6). 除非您在网络或防火墙或NAT路由器或其他丢弃数据包时出现问题,否则服务器无法接收TCP交换机的早期部分,但显然无法接收数据包5或6再次,在先前的数据交换和数据包5之间是否经过了大量的时间(例如,NAT路由器,防火墙或负载均衡器有足够的时间使连接失效)? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |