一篇文章带你了解HTTP
HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP),用于从万维网服务器传输超文本到本地浏览器的传送协议
HTTP是一种基于TCP/IP通信协议来传递数据(HTML 文件、图片文件、查询结果等)
HTTP工作原理
HTTP协议工作在于客户端-服务端架构上。
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等
Web服务器根据接收到的请求,向客户端发送响应信息
HTTP默认端口为80
HTTP协议特点
客户端/服务端
HTTP是基于客户端/服务端(C/S)的架构模型,浏览器作为客户端访问服务端
无连接
无连接的含义是限制每次连接只处理一个请求。
服务器处理完客户端的请求,并收到客户端的应答后,即断开连接
采用这种方式可以节省传输时间
无状态
HTTP是无状态协议
无状态是指协议对于事务处理没有记忆能里
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
单向性
服务端永远被动等待客户端的请求
灵活
HTTP允许传输任意类型数据对象
传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识) 来标识
HTTP协议版本
-
HTTP 1.0
-
HTTP 1.1
-
HTTP 2.0
HTTP 1.0
服务器不跟踪每个客户端也不记录过去的请求(无状态)
请求只能由客户端发起(单向性)
HTTP/1.0中默认使用Connection: close
HTTP 1.1
HTTP/1.1中已经默认使用Connection: keep-alive(长连接
避免了连接建立和释放的开销,但服务器必须按照客户端的先后依次顺序回送响应的结果
以保证客户端能够区分出每次请求响应的内容
1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”
HTTP1.1默认使用长连接,可有效减少TCP的三次握手开销。
HTTP 2.0
- 多路复用
- 头部压缩
- 服务端推送
- 更安全
多路复用
在HTTP1.0中,当页面需要请求很多资源是,队头阻塞(Head of line blocking)会导致在
达到最大请求时,资源需要等待其他资源请求完成后才能继续发送
多路复用,连接共享。不同Request可以使用一个连接传输,根据每个Request上的id好组合成正常的请求
Header压缩
HTTP 1.1中Header带有大量信息,并且的重复传输
HTTP 2.0使用Encoder(编码器)来减少需要传输的Herder大小
更安全
-
HTTP2.0使用了TLS的拓展ALPN做为协议升级
-
TLS(安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性)
-
除此之外,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法
服务器Push(推送)
-
在HTTP2.0中,服务端可以在客户端某个请求后,主动推送其他资源
可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间
URI、URL、URN
URI(Uniform Resource Identifier),统一资源标识符,用于表示某一互联网资源名称字符串
例如: /image/logo.gif
URI 包含URL、URN
URL(Uniform Resource Location)统一资源定位符,可以帮助我们唯一定位互联网上的某一个资源,相当于是互联网资源的身份证号,用于在网络中传播和访问互联网资源的一个地址,一个标准的URL必须包括:
- 协议(Protocol)
- 存放资源的主句或域名(Host)
- 端口号(Prot)
- 资源文件名(Path)
- 参数(Parameter)
- 锚点(Anchor)可选 跳转页面某个位置
例如 http://www.itbaizhan.cn:80/course/id/18.html?a=3&b=4
URN(Uniform Resource Name)统一资源名称,其目的是通过提供一种途径,用于在特定的命名空间资源的标识,以补充网址。
URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式
例如: bitpoetry.io/posts/hello.html#intro
HTTP消息结构
HTTP Request (请求信息)
Request 消息分为3部分:
第一部分:Request Line
第二部分:Request Headers
第三部分:Request body
Request Line(请求行)
GET /hello.txt HTTP/1.1
Request Headers(请求头)
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
响应字段 | 描述 |
---|---|
Host | 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号 |
Connection | 连接方式 如果值是close则表示基于短连接方式,如果该值是keep-alive,网络连接就是持久的,在一定时间范围内是不会关闭 |
Upgrade-Insecure-Requests | 服务端是否支持https加密协议。 |
Cache-Control | 指定请求和响应遵循的缓存机制 |
User-Agent | 浏览器表明自己的身份(是哪种浏览器) |
Accept | 告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型。 |
Accept-Encoding | 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate) |
Accept-Language | 浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等。 |
Accept-Charset | 浏览器告诉服务器自己能接收的字符集 |
Referer | 浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL |
Refresh | 表示浏览器应该在多少时间之后刷新文档,以秒计时 |
Cookie | 可向服务端传递数据一种模型 |
Request body(请求体)
客户端向服务器发送数据。比如:表单使用POST方式提交数据,上传的文件数据
HTTP Response (响应信息)
Response 消息分为3部分:
第一部分:Response Line
第二部分:Response Headers
第三部分:Response body
Response Line
HTTP/1.1 200 OK
Response Headers
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
响应头字段 | 描述 |
---|---|
Date | 响应的Date使用的是GMT时间格式,表示响应消息送达时间 |
Server | 服务器通过这个Server告诉浏览器服务器的类型。 |
Vary | 客户端缓存机制或者是缓存服务器在做缓存操作的时候,会使用到Vary头,会读取响应头中的Vary的内容,进行一些缓存的判断 |
Content-Encoding | 文档的编码(Encode)方式。用gzip压缩文档能够显著地减少HTML文档的响应时间 |
Content-Length | 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据 |
Content-Type | 用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件 表示响应的文档属于什么MIME类型。 |
Response body(响应体)
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码
HTTP状态码(HTTP Status Code)
当访问一个网页时,浏览器会向网页所在服务器发出请求。
浏览器接收并显示网页前,此网页所在服务器会返回一个HTTP状态码,用以响应浏览器的请求
常见HTTP状态:
-
200 请求成功
-
301 资源(网页等 )被永久转移到其他URL
-
404 请求的资源(网页等)不存在
-
500 内部服务器错误
HTTP状态码分类
HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTP请求方法
GET
GET请求指定页面信息
- GET请求中会将请求中床的数据包含在URL中并在也浏览器的地址栏中显示。
-
GET请求传递数据时要求数据必须时ASCLL字符
-
GET请求可以被浏览器缓存
POST
POST 向指定资源提交数据,请求服务器处理
- POST请求数据包含在请求体中
- POST请求传递数据时,数据可以试试ASCII字符也可以是字节型数据,默认为字符型
- POST请求默认情况下不会浏览器所缓存
注意:
POST请求可能会导致新的资源的建立/或已有资源的修改
HEAD
获取报文首部
HEAD与GET请求相一致的响应,只不过响应体将不会被返回,用于获取报头
PUT
向指定资源位置上传最新内容
PATCH
是对 PUT 方法的补充,用来对已知资源进行局部更新
TRACE
回显服务器收到的请求,主要用于测试或诊断
DELETE
请求服务器删除指定的页面
OPTIONS
允许客户端查看服务器性能
CONNECT
要求在与代理服务器通信时建立隧道,通常用于SSL加密服务器
重点:GET和POST的区别
GET用于获取资源,而POST用于传输实体主体
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
GET产生的URL地址可以被Bookmark(书签标记),而POST不可以
缓存
- GET请求会被浏览器缓存
- POST请求不会被浏览器缓存,除非浏览器手动设置
编码方式
- GET请求只支持URL编码
- POST支持多种编码方式
参数长度
- GET请求在URL中传送的参数是有长度限制的
- POST请求参数不会有长度限制
数据类型
- GET只接受ASCII字符
- POST即是字符也可以是字节
重复提交
- GET在浏览器回退时是不会在提交
- GET在浏览器回退时POST会再次提交
安全性
- GET安全性比POST低,因为参数直接暴露在URL中,不能用来传递敏感信息
传递方式
- GET参数通过URL传递
- POST参数放在Request body(请求体中)传递
GET产生的URL地址可以被Bookmark(书签标记),而POST不可以
缓存
- GET请求会被浏览器缓存
- POST请求不会被浏览器缓存,除非浏览器手动设置
编码方式
- GET请求只支持URL编码
- POST支持多种编码方式
参数长度
- GET请求在URL中传送的参数是有长度限制的
- POST请求参数不会有长度限制
数据类型
- GET只接受ASCII字符
- POST即是字符也可以是字节
重复提交
- GET在浏览器回退时是不会在提交
- GET在浏览器回退时POST会再次提交
安全性
- GET安全性比POST低,因为参数直接暴露在URL中,不能用来传递敏感信息
传递方式
- GET参数通过URL传递
- POST参数放在Request body(请求体中)传递
下一篇: block 实现原理详解(一)