道者编程


PHP SOCKET编程基础

先说点屁话:SOCKET是死马?中文称为:套接字,这个翻译非常变态,老子以前就被这个翻译坑了,一直搞不清楚到底是什么,套接字是个死马意思?一点都不形象。在英语里面SOCKET:插座的意思。

先看看SOCKET是怎么定义的:socket是由IP端口组成,通过某种协议实现不同计算机之间的通信。

既然SOCKET翻译过来是插座的意思,这就好理解了,服务器就是一个大的排插,链接就通过排插,那么现在如果链接需要什么东西?
1:服务端(被链接方)得有一个插孔。
2:客户端(链接方)得有一个插头。
有了这两个还是不行啊,服务器你得告诉我地址吧?我链接哪里的地址啊,这就是IP地址,IP地址就是服务器地址,但是服务器这么大,这么多服务,我要链接哪一个?好,我给你开一个插孔吧,这就是端口,但是插孔有三孔的,两孔的,圆孔的,你总得告诉我型号吧,这不就是协议吗?其实这里协议比喻还是不太形象,协议好比发快递的时候,你用的是顺丰,还是三通一达。

一:TCP/IP:

1:概述:TCP/IP:TCP/IP是互联网基础通信协议体系,它不是一个协议,是一个协议族,里面包括了TCP,UDP,HTTP,FTP,IMCP等等协议。

2:TCP/IP协议分层:ISO-OSI七层协议,TCP/IP四层。

为什么TCP/IP协议族只分4层,因为网络接口层下面属于硬件范畴了,和TCP/IP几乎没什么关系。

TCP/IP:由低到高:

(1)网络接口层:

为网络传输做准备,数据要在网络中传播,数据必须符合网络传输形态格式,第一步就是构成数据链路数据单元(帧),包括链路管理、差错控制、流量控制等(传输层也有流量控制)。

(2)网络层:

IP协议就在这里,主要功能为寻址与路由:寻址就是根据目标IP知道数据发到哪里,路由就是各个中间节点在原地址和目标IP地址之间找到合适的转发路径。

分段与重组:分段如果IP数据报大小超过了网络的最大传输单元(MTU),就需要分段。重组数据达到目标主机后,恢复原来的IP数据

(3)运输层:TCP,UDP,运输层虽然说也是协议,确切的说是一种运输方式可能更恰当。

(4)应用层:HTTP,FTP,SMTP等,为什么要用应用层协议?因为没有应用层协议,数据就无法识别,也就没什么意义,诸如数据的格式、大小、含义都不清楚。我们平常说的自定义协议就是指在应用层的自定义协议。

从上图协议分层看,似乎没看见SOCKET在哪里?我们把上面的TCP/IP协议分层图再稍微修改一下:

SOCKET编程:从图上我们就知道什么是SOCKET编程了,SOCKET不是什么协议,SOCKET编程就是对复杂的TCP/IP进行封装,比如如何链接、监听、关闭等等,和业务逻辑没毛关系。比如workerman用纯php写的socket框架,swoole用C编写的PHP socket框架……

二:PHP SOCKET编程方法:

PHP的SOCKET编程有两种种方法:

1:用C扩展php,比如swoole,门槛很高。

2:PHP自身语言编写,PHP提供了两种类型的socket:socket 和 stream_socket,两个互相不兼容。

(1):socket:更加底层,和C的SOCKET接口差不多,使用较麻烦,而且需要安装,编译php的时候需要加:--enable-sockets,方法以:socket_XXXX开头。

(2):stream_socket:PHP自己的接口,不需要安装,拿来即用,方便,缺点就是支持不够,一些参数无法自定义。方法以:stream_socket_XXXX开头,workerman就是基于这个来封装的。当 stream_socket无法设置某些参数的时候,通过socket_import_stream将stream_socket转换成底层sockets,然后通过socket_set_option设置stream_socket的socket选项。

三:PHP SOCKET实例

1:TCP流程步骤:

 服务端:socket->bind->listen->accept->send/recv->closesocket
 1:创建socket
 2:将创建的socket绑定到本地的IP和端口(bind)
 3:设为监听模式,监听链接请求状态(listen)
 4:等待客服端请求,线程进入阻塞态睡眠状态;当有请求过来,内核返回一个新socket描述符,用它与客户端连接(accept)
 5:返回的socket描述符和客户端通信(send/recv)
 6:循环第4步
 7:关闭socket(closesocket)

 客服端:socket->connect->send/recv->closesocket
 1:创建socket
 2、发出连接请求(connect)
 3、于服务器端进行通信(send/recv)
 4、关闭socket(closesocket)

 2:UDP流程步骤:

 服务端步骤:socket->bind->recvfrom->closesocket
 1:创建socket
 2:将创建的socket绑定到本地的IP和端口(bind)
 3:等待接受客户端数据(recvfrom)
 4:关闭socket(closesocket)

 客服端:socket->connect->sendto->closesocket
 1:创建socket
 2、发送数据(sendto)
 3、关闭socket(closesocket)

TCP和UDP的步骤不一样,UDP少了一些步骤,主要是两者传输方式不一样,关于TCP和UDP的介绍和区别,网上有很多。


最新评论:
1楼 广东省广州市 电信 发表于 2019-08-02 17:52:11
总结的 很好,这个快餐吃的值!
共有 1 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚


链接