【问题标题】:Data Transfer Protocol Design数据传输协议设计
【发布时间】:2012-12-13 12:49:21
【问题描述】:

我正在编写一个使用 TCP 通过网络传输千兆字节数据的协议,以尝试自学一些关于协议编程的知识。我不确定如何设计这个传输协议,以便以最快和最有效的方式传输数据。

我在 Windows 上使用 Qt。

目前,我的应用协议(传输数据的部分)的设计如下:

  1. 先拍下登录详情。
  2. 写入第一个 4 KB 的数据包(进入套接字),然后等待服务器确认它已收到数据包。
  3. 当服务器确认接收到数据包时(通过写入 int "1"),写入接下来的 4 KB。
  4. 所有数据传输完毕后,将传输数据的md5sum发送到服务器。
  5. 如果服务器再次使用 int 8 进行确认,则数据传输完成。

目前,当传输超过 127.0.0.1 时,我无法在同一台计算机上获得高于 166KB/秒的速度。我一直在尝试阅读其他协议设计,但几乎没有任何关于数据传输协议的文档可以为他们的应用程序编写。

我发布的协议设计是否错误或存在一些严重问题? 协议应该等待每个数据包被服务器确认还是应该连续写?

【问题讨论】:

  • TCP 已经处理了确认 (ACK)、校验和,通常还有负载大小的自适应算法。所以你所做的一切似乎都是多余的。尽管如此,在 localhost 上 166KB/s 似乎非常慢。
  • 所以我应该不断地写入 SOCKET 而不等待服务器发送确认?
  • 当然。 TCP/IP 堆栈将负责发送、确认、重试、排序等。您只需担心来自 socket read/write 调用的返回值。
  • 顺序也会和写的顺序一样吗?例如我按升序写入数据包 1-100,是否会以相同的升序接收数据包? TCP 能保证吗?
  • 是的,TCP 是可靠的流协议。它将保证按顺序交付您的数据。数据的接收顺序与您发送的顺序相同。对 TCP 的理解对你的一生有帮助:en.wikipedia.org/wiki/Transmission_Control_Protocol

标签: c++ qt sockets tcp protocols


【解决方案1】:

首先,我建议花一些时间阅读有关 TCPSliding Window Protocol 的信息。

我认为您的实现如此缓慢有两个原因:首先,您等待每个数据包的确认 - 非常慢,您应该使用滑动窗口。 其次,您使用 MD5 校验和。这没有什么问题,但是 TCP 已经实现了一些基本的校验和,而你使用的 MD5 实现可能会很慢。

最后,找出某些东西为什么运行缓慢的典型方法是使用分析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多