首页 > 代码库 > TCP与UDP的侵略性

TCP与UDP的侵略性

HTTP必须运行在TCP上吗?
SSL必须运行在TCP上吗?
...
实际上HTTP并没有规定一定要运行在TCP上,甚至FTP也不一定要运行在TCP上!HTTP或者FTP只是说底层信道要保证数据的按序传输以及可靠到达而已,由于传输层除了TCP之外没有别的著名的协议可以满足这个需求,所以大多数的应用都选择了TCP,但是你要知道,这并不是强制的。
       SSL基于这个思想上打开了第一个洞,从而出现了DTLS。SSL/TLS和HTTP一样,也是需要一个可靠的连接,但是它却没有使用TCP,同样OpenVPN的SSL握手更进一步,虽然SSL需要一个可靠的传输层信道,但是OpenVPN可以既不使用TCP,也不使用DTLS,而只是自己实现了一个基于UDP的轻量级可靠层,事实证明,这是很不错的。
       最近看了一本书,《枪炮,病菌与钢铁》,里面谈到了一种抢先性,即一种动植物或者技术在某地驯化或者进化之后迅速传播到其它地区,就会阻滞该地区的自主进化进程,该地区会首选传播而来的现成的东西,最终后来者居上,因为它只是拿来,省去了孵化成本。TCP的侵略性也表现在此。难道你没有问过自己,为何几十年来,基于流的著名传输层协议只有TCP一种,然而当初BSD套接字并不是这么想的,否则它就直接把socket的第二个参数定义成TCP而不是随stream了,第三个参数也不需要了...注意,我这里只是针对INET套接字而言,对于别的套接字类型,还是需要三个参数的。对于INET而言,数据报类型的就是UDP,流类型的就是TCP,著名的协议几乎没有别的了,就算有也可以通过ioctl来设置..请恕我的无知,竟然不知道socket参数的意义!
       TCP展示的就是这种抢先性,已经有了TCP了,何必再造出其它协议呢?虽然它有点重,但还是可以用的。造成这个TCP一家独霸的局面的理由,还有技术的成熟早于标准化这一理由。对于UDP的侵略性,主要体现在带宽占用上,UDP只是在IP上增加了一个应用层多路复用机制,既然IP是抢占的,UDP也是,因为它们都没有端到端的流量控制机制。虽然UDP在状态防火墙或者状态NAT上会有问题,但是问题并不在于UDP,而是在于防火墙和NAT设备为UDP强加了一个状态,UDP本身就是无状态的嘛,另外,防火墙技术或者NAT技术本身就是错误的技术,端到端安全以及VPN才是正解,否则现在全世界就全都布满了带有城墙的城市或者城堡碉堡之类的工事了。?