草庐IT

c# - 如何在高度可靠的批量传输期间减少 TCP ACK 的数量

我有一个应用程序,其中两台计算机距离非常近-通常彼此相距几英尺。我在两台计算机上的应用程序之间建立了TCP连接。服务器在Linux上用C语言编写,Windows上的客户端使用C#和TCPClient。通过这个套接字,我正在传输非常大的有效载荷,一次通常是千兆字节。当我使用Wireshark监控通信时,我注意到传输的数据包中大约有66%是ACK。每个有效负载数据包往往约为5k。所以ACK中的数据百分比非常低,只有一两个百分点。我应该关心ACK的数量吗?我不关心数据包丢失,我希望连接在数据包丢失方面具有高质量。有什么我可以(或应该?)做的来减少ACK的数量吗?

networking - 收到超过 2 个全尺寸段后发送的 ACK 数量是多少?

TCPRFC提到接收方应该为它接收到的每2个全尺寸段发送一个ACK​​(假设它们是有序的)并且不应延迟ACK。考虑到窗口大小是8个段,发送方发送了8个完整的段,这是否意味着接收方发送了4个ACK​​,即使它已经收到8个段?它不能用一个ACK​​确认所有8个段吗? 最佳答案 我将把RFC的重要部分复制粘贴到这里:4.2.3.2WhentoSendanACKSegmentAhostthatisreceivingastreamofTCPdatasegmentscanincreaseefficiencyinboththeInternetan

tcp - 如何让JMeter的BinaryTCPClientImpl接受ACK?

我使用JMeter的BinaryTCPClientImpl发送自定义协议(protocol)的命令。按照设计,此命令不会从接收它的应用程序产生响应,因此返回到JMeter的唯一响应是TCPACK帧。JMeter的TCP采样器不会将ACK视为响应,因此会发生读取超时,然后关闭套接字。根据文档,我尝试将行结束字节值设置为大于128以关闭流结束检查,但读取超时方面没有任何变化。有没有办法让BinaryTCPClientImpl接受TCPACK作为有效响应而无需实现自定义采样器? 最佳答案 实际上,ACK数据包是tcp通信发送阶段的一部分。

sockets - hping 发送 SYN : how not to send RST after receiving SYN/ACK?

使用hping,我发送SYN数据包,第二个对等方正在监听并回复SYN/ACK,但是hping(我猜是linux内核这样做)在收到SYN/ACK后发送RST。无论如何我可以在收到SYN/ACK后停止我的机器发送RST吗?谢谢。 最佳答案 此命令应丢弃任何带有RST的TCP数据包标记设置您的机器将发送到特定目的地:iptables-IOUTPUT1-d-ptcp--tcp-flagsRSTRST-jDROP要还原它,请使用:iptables-DOUTPUT-d-ptcp--tcp-flagsRSTRST-jDROP另一种方法是使用SYN

http - wireshark中数据包的TCP ACK

我注意到在wireshark中我能够将4096字节的数据发送到HTTP网络服务器(通过上传文件),但是服务器似乎一次只能确认1460字节的数据。为什么会这样? 最佳答案 TCP段的大小限于MSS(最大段大小),它基本上是MTU(最大传输单元)减去包含IP和TCP开销的字节。在典型的以太网链路上,MTU为1500字节,基本IP和TCPheader各包含20字节,因此MSS为1460(1500-20-20)。如果您看到数据包的长度字段为4096字节,那么这几乎可以肯定意味着您正在传输主机上进行捕获,并且Wireshark在分段之前将大数

c - socket - close(2) 发送 RST 数据包而不是 FIN 数据包

我写了一个简单的客户端和一个服务器,基本上客户端先连接到服务器,然后用close(2)断开连接,它看起来像:/*settingserveraddressandotherstuff*/...connect();close();调用connect()和close()之间没有其他操作。服务器接受连接并使用epoll(7)监控EPOLLOUT事件。epoll报告EPOLLOUT时,服务器向客户端写入1个字节。nev=epoll_wait(ep,events,10,-1);for(inti=0;i这里是tcpdump,9999是服务器:11:52:11.411988IPlocalhost.377

linux - 状态 FIN_WAIT_1 出现问题

最近我有一些端口保持在FIN_WAIT_1状态,直到两天后。目标端口曾经被一个服务器进程使用,客户端通过此端口连接到服务器进程。情况是我们停止了服务器进程,显然某些客户端在那一刻仍在与服务器连接。据我了解,服务器进程向客户端发送FIN包并等待ACK包返回。不幸的是,那个ACK​​包似乎要在两天后才能到达服务器端。我的问题是有任何配置,比如FIN_WAIT_1状态的超时。我浏览了互联网搜索,但在那里一无所获。如果您对此有任何经验,请帮助告诉我。顺便说一句,当端口发生FIN_WAIT_1时,服务器进程已经消失。提前致谢 最佳答案 FIN

java - 检测服务器端 FIN 数据包

我有以下Java代码:Sockets=newSocket();s.connect(mySockAddr,myTimeout);假设我不使用套接字,我需要在服务器端连接关闭时检测到它(FIN或RST数据包)。例如,虽然检查套接字状态的线程,或拦截FIN/RST数据包...如何检测?我已经尝试使用printWriter.checkError()、socket.isConnected()、socket.isClosed()方法,但没有任何效果。 最佳答案 我知道检测对方是否关闭连接的唯一方法是尝试从输入流中读取。从关闭的套接字读取将返回-

javascript - 试图弄清楚为什么 Firefox 会发送未经请求的 FIN ACK 数据包

我使用OpenLaszlo用DHTML编写了一个应用程序。该应用程序在Chrome中运行良好,但在Firefox中出现问题。javascript客户端向Struts2中间层发出HTTPPOST请求,中间层通过Hibernate查询数据库,然后返回XML响应。该应用程序正在生产中,因此客户端代码、中间层和数据库都托管在我的台式机上。我可以在Chrome和Firefox中并排运行该应用程序,虽然在Chrome中一切正常,但一些HTTP请求(每次都是相同的请求)在Firefox上会失败。失败者会在发起POST请求后立即这样做,没有给出HTTP响应或错误代码(我正在使用Firebug来观察PO

linux - TCP ACK 响应延迟 10ms

我正在编写一个应该从服务器接收文件的客户端应用程序。通信使用基于TCP设计的非常简单的专有协议(protocol):服务器发送一个16KB的数据block,等待来self的客户端的简单响应,然后继续下一个数据block;这样做直到文件被完全传输。服务器在Windows上运行。如果我在Windows上运行我的客户端(通过Cygwin),我可以达到70Mbits/s的吞吐量。但是,如果我在Linux上运行它,我可以获得的最大吞吐量是5Mbits/s(两个测试都使用相同的100Mb以太网链路)。在对我收集的tcpdump跟踪进行一些调查后,我发现Linux大约需要10毫秒来回答每个TCPAC