TCP 学名(Transmission Control Protocol)这个水蛇般漫长的名字翻译成中文是:“传输控制协议”。
关于它,我们要记住的最重要的就是它是一个面向连接的协议(Connection-Oriented Protocal.)。一旦在两台通信设备间建立了连接,那在两台设备间么就会产生一个可靠的数据流。因此在这里,我们需要明白的是如果要是用TCP来进行通信的话,比较重要的是你要好好调理两者之间的buffer。
由于TCP在进行数据传输的时候重点是数据的完整性,那么在接收方向传递方发确认信号前,所有的数据都是缓存到本地的buffer里的;同样的,在接收数据的时候,也得有一个buffer来存储这些传递的数据。只有当所有的数据都传输完成后,你才能把数据提交给你的程序来处理。(当然,并非所有的程序都要求这样的策略,也可以边读边处理,这里我们先从最简单的情况说起。)
那么,下面我们讨论一点细节问题,这些细节问题往往是刚接触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传输是有可能掉包的。
那么一个解决UPD掉包的办法是有以下的四个步骤的:
1.发送数据给远程机器
2.同时启动一个计时器,它的时限是我们计算出来的某一个时间(比如13秒)
3.等候远程机器的回应,如果有回应则停止计时器,并继续别的步骤
4.如果远程机器在计时器到点之前还没有回应,则重复步骤1,那么上述步骤被重复了几次仍然无应答以后,则可以宣判该次传输失败了。
To be continued.......