Tcp协议 以块的方式发送文件有什么利弊?

baiduan 2008-03-31 02:45:25
RT,都说Tcp是基于流的,我写了个程序(c/s)的
客户端将文件分成数据块发送的,
那位大虾给讲下利弊啊。

阐述最好的大虾敬谢100分,
补充的大虾重新开帖卖血酬谢。

4月3日结帖。谢谢。
...全文
322 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baiduan 2008-04-02
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080402/09/0c21ede3-173c-47d4-ad56-6c287a99de9a.html
baiduan 2008-04-02
  • 打赏
  • 举报
回复
等不了了,今天结帖吧。

觉得fox1999 和cnzdgs 两位大虾
说的都好,请进分贴拿分。谢谢。

其他大虾们有什么见解也请继续
跟贴。4月份我都会关注这贴,
好的见解的话再开分贴吐血酬谢。
谢谢。
ZiSheng 2008-04-01
  • 打赏
  • 举报
回复
[Quote={0}]{1}
你所谓的块是什么意思?是以下三种的哪一种?
1、TCP连接,每次发一个块,全部send完再断开连接。
2、每次连接发一个块就断开。
3、用UDP每次发一个块。
第1种方式比较简单一些;
第2种方式处理麻烦而且效率低,一般不用;
第3种方式需要自己处理包的顺序并检查丢包重发,包要小一些。
[/Quote]
每次连续的send,很可能另一端还没有接受到数据,就会把数据淹没了,建议send一次,recv一次,还有发送和接受的数据的大小,要严格的相等(前提,阻塞模式)
cnzdgs 2008-04-01
  • 打赏
  • 举报
回复
你的问题用TCP和UDP都可以。

TCP协议会重新合并和拆分你多次发出的数据,接收方分多次接受,每次收到的数据长度不定,但数据整体是与发送次序一致的。举个例子,假设你用一个循环发送1MB字节数据,每次发送1K,接收方用1MB的缓冲区用循环接收,可能第1次收到前4K数据,第2次收到接下来的2K,第3次可能又收到接下来的10K……,假设连接中间断开,则收到的数据都是连续的。
UDP协议不会改变你每次发送的数据长度,但不能保证数据一定能到达目的地,而且接收方收到数据的次序可能与发送次序是不一致的。还用上面的例子说明一下,接收方收到的第1个包可能是第2K的数据,而第2次收到第1K数据,第3次收到第4K数据,可能第3K数据一直没有收到……。
使用TCP协议比较简单,一端只管按顺序发送,另一端只管接收,接收到的数据直接写入文件,如果连接中断,下次连接继续从断开处传送数据即可。但由于TCP要保证数据有序,所以经常要花时间等待前面的数据到达后才可以接收,所以效率可能不如UDP高。
使用UDP协议,接收方需要告诉发送方哪个包没有受到,让发送方重发一次。接收方收到的数据要根据附加信息确定数据的位置,调整文件指针后再写入文件。使用UDP协议还需要考虑包的大小问题,因为包越大越容易在传输中途出错,只要出错整个包就会被丢弃,但如果包过小传输效率就会降低,所以需要从中选择一个合适的大小,具体与应用和网络情况有关,可以通过测试来选择最佳大小。
fox1999 2008-04-01
  • 打赏
  • 举报
回复
我认为的方式如上,但是QQ群里的群友,是某个非常著名的大
公司职员,他提出异议,大意是TCP是流的,我的方法更象UDP。
让我重新考虑下传输方式,提高效率。

------------------------------
一般來說是沒有什麼區別的。
而你那個朋友說的,大約是說像 FTP 那樣。在發文件以前,告訴對方文件名與文件長度,然後就直接發文件內容。
這樣的好處是文件內容不用封包組包,在網絡環境好時,速度應該比你現在用的方法更快。

而實際網絡通訊不只是傳文件。可能還有很多別的功能,而傳文件只是基中功能之一。這樣一樣,一般的設計方法是自定義一個協議,而以後所有的通訊都是基於這個協議的。這樣傳文件也做成協議命令之一也是可以的。

你的方法能解決實際問題就不用管他。整個系統的穩定性更重要。

baiduan 2008-04-01
  • 打赏
  • 举报
回复
ft,4月1日了。
我没描述好。
我们这个项目有N个小的数据库子系统和1个主数据库系统,
他们之间的数据交换是通过Internet互相交换数据文件,
一般数据文件很小--10M,大的话会在600M左右(每年盘点)

数据不要求实时,但是要求断点续传和文件完整。


我认为的方式如上,但是QQ群里的群友,是某个非常著名的大
公司职员,他提出异议,大意是TCP是流的,我的方法更象UDP。
让我重新考虑下传输方式,提高效率。

所以想问问Tcp怎么基于流是什么意思?我该怎么修改?
cnzdgs 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 baiduan 的回复:]
1、TCP连接,每次发一个块,全部send完再断开连接。

用的是这种方式,因为要断点,还+了包头。
这种方式有什么缺点啊。。。
[/Quote]这种方式是完全依赖于协议,灵活度较低。如果用UDP会更灵活一些,有可能达到更高一些的传输效率。
lk_cool 2008-03-31
  • 打赏
  • 举报
回复
每次发送的块记下大小,发送过去。在另一端判断一下收到的大小是否合适。也可以加入CRC检验,以确认发送的数据是正确到达对方的。

我觉得你是不是认为TCP是基于流的,而你是分块的有什么不同?
你说的是断点是不是断点续传?

1、你不分块你怎么传?你理解的流是怎样的?你的做法应该就是基于流的。
2、加了包头是不是要多发一些内容啊。
3、断点的话,你可以先看看远程有没有你未传完的文件,将未传完的文件大小发过来,从未传完的地方开始就传输就是了。

做法很多,看应用场合。
你可以把你的应用场景描述一下,一块讨论。
baiduan 2008-03-31
  • 打赏
  • 举报
回复
//定义一个协议,指明是从哪开始发的,发了多少字节
//==================
这就是包头的主要内容
baiduan 2008-03-31
  • 打赏
  • 举报
回复
1、TCP连接,每次发一个块,全部send完再断开连接。

用的是这种方式,因为要断点,还+了包头。
这种方式有什么缺点啊。。。
cnzdgs 2008-03-31
  • 打赏
  • 举报
回复
你所谓的块是什么意思?是以下三种的哪一种?
1、TCP连接,每次发一个块,全部send完再断开连接。
2、每次连接发一个块就断开。
3、用UDP每次发一个块。
第1种方式比较简单一些;
第2种方式处理麻烦而且效率低,一般不用;
第3种方式需要自己处理包的顺序并检查丢包重发,包要小一些。
scq2099yt 2008-03-31
  • 打赏
  • 举报
回复
每种方式都会有利有弊
ouyh12345 2008-03-31
  • 打赏
  • 举报
回复
定义一个协议,指明是从哪开始发的,发了多少字节

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧