SOCKET : TCP和UDP区别的体现??

okmnji79513 2009-04-20 04:15:58
TCP的可靠性,UDP的不可靠性,体现在哪里?
看 孙鑫VC++深入详解 TCP和UDP聊天程序,在聊天双方有一边断开时,我能感觉到“TCP的可靠性,UDP的不可靠性”;那如果聊天双方都未断开,双方发送的某数据在传输过程中丢了,我感受不到“TCP的可靠性,UDP的不可靠性”,因为在他的TCP代码中connect、accept之后就开始传数据了,也没有检测数据是否到达对方的代码,不是跟UDP一样?是因为TCP协议帮他做了吗?还有connect+accept我能感受到是面向连接的,那么用了connect+accept就算是用了TCP协议?是否可以这样理解:只要用了connect+accept就是TCP通信了?


我看了篇网文:“TCP和UDP传输的深入浅析,MSN和QQ文件传输速度解析”。其中有段话:
“2. 但是即使上面的条件不成立,msn还是一般比QQ慢的。问题还是在出在前面提到的验证数据可靠性上面,TCP是可靠的,。UDP是不可靠的,但是用UDP做传输文件这档子事情,肯定要在应用层写一个验证的协议,否则传过来的文件缺胳膊少腿,会被用户骂死的。说是协议,其实也不难,打个比方吧:

long long ago,贾宝玉在北京,林黛玉在长沙,怎么互诉衷肠呢,派家丁送信!路途遥远,怎么知道信收到没有?打电话问?那时候发明了这个就不用送信了,只能看家丁是否带了回信来了。假如发现一个家丁一个月还没有回,那就多半迷路堵车遭遇山贼或者开小差到扬州花差快活去了,再派一个人送吧! TCP就是这么做的,UDP在应用层协议一般也需要这么做,但是实现上有时候往往有区别。

上面提到了 验证 数据包是否送到 的事情。TCP有验证的功能,UDP没有。
问题一、TCP的验证功能,是需要程序员自己写?还是不用写(connect、accept之后尽管传,不用考虑别的,TCP协议自带验证)?
问题二、UDP的验证怎么写? 是:1、发第1个包--->等回应,等到回应--->发第2个包,等不到回应--->再发第1个包..... 还是:2、连续发包,在发包过程中或是发完后,有接到回应,再看哪个包的回应没得到,就重发那个包。 应采取上面1、2那种方式?那等待回应时间是多大呢?
...全文
7276 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
SurgePing 2012-03-26
  • 打赏
  • 举报
回复
+1
[Quote=引用 2 楼 really3353 的回复:]

楼主,我来试着回答一下你的问题:
(1)作为一个传输层的协议,TCP/IP 协议在系统中是封装好了的,不需要自己来实现它的功能。对于TCP和UDP的使用,我们尽管使用系统留给我们的接口即可,所以对于TCP来说,它提供可靠的连接,有自动重传的功能,我们不必自己来写。
(2)UDP协议虽然提供不可靠的连接,但是它的效率是TCP比不了的,所以在那些对可靠性要求不是很高的应用来说,UDP是个好的选择……
[/Quote]
gaozhlzh 2011-09-20
  • 打赏
  • 举报
回复
受教 mark下
ass150647 2011-09-20
  • 打赏
  • 举报
回复
很有用,学习了!
laser217 2011-08-08
  • 打赏
  • 举报
回复
受教了
hudaoshaguo 2011-07-08
  • 打赏
  • 举报
回复
受教了
小谁家老谁 2010-12-28
  • 打赏
  • 举报
回复
很好的贴,学习收藏了
如水游情 2010-11-24
  • 打赏
  • 举报
回复
想下载一个文件,结果没积分。悲剧,小悲剧啊!
lijianbin9 2010-11-24
  • 打赏
  • 举报
回复
学习了!!
dongbangws 2010-07-20
  • 打赏
  • 举报
回复
socket 和tcp udp是一个网络层的吗?tcp连接用Socket 传输文件??
arther1988 2010-02-27
  • 打赏
  • 举报
回复
来学习下~~~~~~~~~
gaogaf 2009-12-14
  • 打赏
  • 举报
回复
very good !!!
wenjjing2lianee 2009-10-10
  • 打赏
  • 举报
回复
顶一脚
tian_yang_jian 2009-05-05
  • 打赏
  • 举报
回复
分享一下
love514425 2009-04-30
  • 打赏
  • 举报
回复
> 学习.
scq2099yt 2009-04-28
  • 打赏
  • 举报
回复
问题一:TCP一般不需要自己验证(协议底层保证了)。

问题二:UDP的验证方法有很多,根据实际需要来决定。简单提几种方式:
1、不做验证。对于不重要的数据传输,可以忽略丢包以及无序到达,例如视频、音频的即时播放。
2、对每次发送的数据进行编号,接收方每次收到数据后回发编号,并自己丢弃重复收到的数据,发送方如果在一定时间内没有收到回应则自动重发。这种方式传输速度较低,适用于简单的数据传输。
3、对每次发送的数据进行编号,由接收方来检查丢包情况,在适当的时候要求发送方重发前一段时间内丢失的数据。这种方式适用于大规模数据传输。
dong364 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cnzdgs 的回复:]
问题一:TCP一般不需要自己验证。
问题二:UDP的验证方法有很多,根据实际需要来决定。简单提几种方式:
1、不做验证。对于不重要的数据传输,可以忽略丢包以及无序到达,例如视频、音频的即时播放。
2、对每次发送的数据进行编号,接收方每次收到数据后回发编号,并自己丢弃重复收到的数据,发送方如果在一定时间内没有收到回应则自动重发。这种方式传输速度较低,适用于简单的数据传输。
3、对每次发送的数据进行编号,…
[/Quote]
对于问题二中的第3点,我估计实现起来有点难, 这个适当的时候怎么确定呢?
UDX协议 2009-04-24
  • 打赏
  • 举报
回复
第二种方法好。
blackcat242 2009-04-24
  • 打赏
  • 举报
回复
协议的实现机制上,tcp会有对应的机制保证传输的正确性,但是udp只是发送,没有重传等机制
okmnji79513 2009-04-24
  • 打赏
  • 举报
回复
顶一下

还有人补充么?
danscort2000 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 okmnji79513 的回复:]
引用 3 楼 danscort2000 的回复:
UDP做可靠传输,就需要执行类似TCP的确认机制,但是什么时候重新传递确实是个问题,因为有些网络上延迟很厉害,有些确很低,我自己实现了一个TUDP协议,确认重新传递的时间间隔是动态调整的,默认是 80 MS-》根据第一个反馈包的时间差,加上容余量20左右,重发,如果第一次确认时间很长,那么下次就自动调整重发时间往长的方向,最多不超过3秒 ,因为我测试网络延迟一般高的普遍在1XXX-2XXX之间,…
[/Quote]

你自己的协议机制可以保证这个不会出错
只确认一次,加个序列号就可以了
可以参考TCP实现
加载更多回复(10)

18,356

社区成员

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

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