《就是要你懂swoole》-Server(一)

小伙伴们,大家好,这篇博客给大家带来的是有关swoole server的__construct的相关知识。对应的官方文档在这里

构造函数的原型如下:

1
2
swoole_server(string $host, int $port = 0, int $mode = SWOOLE_PROCESS,
int $sock_type = SWOOLE_SOCK_TCP);

我们一个一个的过一下构造函数里面的参数。

host

$host,翻译过来就是主机的意思。什么是主机呢?

1
主机是指计算机除去输入输出设备以外的主要机体部分。也是用于放置主板及其他主要部件的控制箱体(容器Mainframe)。通常包括 CPU、内存、硬盘、光驱、电源、以及其他输入输出控制器和接口。

这是百度百科的解释。但是,在这个系列的文章里面,为了描述简单,我们直接把我们的计算机叫做主机。(我个人觉得计算机这个名词是包含了输入输出设备的,例如鼠标、键盘、显示器等等)

port

$port,翻译过来就是端口的意思。什么是端口呢?

在这里,我们所说的端口不是指硬件领域的端口。也就是说不是指USB端口、串行端口等(即不是指IO接口里面的数据寄存器等等东西)。而指的是软件领域的端口。也就是说指的是网络中面向连接服务和无连接服务(后面会说什么是面向连接服务和无连接服务)的通信协议端口是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。

如果还是有一些抽象,不要紧,我们去看看Linux中端口这个数据结构的定义是怎样的。数据结构的定义在这里,大概是在80行的位置:

这个数据结构里面,就有我们现在正在说的port:

1
2
3
4
5
6
struct inet_bind_bucket {
/* other member */
unsigned short port; /* 端口号 */
signed char fastreuse; /* 端口是否允许被重用 */
/* other member */
};

所以说,当我们给swoole_server这个构造函数传递一个端口号的时候,实际上就会在这个数据结构中的port成员变量中记录下这个端口号。

OK,说到这里,小伙伴们应该就更加理解什么是端口了吧。它也和进程一样,是一种数据结构

mode

$mode,翻译过来就是模式的意思。在这里指的是服务器运行的模式:

  • SWOOLE_PROCESS多进程模式(默认)
  • SWOOLE_BASE基本模式

模式这一块我们现在先放一下,到时候我会专门开一篇文章来讲。

sock_type

$sock_type,翻译过来就是套接字类型的意思。

swoole支持TCPUDPTCP6UDP6UnixSocket Stream/Dgram 6种。在这里,我们重点看一下TCP和UDP。

首先,我们得知道套接字(socket)是什么?

1
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

这是百度百科的解释。直接看的话,如果之前没有网络编程的基础,理解起来还是有一定的难度的,所以我们来做一个简单的解释。

1
网络通信过程中端点的抽象

首先,我们要理解网络通信的本质。实际上网络通信的本质是进程之间进行通信(要说更加本质的,可以扯到通信链路等等东西,但是在这里我们只讨论软件)。为什么这么说?因为你会发现,客户端和服务器本质上是两个跑起来的程序(即进程),然后客户端和服务器之间进行数据的交流,即所谓的通信。所以,本质上是两个进程之间的通信。

其次,我们要理解这里所说的端点是什么意思。小伙伴们可能会说,这个问题简单嘛,不就是之前所说的主机嘛,不就是通信双方的主机嘛。其实,这么说是不准确的。我们上面说了,网络通信的本质是进程之间的通信,因此,这里所说的端点实际上指的是通信双方的主机上面的进程

然后,我们再来看一看这句话里面所说的抽象指的是什么呢?就是后面那句话:

1
网络通信必需的五种信息

也就是说,套接字把这五种信息给结合起来了,只要你把套接字所需要的这五种信息描述清楚了,那么,你就可以通过这个套接字,去和其他进程进行通信。

OK,我们讲完了套接字之后,现在可以讲一讲描述套接字所需要的信息之一 – 连接使用的协议(这里所说的是传输层的协议,而不是应用层的协议)。而协议,就是这里所说的sock_type了。那么,TCP是什么、UDP又是什么呢?

1
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

这是百度百科的解释。所以,简单的来说,TCP实际上是一种协议,由专门的网络专家经过研究而得出的一种规范(例如源端口所占的位数、目的端口所占的位数等等规范)。然后,操作系统的研发人员就按照专家们制定的规范,开发出了和TCP协议有关的数据结构,以及对这些数据结构的相关操作(通过这些操作,实现了TCP协议面向连接、可靠、基于字节流的特点)。所以说,TCP直接的连接,更多的指的是软件层面上的连接,即通过一些变量来表示是否建立连接,以及和谁进行了连接。至于什么是面向连接的、可靠的、基于字节流,我这里就不说了,因为这个可以单独写成一篇文章了,为了控制这篇博客的长度,小伙伴们可以直接在网上搜一下TCP的特点就好了。

UDP也是类似的道理,这里就不多说了。

最后,如果小伙伴们想要更加清晰的理解套接字,建议用C语言写一写网络编程的小demo。因为概念这东西,你不动手去写,要理解起来还是有一定难度的,不是说脑瓜子笨,而是说,如果你写过,那么你的眼睛就看过,你理解的就更深刻。

(未完,明天接着写)