1 网络服务的基本概念
一个网络服务,通常是部署在服务器上,等待其他服务或客户端连接进来,对于等待连接的服务来说,我们可以把所有的接入请求的对端,都称为客户端。
以下,我们介绍一些基本概念。
1、监听端口(ListenPort)
客户端如果想要和一个服务建立TCP连接,需要指定服务的IP和端口,发起连接请求。客户端指定的端口号,就是服务端的监听端口。
应用服务在选择监听的端口时,尽量避免和知名端口冲突。所谓知名端口,一般是众所周知、知名服务常用的服务端口,如80(http)、443(https)、21(ftp)、22(ssh)等。
这些端口不是不可以使用,但使用后容易在配置时产生冲突,导致监听端口失败,服务无法启动等问题。因此,自己开发服务选择端口时,一般是在[1024,65535]之间进行选择。
服务端选择一个端口(例如20001)进行监听后,客户端就可以向服务所在IP地址的20001端口,发起TCP连接。
在socket编程中,服务端绑定一个端口,建立一个套接字,执行listen函数,等待客户端的连接接入。
2、连接(Connection)
客户端向服务端发起TCP连接请求,经过三次握手之后,就建立了一个TCP连接。
Socket编程中,连接建立成功后触发accept函数,并返回一个新的套接字,之后与这个客户端的信息收发,都在这个新的套接字上执行。
服务端可以同时维持多少个客户端连接呢?
Socket使用四元组标示一个连接,即:源IP地址,源端口,目的IP地址,目的端口。
在连入服务的连接中,目的IP地址是服务器IP地址,目的端口时服务端的监听端口,这两个时固定不变的。
而源IP地址,源端口,是发起连接的客户端的IP和端口。
一台电脑端口分配上限是65535,因此,一台机器,不断的向服务端发起TCP连接,因为客户端是连出,每次会在客户端的机器上分配一个新的端口,因此这台机器TCP连出的上限是65535,但这不是服务端维持连接的上限。
服务端监听的始终是一个端口,为连入客户端新建一个socket,但并不会再占用新的端口。服务端的开销是文件描述符,socket占用的内存(每个大概4K左右),以及网络带宽足够大,能够保证连接请求可以及时响应。
因此,一台4G内存的服务器,在网络带宽不是瓶颈,且服务配置文件没设限制的情况下,百万连接应该是可以支撑的。
3、会话(Session)
客户端和服务建立一个连接后,就像两个人接通了电话,可以在这个线路上互传消息,我们可以称这是一个会话。
连接是更底层的,会话则在连接的基础上,维护了更多的信息,比如这次会话的ID,会话的连接类型,会话时长,会话的连接状态等。
会话是业务层用来更方便的管理连接的。
4、连接使用者(LinkUser)
服务端维持了很多连接,业务层需要将不同身份的连接区分开,为其提供不同的服务。
比如,有的连接是用户客户端连入,我们可以将其命名为ClientUser;对于大厅服务连入的,可以命名为LobbyUser;对于聊天服务连入的,可以命名为ChatSvrUser。
因为不同身份的连接,需要处理的业务并不相同,因此连接建立后,要尽快识别对端的身份,为其建立对应的LinkUser。
5、ASIO网络库
Asio是一个跨平台的 C++ 开发包用来处理网络和低级 I/O 编程,通过先进的 C++ 方法为开发人员提供连续异步模型。
Asio包含在boost库中,在C++11后,可以在不使用boost库的情况下,使用Asio的网络模型。它也是最有可能进入C++标准库的网络模型,因此,后面我们使用non-Boost的ASIO实现基础的网络io功能。
Last updated