Winsock - 重传序列增加
Winsock - Retransmission Seq incremented
我在与自定义客户端通信时得到以下信息。
对于自定义客户端,我指的是带有运行三速以太网英特尔 FPGA IP 的 FPGA 的自制 PCB。 PC 和 PCB 之间是否有开关也没有关系。
从服务器(Windows PC)看到的工作流,我用 wireshark 检测到这种行为:
- 连接到客户端(Syn - Syn/Ack - Ack)Winsock2.connect
- 发送数据 > MTU Winsock2.WSASend(4088 字节 MTU 上的 4092 字节)
- 数据包被“分段”为 2 个数据包 - 不分段位已设置
- 发生重传(因为客户端响应太慢?)
我正在使用 delphi 10.4 并使用 Winsock2 函数。在每次发送之前,如果 FD_Isset 设置了 fdwrite,我会检查 select。 Nagle 已停用。
“重传”并不是每次都会发生,当它们发生时我无法检测到任何类型的模式。除了大多数情况下,客户端需要超过 30 毫秒才能发送他的 ACK。
当“重传”发生时,重发的不是数据包 1 或两个,而是数据包 1 的偏移量为 60,这是数据包 2 的有效载荷。数据包 1 的序列号增加 60也。即使数据是正确的,它也正确地增加了 60。
当我发送 6000 字节时,我得到相同的行为,1968 年的递增序列也是正确的。
这里发生了什么?
我可以用 winsock2 检测到这个吗?我可以用 winsock 设置 RTO 吗?为什么序列号递增而不是数据包 1,因为它是重传的?
发送函数的源代码:
function TZWinTCPSock.SendData (out ErrMsg : TAPILogStruct; SendOffset :
Cardinal = 0) : Boolean;
var
WSABuff : WSABUF;
res : Integer;
IPFlags : Cardinal;
t : Cardinal;
WSAErr : Cardinal;
begin
Result := FALSE;
WSAErr := WSAGetLastError;
try
if not CheckSockValid(ErrMsg) then // checks if fd_write is set
begin
exit(false);
end;
try
WSABuff.len := FMem.SendLength; // 4092 at this time Cardinal
WSABuff.buf := @FMem.SendData[SendOffset]; // 8192 Bytes reserved TArray<Byte>
IPFlags := 0;
res := WSASend(FSocket,@WSABuff,1,FMem.sentBytes,IPFlags,nil,nil);
if Res <> SOCKET_ERROR then
begin
if FMem.SendLength <> FMem.SentBytes then
begin
exit(false);
end
else
begin
Result := TRUE;
if WSAGetLastError <> WSAErr then // unexpected WSA error
begin
exit(FALSE);
end;
end;
end
else
begin
FLastWSAErr := WSAGetLastError;
if FLastWSAErr = WSAECONNRESET then
begin
Disconnect(ErrMsg);
exit(false);
end;
end;
except
on E : Exception do
begin
// Some error handling
end;
end;
finally
end;
end;
编辑1
数据包设置了不分段位。
我试图通过 windows 管理中心检测这种“重传”,但我没有看到任何弹出信息。
在 Microsoft Q&A 上得到了答案。
看起来是目标主机出错的尾部丢失探测问题,因为回复时间太长,srtt超时。
我在与自定义客户端通信时得到以下信息。 对于自定义客户端,我指的是带有运行三速以太网英特尔 FPGA IP 的 FPGA 的自制 PCB。 PC 和 PCB 之间是否有开关也没有关系。
从服务器(Windows PC)看到的工作流,我用 wireshark 检测到这种行为:
- 连接到客户端(Syn - Syn/Ack - Ack)Winsock2.connect
- 发送数据 > MTU Winsock2.WSASend(4088 字节 MTU 上的 4092 字节)
- 数据包被“分段”为 2 个数据包 - 不分段位已设置
- 发生重传(因为客户端响应太慢?)
我正在使用 delphi 10.4 并使用 Winsock2 函数。在每次发送之前,如果 FD_Isset 设置了 fdwrite,我会检查 select。 Nagle 已停用。
“重传”并不是每次都会发生,当它们发生时我无法检测到任何类型的模式。除了大多数情况下,客户端需要超过 30 毫秒才能发送他的 ACK。
当“重传”发生时,重发的不是数据包 1 或两个,而是数据包 1 的偏移量为 60,这是数据包 2 的有效载荷。数据包 1 的序列号增加 60也。即使数据是正确的,它也正确地增加了 60。 当我发送 6000 字节时,我得到相同的行为,1968 年的递增序列也是正确的。 这里发生了什么? 我可以用 winsock2 检测到这个吗?我可以用 winsock 设置 RTO 吗?为什么序列号递增而不是数据包 1,因为它是重传的?
发送函数的源代码:
function TZWinTCPSock.SendData (out ErrMsg : TAPILogStruct; SendOffset :
Cardinal = 0) : Boolean;
var
WSABuff : WSABUF;
res : Integer;
IPFlags : Cardinal;
t : Cardinal;
WSAErr : Cardinal;
begin
Result := FALSE;
WSAErr := WSAGetLastError;
try
if not CheckSockValid(ErrMsg) then // checks if fd_write is set
begin
exit(false);
end;
try
WSABuff.len := FMem.SendLength; // 4092 at this time Cardinal
WSABuff.buf := @FMem.SendData[SendOffset]; // 8192 Bytes reserved TArray<Byte>
IPFlags := 0;
res := WSASend(FSocket,@WSABuff,1,FMem.sentBytes,IPFlags,nil,nil);
if Res <> SOCKET_ERROR then
begin
if FMem.SendLength <> FMem.SentBytes then
begin
exit(false);
end
else
begin
Result := TRUE;
if WSAGetLastError <> WSAErr then // unexpected WSA error
begin
exit(FALSE);
end;
end;
end
else
begin
FLastWSAErr := WSAGetLastError;
if FLastWSAErr = WSAECONNRESET then
begin
Disconnect(ErrMsg);
exit(false);
end;
end;
except
on E : Exception do
begin
// Some error handling
end;
end;
finally
end;
end;
编辑1
数据包设置了不分段位。
我试图通过 windows 管理中心检测这种“重传”,但我没有看到任何弹出信息。
在 Microsoft Q&A 上得到了答案。 看起来是目标主机出错的尾部丢失探测问题,因为回复时间太长,srtt超时。