我需要在任何连接上启用TCP keepalive,现在我正在努力处理测试用例的结果.我想这是因为我真的不明白第一次发送keepalive探测器的时间.我tcp_keepalive_time
在Linux 的文档中阅读了以下内容:
发送的最后一个数据包(简单的ACK不被认为是数据)和第一个keepalive探针之间的间隔; 在连接被标记为需要保持连接后,此计数器不再使用
其他一些消息来源表示这是连接空闲的时间,但它们没有进一步定义这意味着什么.我还调查了史蒂文斯找到一个更正式的定义,因为我想知道"最后发送的数据包"在考虑重传时实际意味着什么.
在我的测试用例中,我有一个连接,其中数据仅以相当高的速率从服务器发送到客户端.为了测试keepalive,我们拔掉了客户端网卡上的电缆.我现在可以看到网络堆栈尝试发送数据并进入重传状态,但是没有发送保持活动探测.在重传期间不发送保持活动探测是否正确?
我写了一个简单的源文件,它可以使用 C 中的 libpcap 库读取 pcap 文件。我可以一个一个地解析数据包并分析它们。我希望能够推断出我解析的 TCP 数据包是否是 TCP 重传。在广泛搜索网络后,我得出结论,为此,我需要跟踪流量行为,这意味着还要分析以前收到的数据包。
我真正想要实现的是,在基本层面上,tcp.analysis.retransmission
过滤器在wireshark中所做的事情。
这是一个 MRE,它读取 pcap 文件并分析通过 IPv4 发送的 TCP 数据包。该功能find_retransmissions
是分析数据包的地方。
#include <pcap.h>
#include <stdio.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <net/ethernet.h>
#include <string.h>
void process_packet(u_char *,const struct pcap_pkthdr * , const u_char *);
void find_retransmissions(const u_char * , int );
int main()
{
pcap_t *handle;
char errbuff[PCAP_ERRBUF_SIZE];
handle = pcap_open_offline("smallFlows.pcap", errbuff);
pcap_loop(handle, -1, process_packet, NULL);
}
void process_packet(u_char *args,
const struct pcap_pkthdr * …
Run Code Online (Sandbox Code Playgroud) 为了全局配置最小RTO; 延迟Ack超时; Windows 7及以上版本的拥塞算法等应该使用网络TCP模板.要查看那些可以使用Get-NetTCPSetting powershell cmdlet:
PS C:\Users\Administrator> Get-NetTCPSetting
(...)
SettingName : Datacenter
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal …
Run Code Online (Sandbox Code Playgroud)