标签:常见 实现 原理 并且 socket通信 sql 使用 工作 传递
刚刚开始接触Python,为了怕遗忘,所以写个博文方便自己回顾,也可以和大家分享,有不同意见,大家共同探讨学习。
网络层级
第一篇是对于网络的一些看法和感想,不只是Python
众做周知,在现在的网络时代,最重要的就是网络通信,通信的方式有甚多 ,有Http,TCP,UDP等等,其不同程序语言实现方式也很多,但是底层的通信原理都相差不多。所以就有了一个网络通信的网络层级之分。
一般网络层级分为四层,分别为:应用层,传输层,网络层,链路层。
假如现在A要传递一条数据给B
应用层:决定了A需要传递什么数据给B,并且保证B可以解析这个数据
传输层:决定如何传输数据【UDP 或TCP】(可以理解为快递公司)
网络层:有一个唯一的标识,一般是IP (相当于收件的地理位置坐标)
链路层:具体的传输工具,光纤或者Wifi等等(相当于快递空运或者车运)
这样,你想要发送的数据,就会像快递一样,发送给B啦
对于TCP和UDP的一些想法
对于平常接触和使用来说,TCP肯定是多余UDP太多的,因为其封装的更加的简单方便,易于实现和使用,和朋友谈论,也经常受到他们的的“教导”,除非你正在写一个动作类的游戏,否则,你就用TCP吧,甚至即使在MMO游戏也会推荐你用TCP,毕竟大名鼎鼎的魔兽,就是使用的TCP通信。遗憾的是他们和我的想法总是不能达成一致。
首先说明一下,TCP依旧是我目前工作使用的主流,因为在数据量不大的情况下,TCP是一种安全且常见的选择,尽管如此,当我在尝试克服陌生的恐惧开始接触UDP和TCP底层运行机制以后,才知道。当每次服务器达到峰值,在有时3G或者WiFi的情况下,Ping值上升到1000多毫秒的原因。
先说说TCP的优势:
简单直接的长连接
可靠的信息传输
数据包大小没有限制
但是,任何一个和TCP打过交道的人都知道,要实现一个稳定的TCP网络连接,需要处理各种隐藏的坑,比如断线检测,慢速客户端相应,阻塞数据包,对开放连接的各种DOS共计,阻塞和非阻塞IO模型等等。
当这些能够很好的避开以后,最大的问题就是TCP最糟糕的特性->他对阻塞的控制,一般来说,TCP假定丢包是由于带宽不够造成的,所以发生这种情况,TCP就会减少发包的速度。在3G或者Wifi的情况下,你希望的是立马重新发这个数据包,然而TCP阻塞机制却完全采用了相反的方式来处理,并且没有任何办法能够绕过这个机制,因为他是构建TCP协议的基础,所以,这就是为什么在有时3G或者WiFi的情况下,Ping值上升到1000多毫秒的原因。
为什么不用UDP?
UDP相对于TCP来说,既简单又困难。因为UDP只是使用一个Socket通信,不想TCP一个客户端一个建立一个Socket,TCP一些基本的连接概念,一些包序功能和所谓的连接可靠性,这些UDP都没办法简单的提供给你。这就是人们为什么更加推荐TCP的原因。在用TCP的时候,你虽然不用考虑哪些问题,但是当连接数达到500以上的时候,这个时候TCP会有明显很大的延迟,是的UDP没有提供所有的解决方法,但正如你看到的那样,这也正是UDP好用的地方,从某种意义上说,TCP对UDP就好比是HIbernate和手写SQL的区别。
其实魔兽的Ping值也是达到了1000毫秒以上,他们也只是用了一些延迟处理机制,比如Nagle算法,预测行为,等等,让玩家不易察觉这种延迟。但是当两个玩家碰撞的话,这种预测就显得苍白无力了,这里我也不再过多赘述、
那么到底使用UDP还是TCP呢?
如果你的需求是客户端间歇性的发起无状态的查询,并且偶尔发声延迟是可以容忍的,那么可以使用HTTP/HTTPS
如果你的客户端和服务器丢可以独立发包,但是偶尔发生延迟可以容忍,比如在线的纸牌游戏,那么建议使用TCP长连接
如果客户端和服务器都可以独立发包,并且无法忍受延迟(比如大多数人的多人动作游戏)那么使用UDP吧
更新的话,最好是用HTTP去获取上次更新内容,然后使用UDP跟游戏服务器连接。
标签:常见 实现 原理 并且 socket通信 sql 使用 工作 传递
原文地址:https://www.cnblogs.com/JokerTycoon/p/9880301.html