【发布时间】:2011-06-17 16:17:42
【问题描述】:
我开始从互联网上学习 TCP 协议并进行一些实验。看了http://www.diffen.com/difference/TCP_vs_UDP的一篇文章后
“TCP 更可靠,因为它在丢失部分的情况下管理消息确认和重传。因此绝对不会丢失数据。”
那我做实验,我用TCP socket写了一段代码:
while( ! EOF (file))
{
data = read_from(file, 5KB); //read 5KB from file
write(data, socket); //write data to socket to send
}
我认为这很好,因为“TCP 是可靠的”并且它“重新传输丢失的部分”......但它一点也不好。一个小文件还可以,但是当涉及到大约 2MB 时,有时还可以,但并不总是...
现在,我尝试另一个:
while( ! EOF (file))
{
wait_for_ACK();//or sleep 5 seconds
data = read_from(file, 5KB); //read 5KB from file
write(data, socket); //write data to socket to send
}
现在好了……
我能想到的是第一个失败的原因是: 1. 发送端缓冲区溢出,因为发送速率慢于程序的写入速率(发送速率由TCP控制) 2. 可能发送速率大于写入速率,但有些数据包丢失(重传后仍然失败,然后TCP放弃……)
有什么想法吗? 谢谢。
【问题讨论】:
-
嗯,这段代码是用于什么操作系统和编程语言的?
-
@thkala +1,“5KB”真的很吸引我。
-
Linux 上是 C...5KB 就是一个例子。每次我可以从文件中读取 1KB 然后发送,而不是 5KB,然后再发送 1KB,依此类推...
-
C... 在 Linux 上。上次我听说“5KB”不是一个有效的 C/C++/Java 标识符,
write()有三个参数,wait_for_ACK()和read_from()在 POSIX 中不存在。这更像是来自 somewhere 的伪代码。愿意向我们展示您尝试过的实际代码吗? -
起初,我认为我的伪代码并不难理解。但我觉得我错了。对不起。无论如何,下面6502的答案是我需要的。谢谢。