TCP 流控制错误

Posted

技术标签:

【中文标题】TCP 流控制错误【英文标题】:TCP Flow control Error 【发布时间】:2017-02-01 13:43:42 【问题描述】:

我正在尝试实现一个 tcp 堆栈。 我遵循的步骤如下:

    TCP 开启:

    一个。客户端向服务器发送带有初始序列号“C”和确认号“0”的“SYN”。

    b.服务器以 SYN + ACK 响应,序列号为“S”,确认号为“C+1”。

    c。客户端发送 ACK+PSH,序列号为“C+1”,确认号为“S+1”。

    TCP 发送和接收:

    一个。客户端将发送带有 ACK 标志和数据的数据请求 seq 没有​​“C+1”,ack 没有“S+1”

    b.发送方将在段中发送带有 seq no "S+1+data" 的片段,接收方将发送带有 ack no "S+1+data" 的 ACK,直到 FIN 或 RST 被传输。

在我的情况下,在数据传输过程中,我收到的数据包不多,但我可以在 wireshark 上看到它们。

是否有任何机制可以使用序列号和确认号检查乱序数据和数据包丢失并取回数据包

【问题讨论】:

你是自己写低级tcp还是用系统函数写和接收? 它是一个低级 tcp 【参考方案1】:

如果您收到的段的序列号高于预期的下一个序列,则应重新发送最后一个ACK。这告诉发送者一些段丢失了,它应该立即重新传输所有等待确认的段。

更好的解决方案是在RFC 2018 中实施选择性确认选项。这将允许您确认收到的无序段,并且发送方只会重新传输丢失的段。

【讨论】:

如果我发送最后一个 ACK​​,它将从最后一个 ACK​​ 开始发送数据包,还是从头开始发送。 它将从最后一个 ACK​​ 重新发送。 谢谢老哥我试试

以上是关于TCP 流控制错误的主要内容,如果未能解决你的问题,请参考以下文章

网络tcp流控制和拥塞控制

Google 实时流拥塞控制算法GCC

TCP/IP 协议图--传输层中的 TCP 和 UDP

控制流如何处理错误

控制流如何处理错误

限流算法, 以 Golang 方式