URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 39 » 无差错的传输,到底用tcp还是udp?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
无差错的传输,到底用tcp还是udp?
无差错的传输,到底用tcp还是udp? - whone23 [2005-01-24 10:27 | 621 byte(s)]
 
Re: 无差错的传输,到底用tcp还是udp? - hoyt [2005-01-25 08:32 | 134 byte(s)]
 
 
 
 
Re: 无差错的传输,到底用tcp还是udp? - alula [2005-01-25 14:44 | 184 byte(s)]
 
 
 
 
 
 
 
 
 
 
 
Subject: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-24 10:27    Length: 621 byte(s)
[Original] [Print] [Top]
简单的说就是保证传送数据万无一失的过程。

理论上说tcp比较合适了,是一个面对连接的过程。但是我不太清楚一旦将数据包write到协议栈后,如果对方没有收到,我能不能得到没有收到的状况,我如果知道对方没有收到,我会重新发送,一直到成功为止,或者等到网络恢复,再从刚才没有发送的地方开始重发。

还有一个方法就是在udp上用简单的停等协议了,发一个包,等回应或者超时,没有收到回应或者超时就重新发,这样控制起来比较简单,但是效率很低了。

当然我指的都是在传输层(TCP/UDP)来做到了,对于上层是透明的。我没有看过ftp的代码,但是我估计ftp保证文件无差错的传输是借助了在应用层的一些控制。
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: mechgouki    Posted: 2005-01-24 11:24    Length: 114 byte(s)
[Original] [Print] [Top]
当然是TCP了 不要低估TCP的效率! UDP你自己作校验的话 有时候往往效率比tcp还低的说, udp只适合对数据不要求正确的地方
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-24 11:33    Length: 292 byte(s)
[Original] [Print] [Top]
但是我现在还不确信,我是否能知道TCP发送数据包的状态。
比方说:write一个包到了协议栈的缓冲区,这时候网络断了,包就停在协议栈的缓冲区内,没有发出去,而发送包的程序在数据包转到协议栈的缓冲区的时候就正常返回准备发下一个了。在没有应用层检查的情况下,这个包是不是就没法找回来了?
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: hoyt    Posted: 2005-01-25 08:32    Length: 134 byte(s)
[Original] [Print] [Top]
按照我的理解网络报文没有【万无一失】的情况
一些中间件的做法是你说的“发一个包,等回应或者超时,没有收到回应或者超时就重新发”
----
欢迎访问我的个人网站 www.linuxc.net
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-25 08:38    Length: 197 byte(s)
[Original] [Print] [Top]
如果不作处理当然不可能万无一失。所以要加控制嘛。
tcp协议实现了这些,但是在应用程序中无法准确获得一个包的状态(是否到达目的地),所以正如你说的要自己控制了,停等协议了,复杂点滑动窗口了....
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: zzzz    Posted: 2005-01-25 10:03    Length: 80 byte(s)
[Original] [Print] [Top]
按协议你发送一个包以后,对方会给你回一个包,你收到这个包就代表对方收到你的包了。
----
无论是神界还是凡间,真正主宰一切的是无可逃避的命运
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-25 11:04    Length: 126 byte(s)
[Original] [Print] [Top]
要是回的包丢了怎么办?重发,定时器,滑动窗口,呵呵!

准备用udp加序号,动态计算超时,自己算ckcum,来控制了。
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: dl_dht    Posted: 2005-01-25 12:58    Length: 597 byte(s)
[Original] [Print] [Top]
>> 动态计算超时 ?
那么如果两次测量的RTT差别较大, 你怎么处理 ? TCP 的RTO估计器是比较复杂的. 如果你的超时重传估计过低那么将导致过多的重复分组, 过高使传输效率下降.

如果传输时分组到达顺序不同, 如何处理 ? 如果网络发生拥塞如何处理 ?

我认为如果要可靠传输文件一定要用TCP, 除非使用组播, TCP协议栈会为你作一切, 在实践中, 使用网络的传输文件都是应用TCP, ftp, http, ssh, rsync, wget...

写入协议栈的数据不能发送出去, 只能说明网络有问题, 对方没有接收缓冲区, 这种情况在UDP中也会出现, 而且TCP这时会block在内核, 而使用UDP则不会block.
----
鸡声茅店月, 人迹板桥霜.
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-25 13:59    Length: 585 byte(s)
[Original] [Print] [Top]
unpv1上有个简单的增加udp传输可靠性的例子,就在那个基础上改了。

效率肯定没法和tcp相比,但是现在的要求是要保证每个包都到达目的,没有到达要记住,等着下次从那个位置开始继续发,用udp加一点简单的控制(停等协议),可以做到。

》写入协议栈的数据不能发送出去, 只能说明网络有问题, 对方没有接收缓冲区, 这种情况在UDP中也会出现, 而且TCP这时会block在内核, 而使用UDP则不会block.

block在协议栈的缓冲区中,发送程序没法知道啊,那这个包不是掉了。还有一种情况,发送程序所在计算机的IP变化了,原来建立的连接无效,又要建立新的,在接收程序里比较难办吧。
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: zzzz    Posted: 2005-01-25 14:24    Length: 74 byte(s)
[Original] [Print] [Top]
呵呵,原来你知道啊,我还在奇怪呢,都提到滑动窗口了,我说这些还能不知道吗。
----
无论是神界还是凡间,真正主宰一切的是无可逃避的命运
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: alula    Posted: 2005-01-25 14:44    Length: 184 byte(s)
[Original] [Print] [Top]
"""而发送包的程序在数据包转到协议栈的缓冲区的时候就正常返回准备发下一个了"""

tcp 发送数据是这样的吗?我不确定,但表示怀疑:)
----
三点一面
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-25 20:00    Length: 70 byte(s)
[Original] [Print] [Top]
应该是的吧,send返回的数目是送到协议栈缓冲区中的,进了协议栈,就不管了
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: gxcooo    Posted: 2005-01-26 10:45    Length: 489 byte(s)
[Original] [Print] [Top]
whone23说的是对的

tcp可能会丢失数据,但丢失数据肯定会导致连接出错,最后导致断开,这个程序是可以知道的。

假设我们发送100M给对端,如果我们已经发送到第99M了tcp没有出错,那我们可以确定(98M-tcp内部此socket发送缓存中的有效数据-对方机器上的tcp内部的socket接收缓存中有效数据)对方应用程序已经收到.但实际上我们是无法知道对方的socket在tcp内部的缓存是多大,所以我们也就无法确切知道对方应用程序收到了多少数据,只能估计个大概

而udp是不可以这样的
----
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: whone23    Posted: 2005-01-26 11:16    Length: 176 byte(s)
[Original] [Print] [Top]
其实ftp实现的挺好的,把ftp那一套实现代码搬来传输的那部分,估计也可以,而且效率高。

udp要提高效率实际上也是要实现那些滑动窗口啊,动态调整rto等等,也很麻烦的。
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: alula    Posted: 2005-01-26 15:58    Length: 57 byte(s)
[Original] [Print] [Top]
看来,唯有读linux内核源码可以帮助确定这些问题。
----
三点一面
[Original] [Print] [Top]
Subject: Re: 无差错的传输,到底用tcp还是udp?
Author: suowei1979    Posted: 2005-01-26 17:59    Length: 69 byte(s)
[Original] [Print] [Top]
无差错只是相对的
没有绝对的
tcp
还犹豫什么
----
hacker & hacking
http://vip.5d.cn/flashsj
[Original] [Print] [Top]
« Previous thread
用户态下“资源”的读写保护?
C/C++编程版
39
Next thread »
那位知道sql的select 语句一般用的什么算法?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:53:12, cost 0.048198938369751 ms.