应用层 :细解PHP中的流,礼尚往来的真朋友 HTTP/HTTPS/RTMP

朋友的朋在甲骨文最早的来源就是,两串用线串成的贝壳(远古时期的货币),小伙伴来你家做客,拿出一串贝壳请朋友吃饭,你去伙伴家串门,伙伴拿出一串贝壳请你吃饭,讲究的是礼尚往来。

http协议原理和朋友间的礼尚往来一样,由请求(request)响应(response)构成,属于应用层协议,是一个标准的客户端服务器模型。http承载于TCP协议之上。

请求和响应

请求 : 连接是一个传输层的实际环流,它建立在两个相互通信的应用程序之间。请求由三部分构成:请求行、消息报头、请求正文。重要头信息报头见下文。

响应:再接收和请求消息后,服务器返回一个http响应消息。http响应也由三个部分组成,分别是:状态行、消息报文、响应正文。

1xx - 指示信息 - 请求已接收,继续处理。
2xx - 成功 - 请求已被成功接收、理解、接收
3xx - 重定向 - 要完成请求必须进行进一步的操作
4xx - 客户端错误 - 请求有语法错误或请求无法实现
5xx - 服务器错误 - 服务器未能实现合法的请求

根据个人迁移服务器的经验,403有可能nginx index 没有指定默认文件 ,502有可能是配置文件出错,导致响应超时,500可能的原因是域名解析造成的问题。

Http的重要头信息

相信一件事儿或者一个人,主要是看这个人的属性。比如 努力、上进、阳光、干净、温柔、有爱等等,http的头信息也是一样,有着重要的几个报头信息指数。

  • Host:主要用于指定被请求资源的Internet主机和端口号,即域名,一般从url中提取出来,默认端口是80,可以指定端口。
  • User-Agent: 简称UA,内容包含发出请求的用户信息。UA头已经是辨别设备的重要指标。
  • Accept : 告诉服务器可以接受的文件格式,wap的接收可能会少一些。
  • Cookie :Cookie分两种,一种是客户端像服务端发送的,使用Cookie报头,用来标记一些信息;另一种是服务器发给浏览器的,报头为set Cookie。二者的主要区别是Cookie报头里一条记录可以有多个value。
  • Cache-Control: 指定请求和响应遵循的缓存机制。
  • Referrer: 头域允许客户端指定请求URI的源资源地址,这允许服务器生成退回链表、可用来登陆、优化缓存等。
  • Content-Encoding: 指定所能接受的编码方式。

HTTPS

在说https之前,http属于无状态协议,在浏览器上都是明文传输,为了防止信息泄露和篡改,保证信息传递的安全、各路英雄纷纷对传输的数据进行加密。主要有对称加密(DES)、非对称加密(RSA)、和数字签名/证书(CA)。

有朋友就会有秘密,有的秘密你只想让某一个朋友知道,对其他所有人保密。在计算机的时间里为了信息不被劫持和盗取,就有了https协议,本质是在SSL上加了一层保护层,端口443。

在对应的服务商下生成对应的公钥和私钥,a.key和a.pem,打开服务器上的443端口 ,在nginx上进行配置,https的原理很多,咱也不清楚,咱也不敢瞎写啦。

server {
    listen 443;
    server_name wap.xxxx.com;
    ssl on;
    root /home/xxxxx;
    index index.html index.htm index.php;
    ssl_certificate   ../cert/a.pem;
    ssl_certificate_key  ../cert/a.key;
    ...
}

流媒体 RTMP

这几年自媒体的发展,各种小直播热火朝天,直播的快乐留给你们,研究代码的技术,留给我们,最好的学习笔记,留给我深爱的读者,专栏第三篇,切写且用心。

如何把数据流打包传输到对端?

那这个格式是不是就能够直接在网上传输到对端,开始直播了呢?其实还不是,还需要将这个二进制的流打包成网络包进行发送,这里我们使用RTMP 协议。这就进入了第二个过程,推流。

RTMP 是基于 TCP 的,因而肯定需要双方建立一个 TCP 的连接。在有 TCP 的连接的基础上,还需要建立一个 RTMP 的连接,也即在程序里面,你需要调用 RTMP 类库的 Connect 函数,显示创建一个连接。

RTMP 为什么需要建立一个单独的连接呢?

因为它们需要商量一些事情,保证以后的传输能正常进行。主要就是两个事情,一个是版本号,如果客户端、服务器的版本号不一致,则不能工作。另一个就是时间戳,视频播放中,时间是很重要的,后面的数据流互通的时候,经常要带上时间戳的差值,因而一开始双方就要知道对方的时间戳。

握手之后,双方需要互相传递一些控制信息,真正传输数据的时候,还是需要创建一个流 Stream,然后通过这个 Stream 来推流 publish。推流的过程,就是将 NALU 放在 Message 里面发送,这个也称为RTMP Packet 包。前面连接的时候,设置的 Chunk 块大小就是指这个 Chunk。将大的消息变为小的块再发送,可以在低带宽的情况下,减少网络拥塞。

就这样数据就源源不断到达流媒体服务器,整个过程就像这样。

PHP中的流

之前去小米面试,面试官问了一句了解的流函数,问的我是一脸懵逼,之后再后来的工作里也遇见了相同的一些问题,下面我们就来梳理php中的流,介绍 php://input 和 stream_* 系列函数。

所谓php中的流,每一种流都实现了一个包装器(wrapper),包装器包含一些额外的代码用来处理特殊的协议和编码。PHP提供了一些内置的包装器,我们也可以很轻松的创建和注册自定义的包装器。我们甚至可以使用上下(contexts)和过滤器来改变和增强包装器。

 // 服务端代码	
 $data = file_get_contents('php://input');
 var_dump( $data );
 var_dump($_POST);
 var_dump($_FILES);

Curl

curl http://blog.zhuangbfan.com/input.php?php=2  
curl http://blog.zhuangbfan.com/input.php?php=2 -d "name=zhang&age=18"
curl http://blog.zhuangbfan.com/input.php?php=2 -F "file=@/Users/stark/Documents/wechat01.png" -i

curl -i #输出请求和响应的详细信息
curl -d #发送POST数据
curl -H #携带头信息
curl -F #发送文件 

亲测,php://input 流中只能接收POST原始信息, F I L E S , _FILES, _GET,都接收不到,数据以原始流的数据方式显示。

[root@iZ2ze9gei ~]# curl http://blog.zhuangbfan.com/input.php -d "name=zhang&age=18" -i
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 23 Jul 2019 01:59:00 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.0.30

string(17) "name=zhang&age=18"

谢谢你的阅读。

EN。

发布了98 篇原创文章 · 获赞 185 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/xuezhiwu001/article/details/96971565