一、前言
思考了两天怎么去做游戏的服务器,不得不承认自己真的是想得太多了,什么高并发低延迟之类的,导致盲目地看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
1.通知内核准备数据。2.数据从内核缓冲区拷贝到应用缓冲区
根据这2点IO类型可以分成:
1.阻塞IO,在两个阶段上面都是阻塞的。
2.非阻塞IO,在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的
3.IO复用,在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是所有的IO都集中在一个地方,这个地方进行轮询
4.信号IO,当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞
5.异步IO,1,2都不阻塞
Java#Selector
允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据.
PS.以上摘自《MMORPG服务器架构》
三.我的决定
现阶段对于战斗场景的服务器方面可以采用UDP,而其余基本功能的可以采用异步的TCP boost::asio