Flighting游戏服务器:关于TCP和UDP

来源:互联网 发布:朝鲜核讹诈中国知乎 编辑:程序博客网 时间:2024/06/02 07:15

一、前言

思考了两天怎么去做游戏的服务器,不得不承认自己真的是想得太多了,什么高并发低延迟之类的,导致盲目地看libevent(异步处理)这些高深的东西。其实这些可能以后是不得不考虑,但现在最重要还是先把简单的功能实现吧。


二、学习到的知识

1.TCP VS UDP

TCP:面向连接,可靠,保证顺序,慢,有延迟
     TCP每次发送一个数据包后都要等待接收方发送一个应答信息,这样TCP才可以确认数据包通过因特网完整地送到了接收方。如果在一段时间内TCP没有收到接收方的应答,他就会停止发送新的数据包,转而去重新发送没有收到应答2的数据包,并且持续这种发送状态知道收到接收方的应答。所以这会造成网络数据传输的延迟,若网络情况不好,发送方会等待相当长一段时间


UDP:无连接,不可靠,不保证顺序,快

1.TCP 优点:保证数据传输的包的顺序,数据传输的正确性。

      缺点:一旦发生丢包,会有阻塞,会有额外的操作,导致非常大的延迟。

      使用场景:1.对数据的正确性(顺序、完整)高

       2.当数据发生丢包造成很大的延迟的时候,有一定的处理(客户端预测、客户端播放动画等)

2.UDP 优点:数据传输速度快,扔几个数据包过去就算了

      缺点:不保证安全性,丢包或者包的顺序乱了的时候没有处理

      使用场景:1.对包的正确性要求不高(大不了可以重发)

       2.客户端不能进行预测,即不能 不等服务器就自己处理。



2.长连接 vs 短连接

长连接指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维
    连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接


短连接:指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,如Http
    连接→数据传输→关闭连接


3.关于同步/异步/阻塞/非阻塞/IO

IO分两个阶段:
1.通知内核准备数据。2.数据从内核缓冲区拷贝到应用缓冲区

根据这2点IO类型可以分成:
    1.阻塞IO,在两个阶段上面都是阻塞的。
    2.非阻塞IO,在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的
    3.IO复用,在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是所有的IO都集中在一个地方,这个地方进行轮询
    4.信号IO,当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞
    5.异步IO,1,2都不阻塞







   
同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数
Java#Selector

   

允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据.



PS.以上摘自《MMORPG服务器架构》


三.我的决定

现阶段对于战斗场景的服务器方面可以采用UDP,而其余基本功能的可以采用异步的TCP boost::asio



0 0
原创粉丝点击