数据传输协议设计

3
我正在编写一个使用TCP在网络上传输几千兆字节数据的协议,以此来学习一些有关协议编程的知识。但我不确定如何设计这种传输协议,才能以最快、最高效的方式传输数据。
我在Windows平台上使用Qt。
目前,我的应用程序协议(传输数据的部分)的设计如下:
1.首先发送登录信息。 2.写入第一个4KB数据包(进入套接字),等待服务器确认已经收到数据包。 3.当服务器确认接收到数据包(通过写入int“1”)时,再写入下一个4KB数据包。 4.当所有数据都已传输完毕,将传输的数据的md5sum发送给服务器。 5.如果服务器再次确认具备int 8,则完成数据传输。
目前,在本地127.0.0.1上进行传输时,我无法获得超过166KB / sec的速度。我一直在尝试阅读其他协议设计,但几乎没有关于可以为其应用程序编写的数据传输协议的文档资料。
我发布的协议设计是否有问题或存在严重问题?该协议是否应等待服务器确认每个数据包或应连续写入?

3
TCP已经处理了确认(ACK), 校验和,通常还会针对有效负载大小采用自适应算法。因此,你正在做的一切似乎是多余的。尽管如此,在本地主机上166KB/s似乎非常慢。 - Brett Hale
那我应该不断地向 SOCKET 写入数据,而不必等待服务器发送确认吗? - user1066991
1
当然。TCP/IP协议栈会处理发送、确认、重试、排序等操作。你只需要关注套接字读/写调用的返回值即可。 - Brett Hale
订单顺序是否与写入顺序相同?例如,我按升序编写数据包1-100,那么这些数据包将以相同的升序接收吗?TCP 保证了这一点吗? - user1066991
1
是的,TCP 是一种可靠的流协议。它将保证您的数据按顺序传递。数据接收顺序与发送顺序相同。良好的 TCP 理解将有助于您终身受益: http://en.wikipedia.org/wiki/Transmission_Control_Protocol - Ahmad Mushtaq
1个回答

0

首先,我建议花些时间阅读关于TCP滑动窗口协议的内容。

我认为你的实现很慢有两个原因:首先,你等待每个数据包的确认——速度非常慢,你应该使用滑动窗口。 其次,你使用了MD5校验。这没有任何问题,但TCP已经实现了一些基本的校验,并且你使用的MD5实现可能非常慢。

最后,查找某个东西为什么运行得非常慢的典型方法是使用性能分析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接