1、TCP的特点以及与应用

       TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。TCP建立连接需要经过三次握手,首先,客户端发送一段报文给服务器,表示我要连你,服务器收到报文后马上回复客户端,同意或者不同意你连我,最后客户端再发送一段报文给服务器表示确认要连接,经过这三次握手,客户端才能最终连接上服务器。TCP主要有这几个特点:TCP是面向连接的传输层协议;每个TCP连接只能有两个端点,而且只能是一对一通信,不能一点对多点直接通信;数据以字节流的方式传输;传输的数据无消息边界;TCP通过丢包重传、滑动窗口、数据排序、拥塞控制等机制来保证传输数据的可靠性。
       一般,强联网类型的游戏都使用TCP,当然,有些对实时性要求很高的游戏也会将TCP与UDP配合使用,比如王者荣耀这类MOBA游戏,在实时战斗中会使用可靠UDP协议,来保证游戏数据的高效传输,弱联网类型的一般使用HTTP,HTTP为短链接,它基于TCP协议,当完成一次通讯就会马上断开连接。
 

2、如何维护一个长连接

       在游戏过程中,玩家所处的网络环境是复杂多变的,有时因为糟糕的网络问题,会出现客户端掉线、延迟、丢包等问题,网络状况不好时UDP会丢包严重,TCP虽然是可靠,但也会在ip层丢包,只不过由于TCP的重传机制,能保证数据能传输到远程终端,但也会造成延迟。那么如何维护好一个长连接呢?那就是做好断线重连机制。
什么时候触发断线重连?
        第一种判断方法:在网络糟糕的情况下,在客户端进行网络操作时经常会显示的抛出异常,比如NetworkException、Timeout等,这种情况下,就说明客户端已经无法与服务器通讯,这时就需要客户端主动发起对服务器连接。
        第二种判断方法:使用心跳检测,可以服务器定时发心跳包给客户端,也可以客户端定时发心跳包给服务器,我认为最稳妥的应该是客户端发送心跳包给服务器,服务器收到后再回复一条确认收到的消息给客户端,心跳包只需简单设计就好,一般只包含消息头,不含消息体。当超过规定时间T没有收到心跳返回包时,就触发断线重连。
        第三种判断方法:使用Keepalive,keepalive是在TCP中一个可以检测死连接的机制,是由TCP协议层实现的,具体使用方法我暂时也没去了解~
        第四种判断方法:当手机客户端切回后台后一定时间又返回游戏,或者网络连接从wifi切到4G等情况下,可以主动触发一次重连操作。
断线重连的大致流程:        

3、如何处理粘包分包问题

       使用TCP协议做网络模块开发时,由于TCP本身的机制,如果发送的数据很小,那么会自动把一些小的数据合并在一起发送出去,但是接收端就没办法理解数据包并自行分开它,这就是粘包现象;而当一次发送的数据又过长的时候,TCP就会把该数据分成几部分发送出去,每次接收方就只会接受部分的数据,这就是分包现象。由于粘包和分包现象是在传输层发生的,我们只能在应用层想办法解决,处理粘包和分包有很多方法,这里介绍几种常见的方法:
       第一种方法是在每个数据包前面加上该数据包的长度,作为该数据包的包头,当收到消息包时,先读取消息包头,得到消息包的长度,再根据这个长度去读取对应长度的字节,这样就能很好的解决粘包分包的问题。
       第二种方法是在每个消息包的头部或尾部加上一个标识符,这个标识符不能是常用的字符,比如可以使用‘¥’这类平时不会出现在消息体中的字符,将它作为消息包界限,接收端在收到消息后就能根据这个界限方便的去做处理。
       第三种方法是如果使用的是JSON这类字符串做传输,可以根据消息包的首尾字符,通过判断首尾‘{’和‘}’来组成一个完整的消息包。
 

4、使用TCP还是UDP

       众所周知,C/S架构中,TCP使用广泛,UDP同样也有不少用武之地,先看一下UDP与TCP相比的区别:首先,UDP速度比TCP快,因为UDP不需要先与对方建立连接,也没有传输确认这一步骤,因此其速度会快不少;UDP一次性发送一个消息包,不需要考虑消息边界的问题;UDP可以使用广播或者组播的方式进行一对多传输;UDP由于没有可靠的消息传输机制,它的可靠性不如TCP,也不能保证有序传输。
       游戏往往对数据的可靠性传输要求很高,似乎看起来只能使用TCP,然而,很多游戏对客户端数据同步要求特别高,比如英雄联盟和王者荣耀,使用TCP来传输实时战斗数据是行不通的,那还是只能在UDP上想办法 ,通过对UDP进行一层可靠性封装,可以使UDP同样具有类似TCP传输可靠有序的特点。英雄联盟开发时使用的是Enet,ENet提供一个相对简单的以及稳健的位于UDP顶部的网络通信层。其提供的主要功能是可选的可靠按顺序的传送数据包。王者荣耀使用的似乎是KCP,KCP是一个快速可靠协议,它主要的设计目的是为了解决在网络拥堵的情况下TCP协议网络速度慢的问题,增大网络传输速率,但相当于TCP而言,会相应的牺牲一部分带宽。KCP没有规定下层传输协议,一般用UDP作为下层传输协议。提供类似这种可靠UDP服务的还有UDT等,在GitHub上可以找到不少这类项目。
 

5、使用哪种网络传输数据格式

       在做客户端服务器通讯前,要选择一种网络传输数据格式,在做选择时,都需要考虑几点:第一是数据大小,这关系到占用带宽和传输效率,应该尽量不要有多余的数据;第二点是可拓展性、可维护性,必须支持序列化及反序列化消息中用到的数据结构;第三点是数据安全性,有些数据是敏感数据,需要进行加密处理;第四点是是否跨平台支持;第五点是消息可读性,这点不重要,但消息可读性高的话,调试时方便。
       游戏开发中,主要的网络传输数据格式有Json、Xml、Protobuf,以及自定义二进制数据包,在很多时候,我们都使用Json和Xml,因为使用简单,可读性高,调试方便,但它们属于文本,占用空间稍大,显得有些臃肿。自定义二进制数据格式虽然体积小,传输高效,但致命的缺点是可扩展性差,在编写和解析数据包时很容易出错,而且当需要编写一些数据结构时会比较麻烦,因此这种方式只适合小项目。Protobuf是一种轻便高效的结构化数据存储格式,Protobuf可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式,目前提供了C++、Java、Python、C#等多种语言的API,很适合用于网络游戏的消息结构体定义上。相对于XML文件和Json文件,它的性能更好,效率更高。
 
如有错误,欢迎指正!

TCP长连接的一些事儿的更多相关文章

  1. Http 和TCP的关系,TCP长连接和短连接有什么区别?

    HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...

  2. TCP 长连接与短连接的区别

    TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...

  3. TCP长连接与短连接

    1.概念区别 所谓TCP短连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接.也就是说TCP连接维持的时间比较短.一般银行网页数据交互都使用短连接.再比如说htt ...

  4. TCP长连接与短连接的区别

    http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...

  5. 多进程解决datasnap支持的tcp长连接数量少的问题

    对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000 ...

  6. TCP长连接与短连接的原理及区别

    一.当网络通信时采用TCP协议时:  1.过程: 第一步:(在真正的读写操作之前)Server 和Client 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...

  7. [转载] TCP长连接与短连接的区别

    转载自http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前 ...

  8. UNIX网络编程——TCP长连接与短连接的区别

    一.TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,server回应client,然后 ...

  9. TCP长连接与短连接、心跳机制

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...

随机推荐

  1. 分形之二叉树(Binary Tree)

    上一篇文章讲的是分形之树(Tree),这一篇中将其简化一下,来展示二叉分形树的生长过程. 核心代码: static void FractalBinaryTree(const Vector3& ...

  2. 让你的照片更鲜艳------hsv拉伸

    如果你的照片看上去灰蒙蒙的,缺少生机,那么hsv拉伸也许可以帮你的忙.hsv拉伸是一种可以提高图像鲜艳程度的图像增强方法,它能够让图像的颜色更加鲜活.艳丽,而且它的处理结果看上去很自然,比如源图中较暗 ...

  3. 统计--VARCHAR与NVARCHAR在统计预估上的区别

    最近遇到一个问题,当查询使用到模糊查询时,由于预估返回行数过高,执行计划认为索引查找+Key Lookup的成本过高,因此采用Clustered Index Scan的方式,消耗大量逻辑IO,执行计划 ...

  4. VS2010的快捷键乱

    vs2010的快捷键乱了,点击回车会出现属性窗口,点击退格键会相当于编辑里面的撤销功能 点击ctrl+s会出现sharepoint窗口,在网上找了一个解决方式(很难找),原问在这: http://q. ...

  5. SSO集成方案[随笔]

    看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...

  6. Microsoft.Office.Interop.Excel.ApplicationClass can not embedded 的问题

    用c#进行开发时,要做一个excel导入功能,期间使用到Microsoft.Office.Interop.Excel程序集,在用vs2008开发的时候没有报错,将这个程序集引用到vs2010的时候,便 ...

  7. JQuery Mobile - html5+CSS 禁止IOS长按复制粘贴实现

    因为在移动端APP需要实现长按执行别的事件,但是在IOS系统有默认的长按选择复制粘贴,禁止此功能在网上找了很多资料,最终整理出目前最好的解决方法.实际测试,也并不是很理想,但是可能没有更好办法了! / ...

  8. 表单控件 css的三中引入方式css选择器

    1. 表单控件: 单选框 如果两个单选的name值一样,会产生互斥效果 <p> <!--单选框--> 男<input type="radio" nam ...

  9. jQuery基础(3)- ajax

    一.jQuery的ajax 1.什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML). 简言之,在不重载整个网页的情况下, ...

  10. cad.net之ACAD移植到GCAD的自动加载问题

    将acad.pgp,lsp,fas,vlx,名称增加一份gcad.pgp,lsp,fas,vlx.涉及系统加载用. Lisp的拖拉加载在gcad无法通过lastprompt获取命令历史栏最后一行(含路 ...