朋友的朋在甲骨文最早的来源就是,两串用线串成的贝壳(远古时期的货币),小伙伴来你家做客,拿出一串贝壳请朋友吃饭,你去伙伴家串门,伙伴拿出一串贝壳请你吃饭,讲究的是礼尚往来。
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原始信息, _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。