第一篇:欲练神功,必先自工(先讲讲UDP和TCP的区别 翻译一下C# Network Programming 的章节)

TCP 学名(Transmission Control Protocol)这个水蛇般漫长的名字翻译成中文是:“传输控制协议”。

关于它,我们要记住的最重要的就是它是一个面向连接的协议(Connection-Oriented Protocal.)。一旦在两台通信设备间建立了连接,那在两台设备间么就会产生一个可靠的数据流。因此在这里,我们需要明白的是如果要是用TCP来进行通信的话,比较重要的是你要好好调理两者之间的buffer。

由于TCP在进行数据传输的时候重点是数据的完整性,那么在接收方向传递方发确认信号前,所有的数据都是缓存到本地的buffer里的;同样的,在接收数据的时候,也得有一个buffer来存储这些传递的数据。只有当所有的数据都传输完成后,你才能把数据提交给你的程序来处理。(当然,并非所有的程序都要求这样的策略,也可以边读边处理,这里我们先从最简单的情况说起。)

Click To expand

那么,下面我们讨论一点细节问题,这些细节问题往往是刚接触TCP的人没有意识到的幽灵。在windows里的TCP 子系统(subsystem)是用来处理依赖TCP协议的通信的。那么,在它发送数据给远方的机器时,它会先把数据存储在你的buffer里,然后再尝试通讯于发送,与此同时呢,发送方有可能还会继续往buffer里塞东西,那么当远方的机器确认要收的时候,在buffer里的数据是作为一个整体一起被发送给了远方的机器。这时候,问题就出现了。如上图所示,本来我是两段没关系的数据data1和data2,比如data1是《天龙八部》的前10回,data2 是《神雕侠侣》的后10回;按照常理,接收方应该是分别存放这两段文字,可是由于buffer里没有这样的区分,于是我们就发送了一本我们造的《天龙侠侣》给对方了。

看到这里,你可能要问了,我不能分隔它们吗?当然,你确实可以分隔他们,比如,我们在两本书的数据之间插入一个特殊符号^用来区分,那么我接收的时候仍然可以按照^把它们划分开。

不错,这个办法是很好,但是治标不治本,要知道,我们的动作实际上应该是两次会话,按照上面的方案我们其实就把它折中成一次会话了。在很多情况下,这会带来很多不必要的麻烦。

那么,是否有可能让我们send的数据自己清楚自己应该从哪断呢?TCP实际是做不到这一点的,只有依靠下面的UDP了。

UDP(User Datagram Protocol)这个水蛇般漫长的名字的中文意思是:“用户数据集协议”

它被发明创造出来就是为了给它的老兄TCP解围的。 UDP协议可以根据程序传递的情况来划分数据的边界,但是同时它却不具备了TCP老兄的特性:数据传递的可靠性。这意味着什么?这意味着UDP传输是有可能掉包的。

Click To expand

那么一个解决UPD掉包的办法是有以下的四个步骤的:

1.发送数据给远程机器

2.同时启动一个计时器,它的时限是我们计算出来的某一个时间(比如13秒)

3.等候远程机器的回应,如果有回应则停止计时器,并继续别的步骤

4.如果远程机器在计时器到点之前还没有回应,则重复步骤1,那么上述步骤被重复了几次仍然无应答以后,则可以宣判该次传输失败了。

To be continued.......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值