码迷,mamicode.com
首页 > 编程语言 > 详细

Python小白__网络层级

时间:2018-10-31 01:17:00      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:常见   实现   原理   并且   socket通信   sql   使用   工作   传递   

Python小白__网络分析

         刚刚开始接触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跟游戏服务器连接。

 

Python小白__网络层级

标签:常见   实现   原理   并且   socket通信   sql   使用   工作   传递   

原文地址:https://www.cnblogs.com/JokerTycoon/p/9880301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!