HTTP协议简介

前言

本文摘录自 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语言可用。

本文来自企鹅号 - PHPer媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

LVS初步

很多人知道LVS,但可能知之不多,希望阅读本文后,能够对LVS有一个基本的感性认识。

8730
来自专栏吴裕超

要不要用gzip优化前端项目

这两天在做项目优化,注意到webpack有一个compression-webpack-plugin插件,可以打包成gzip格式部署到服务器,了解到了GZIP,其...

1.1K80
来自专栏开源优测

TCP/IP协议基础

TCP/IP 为网际协议族 IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP都属于TCP/IP

15410
来自专栏SDNLAB

容器 Flannel vxlan 基本原理和验证

作者简介:yangjunsss,曾就职于IBM、青云QingCloud,现就职于华为,研究方向:容器微服务、IaaS、P2P分布式。邮箱 cj.yangjun@...

31720
来自专栏微信终端开发团队的专栏

微信终端跨平台组件 Mars 系列(三):连接超时与 IP & Port 排序

Mars 系列开始,将为大家介绍 STN(信令传输网络模块)。由于 STN 的复杂性,该模块将被分解为多个篇章进行介绍。本文主要介绍微信中关于 socket 连...

1.4K00
来自专栏Java3y

网络层【第一篇】

在当今我们是使用无连接的方式的。网络提供数据报服务,无连接的、尽最大努力交付的数据报服务。网络层不提供服务质量的承诺。即所传送的分组可能出错、丢失、重复和失序(...

18910
来自专栏彭湖湾的编程世界

【计算机网络】网络层学习笔记:总结IP,NAT和DHCP

前言:这篇文章是学习网络层协议时候总结的笔记,前面的主要部分介绍的都是IP协议, 后半部分介绍NAT协议和DHCP协议 参考书籍 《计算机网络-自顶向下》   ...

27250
来自专栏即时通讯技术

网络编程懒人入门(一):快速理解网络通信协议(上篇)

论坛和群里常会有技术同行打算自已开发IM或者消息推送系统,很多时候连基本的网络编程理论(如网络协议等)都不了解,就贸然定方案、写代码,显得非常盲目且充满技术风险...

11110
来自专栏salesforce零基础学习

salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项

我们都知道,当一条记录进入审批流程以后会自动加锁,apex提供Approval类的lock和unlock方法可以让我们使用代码对记录进行加锁和解锁。 项目中遇到...

29280
来自专栏Java3y

网络层【第三篇】

路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。

17410

扫码关注云+社区

领取腾讯云代金券