前言
本文摘录自 RFC 2616(HTTP/1.1 协议文档),如想查阅1.0版本协议请参见(RFC1945)。
本文档主版本为英文,有中译可参考。
相关地址:
https://tools.ietf.org/html/rfc1945 (HTTP/1.0)
https://tools.ietf.org/html/rfc2616 (HTTP/1.1)
https://tools.ietf.org/html/rfc7230 “Message Syntax and Routing”
https://tools.ietf.org/html/rfc7231 “Semantics and Content”
https://tools.ietf.org/html/rfc7232 “Conditional Requests”
https://tools.ietf.org/html/rfc7233 “Range Requests”
https://tools.ietf.org/html/rfc7234 “Caching”
https://tools.ietf.org/html/rfc7235 “Authentication”
注
RFC2616已经拆解为6个单独的协议,从 RFC 7230 到 RFC 7235,目的是提高协议的可读性。
参加 2616 的页头说明:Obsoleted by: 7230, 7231, 7232, 7233, 7234, 7235
注2
当你入门之后,觉得生活没有乐趣,技术没有提升空间的时候,再来阅读此文档。(理工出身可忽略)
看他们有什么用?
所有基于HTTP协议的产品,都是通过深度本系文档进行开发的。这些产品包括:各种浏览器,各种服务器端软件(apache/nginx/…)所有B/S结构的软件。
当你实现模拟登陆、数据挖掘(采集)等行为时,都需要更多的HTTP协议知识。
如果想了解WebSocket的详情,请阅读:RFC 6455、7936
举个栗子
在 RFC 7230中,2.7节介绍了统一资源标识符,简单来说就是网址长什么样,为什么长这样。
如果想了解更多细节,看右边的标注,RFC 3986 中对此说了详细解释。
URI-reference = URI-reference, see [RFC3986], Section 4.1
absolute-URI = absolute-URI, see [RFC3986], Section 4.3
relative-part = relative-part, see [RFC3986], Section 4.2
scheme = scheme, see [RFC3986], Section 3.1
authority = authority, see [RFC3986], Section 3.2
uri-host = host, see [RFC3986], Section 3.2.2
port = port, see [RFC3986], Section 3.2.3
path-abempty = path-abempty, see [RFC3986], Section 3.3
segment = segment, see [RFC3986], Section 3.3
query = query, see [RFC3986], Section 3.4
fragment = fragment, see [RFC3986], Section 3.5
比如
port 一节,就说表示端口应该用“domain.com:80” 这样的格式,但因为HTTP协议默认端口是80,所以可省略。
换句话说,如果你的apache 定义端口为81,那么网址就必须加 “:81”
还有
query 一节说 符号“/” 和 “?” 属于特殊字符,可能无法正常解析。所以,我们PHP在处理复杂的GET传参时,才会做URL编码。
PS:query 指 网址“?”号后面的参数,也就是 GET 类型的传参。
重申
这些东西能够提高你的排错和开发能力。进阶的路上可以给自己安排长期的学习任务,有选择性的阅读一些。
协议主要构成
新RFC的六篇文档,分别叙述了一个主题,所以主要可分为6部分。
RFC7230: 消息格式与路由
RFC7231: 语义与内容
RFC7232: 条件请求
RFC7233: 范围请求
RFC7234: 缓存
RFC7235: 认证
HTTP协议简介
协议是双方通信的约定,按照此协议收发数据,双方指的是:
客户端(常见浏览器)
服务端(常见apache)
常见的请求均为
客户端,发起请求
服务端,响应请求
用白话说
浏览器把网址发给服务器
服务器把对应的内容发给浏览器
之所以,你输入域名,能够看到网页,全靠HTTP协议了。
收发,并没有这么简单
收发的时候,还要做很多额外的约定,比如:
是否包含了COOKIE
是文档,还是图片?
使用什么语言编码?
数据总长度是多少?
是否允许缓存?缓存几时过期?
使用什么样的数据压缩技术
收发时间
通过什么方式发送数据?(get/post ..)
如果把服务器、客户端比喻成营业员和顾客。
顾客只告诉营业员:我要桔子,那营业员就懵了。
必须是这样的:我要2斤桔子,顺便帮我打包好,不要烂的。
HTTP协议的文档里,大概就约定了这些细节。不管是服务端,还是客户端,开发的时候必须遵循此文档。
我只是写写PHP,也需要了解这些?
现在社会要的是差异化人才,多数人觉得不重要的东西,往往就更重要。
三年之内你可能不需要这些,但是这些知识决定了你最终的高度。
服务端和客户端,不一定非的是apache和浏览器,PHP 也可以作为服务端或者客户端
比如:
fsockopen
fopen
file_get_contents
curl
….
注:CURL 是一套独立的HTTP处理库,不仅仅是PHP语言可用。