TCP协议?UDP协议?
在开始动手写之前,我们得大致确认一件事,我们选用哪一个协议(这里指大致介绍TCP与UDP协议)。TCP协议,UDP协议在百度上能轻松搜索到解释,如果觉得术语太专业看不懂,没关系。下面打个粗劣的比方。


服务端与客户端之间不同的传输协议,就好比我们选用不同的交通工具,不同的交通工具具有不同的特性。
TCP协议好比轨道交通:(如有不恰当或不正确的地方欢迎指出)


TCP是基于连接的协议,也就是说在正式收发数据前,必须和对方建立可靠的连接,比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。同理,我们要为服务端和每个客户端之间铺设好轨道,才可以开始进行传输。我们可以把每辆列车视为数据包,数据包都是有序地往一端进行输送。TCP是可靠的传输协议,所有的数据包到达一端后,基本都是有序且完整没有遗漏的。
UDP协议好比宽敞的公路:


UDP是面向非连接的协议,不必要与对方先建立起连接就可以进行传输,好比你给别人发短信,输入个手机号码发送就性了,无需经过对方的应答。同理,把每个小车视为数据包,在宽敞的公路上不同的车有快有慢,数据包不一定会按顺序达到另一端,甚至有的小车会停在路中央,不到达另一端,也就是丢包。因此,UDP传输协议是不可靠的(但是UDP是可以保证每个数据包里的数据的完整性,这点跟TCP一样可以放心,您使用的交通工具里的乘客不会中途丢失……)。
说到这里,也许你会觉得TCP多么美好,能够保证质量且有序的传输协议,直接就选它了。然而TCP并不是完美的。TCP传输的最终结果基本上不会丢包,但不代表TCP在传输过程中没有丢包倾向。轨道上运行的列车同样会发生故障而停止在中途,如果是马路上抛锚的汽车,其他的人根本不会关心你,他们可以选择超车继续前进,而轨道交通发生这种现象,后面的列车就无法顺利到达终点端,因为他被前面的故障列车阻塞住了!那么后面的列车不会坐视不管,轨道交通会采用救援连挂的方式将故障列车推进或者牵引到终点,所以最终的结果依然是有序的且保证质量没有遗漏地全部抵达终点。于是这就造成了TCP的一大缺点——慢。
所以在TCP和UDP的选择上,似乎就成了在质量与效率之间的权衡。TCP好!UDP快!如果是回合制,棋牌等一类游戏,玩家在游戏过程中有较长的等待时间,TCP慢点察觉不到太大的问题,玩家可以接受。如果是动作类,即时策略,格斗类,同步性要求非常高的,似乎TCP有些乏力。但UDP的丢包特性,也是我们特别不希望的。
那么,我们可以对UDP进行改良,让它变得可靠,也就是RUDP。假如数据包从服务端送过来没有顺序,我们可以在他们包头加入序列号来进行标序,到达客户端后再在客户端里内部算法进行运算排序。针对丢包,比如我们可以用冗余的手段 (帧同步可以用到,后续可能会讲到),把前一两帧的数据包也发送过来,相当于每次发送多个包,一旦发生丢包,我们有机会可以从重复多余的包里取得数据。
在书写方面,TCP由于有自己一套有序保质的规则(且这个规则是我们无法更改的),用起来会更简便一点
,不需要自己去写序列号和校验丢包。UDP则需要用户自己去定义一套完整的规则,相对麻烦得多。(我还不知道怎么拿gml来写称RUDP,愿有大神们来交流交流)
接下来开始具体用gml来展示具体代码部分。就寝先。