Networking 没有来自已建立TCP连接的确认

Networking 没有来自已建立TCP连接的确认,networking,tcp,Networking,Tcp,此问题已发布在StackExchange-NetworkEngineering上。人们建议我把它贴在这里。这是我原来的帖子 我正在尝试编写一个启动TCP连接并发送一些数据的客户端。在服务器端,我使用侦听某个端口的nc。现在我可以完成三方握手了netstats显示已建立连接。然而,在我的客户机开始发送数据之后,它永远不会得到ACK 客户机是在DPDK之上实现的,因此绕过了内核堆栈。服务器绑定到不同的NIC。这两个NIC直接连接。TCP部分由我自己的代码处理。由于缺乏知识,实现大大简化,因为我将许多

此问题已发布在StackExchange-NetworkEngineering上。人们建议我把它贴在这里。这是我原来的帖子

我正在尝试编写一个启动TCP连接并发送一些数据的客户端。在服务器端,我使用侦听某个端口的
nc
。现在我可以完成三方握手了
netstats
显示已建立连接。然而,在我的客户机开始发送数据之后,它永远不会得到ACK

客户机是在DPDK之上实现的,因此绕过了内核堆栈。服务器绑定到不同的NIC。这两个NIC直接连接。TCP部分由我自己的代码处理。由于缺乏知识,实现大大简化,因为我将许多字段设置为一些固定的数字,例如窗口大小

作为一名网络新手,我不知道会出什么问题,因此不确定应该提供哪些信息来帮助您确定问题。以下是
wireshark
的屏幕截图。我的客户端在
192.168.0.10:12345
上,我的服务器在
192.168.0.42:3456
上侦听。在数据包6之后,没有从服务器端发送ACK

另外,FCS不正确的原因是我必须将零填充到SYN和第一个ACK数据包,以便它们至少为64字节,这是客户端NIC的要求

我对来自我的客户机的数据包和来自
nc
客户机的数据包进行了比较。似乎对于第一个数据包,唯一真正的区别是我的没有任何TCP选项,而
nc
一个带有时间戳。这可能是问题所在吗


如果您发现任何可能导致此“无确认”问题的原因,请告诉我。

我不确定您在哪里期待确认。在正常的TCP握手之后,不会发送任何具有实际有效负载的数据包(所有数据包上的Len=0),因此没有需要确认的内容。奇怪的是,客户端正在从服务器发送一些关于9字节数据的ACK,而来自服务器的数据没有显示在数据包捕获中。嗨,Steffen,谢谢你的回复。在3路握手之后,我的客户机试图发送两个数据包(图中为6和7),每个数据包都有8字节的有效负载。我希望从服务器上看到一些ACK,但显然没有发生。对于这两个数据包,我设置了PSH标志,希望数据将被传递到
nc
服务器,而不是缓冲在某个地方。另外,对于这两个数据包,设置了ACK标志,因为我知道SYN之后的每个数据包都应该设置ACK标志。你是对的。我一定是有点瞎了,把
Len=8
看作
Len=0
。使用
Len=8
时,Wireshark的摘要实际上看起来不错,因此错误可能在未显示的数据包细节中的某个地方。您是否检查了数据包是否确实到达了收件人端,否则将不会生成ACK。@SteffenUllrich,屏幕截图来自服务器(即收件人)端。我认为数据包确实到达了服务器。我的猜测是,我的数据包细节可能有问题,导致PSH-ACK数据包被TCP层丢弃。但我不确定如何识别此类问题。“…我的数据包详细信息可能有问题……但我不确定如何识别此类问题。”-一个好的开始是实际查看数据包详细信息。现在只显示数据包的摘要。例如,提供完整的数据包捕获(例如在cloudshark.org上)是获得更多帮助的好主意。