HTTP—这估计是你看的最仔细的一份协议了!

Posted Java后台开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP—这估计是你看的最仔细的一份协议了!相关的知识,希望对你有一定的参考价值。

干货文~,全文3000字,阅读需要8分钟左右


HTTP是一个应用层的简单的请求响应协议,它通常运行在TCP之上,指定了浏览器和万维网服务器之间的通信规则要发送什么样的消息以及得到什么样的响应。


我们在电脑或者手机上通过浏览器访问相应的网站时正是使用HTTP协议来与服务器通信,且在URL的头部也会显示出协议的名称。


下面本文带你详细了解HTTP协议


HTTP协议介绍


HTTP是一种无状态的基于TCP/IP通信协议的用来传输数据的应用层协议


1.无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,客户端与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。


2.HTTP基于TCP/IP协议,当用户在一个浏览器中向服务器发送请求后,浏览器将通过TCP/IP协议与指定的服务器建立连接。服务器会一直在HTTP的端口(80)上倾听连接,当接受到客户端的请求后该连接便会建立起来。然后客户通过该连接发送一个包含请求方法的请求块。


3.http协议的传输方式有很多种,常用的是GET和POST两种

传输方式 描述
GET
请求指定的服务器资源
POST
向指定资源提交数据进行处理请求
HEAD
用于获取报头
PUT
从客户端向服务器传送的数据取代指定的文档的内容。
DELETE
请求服务器删除指定的资源
TRACE
用于测试,要求服务器送回收到的请求

CONNECT

要求在于代理服务器通信时建立隧道,用隧道协议进行通信
OPTIONS
查询针对请求URI指定的资源支持的方法


HTTP协议工作原理


我们在浏览器中输入www.baidu.com之后会发生以下的事情

(1) 浏览器分析超链接指向页面的 URL。

(4) 浏览器与服务器建立 TCP 连接

(5) 浏览器发出请求

(6) 服务器接受请求,并根据请求返回相应的文件作为应答;

(7) TCP 连接释放。

(8) 浏览器显示返回的html文件



HTTP请求的报文格式如下

HTTP—这估计是你看的最仔细的一份协议了!


一个HTTP请求报文由四个部分组成:请求行、首部行(请求头)、空行、实体主体


1.请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1


2.首部行

首部行用来说明浏览器、服务器或报文主体的一些信息

例如:

Accept:浏览器可接受的MIME类型

Accept-Charset:浏览器可接受的字符集

Accept-Encoding:浏览器能够进行解码的数据编码方式

Accept-Language:浏览器所希望的语言种类

Content-Length:表示请求消息正文的长度。

Host:想访问的主机名


3.空行

它的作用是通过一个空行,告诉服务器首部行到此为止。


4.请求数据

若方法字段是GET,则此项为空,没有数据

若方法字段是POST,则通常来说此处放置的就是要提交的数据


HTTP响应的报文格式如下

HTTP—这估计是你看的最仔细的一份协议了!


一个HTTP响应报文由四个部分组成:状态行、首部行(响应头)、空行、实体主体


1.状态行

状态行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK

状态码含义如下

HTTP—这估计是你看的最仔细的一份协议了!


2.首部行

首部行用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

例如:

Allow:服务器支持哪些请求方法(如GET、POST等)

Content-Encoding:文档的编码(Encode)方法

Date:当前的GMT时间

Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存


3.空行

作用同样是通过一个空行,告诉服务器首部行到此为止。


4.响应体

响应体就是响应的消息体,一般返回HTML代码。


HTTP1.0/1.1/2.0之间的区别


1.HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,而HTTP1.1默认使用长连接,即在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,可有效减少TCP的三次握手的开销。


2.HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准。而HTTP1.1则引入了例如ETag,If-None-Match等更多可供选择的缓存头来控制缓存策略。



4.HTTP2.0通过在应用层和传输层之间增加一个二进制分帧层,二进制分帧将所有传输信息分割为更小的帧,用二进制进行编码,多个请求都在同一个TCP连接上完成,可以承载任意数量的双向数据流,突破了HTTP1.1的性能限制、改进传输性能。


5.HTTP2.0使用多路复用技术,多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。在HTTP1.1协议中,浏览器客户端在同一时间针对同一域名的请求有一定数据限制,超过限制数目的请求会被阻塞,而HTTP2.0可以同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。


HTTP—这估计是你看的最仔细的一份协议了!


6.HTTP1.0和1.1的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来压缩需要传输的header大小。


HTTP与HTTPS之间的区别



HTTP是超文本传输协议,被用于在web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截获了传输报文,就可以读取内容,所以不建议传输一些敏感信息。所以HTTPS就是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,另外HTTP的端口号为80,HTTPS的端口号为443。


HTTPS 在证书验证阶段使用非对称加密,在内容传输的加密上使用的是对称加密,它的具体密过程如下


证书验证阶段:

1.浏览器发起 HTTPS 请求;

2.服务端返回 HTTPS 证书和公钥;

3.客户端验证证书是否合法,如果不合法则提示告警。


数据传输阶段:

1.当证书验证合法后,在本地生成随机数;

2.通过公钥加密随机数,并把加密后的随机数传输到服务端;

3.服务端通过私钥对随机数进行解密;

4.服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。


HTTPS虽然提供了消息安全传输的通道,但是每次消息的加解密十分耗时,消息系统资源。所以,除非在一些对安全性比较高的场景下,比如银行系统,购物系统中我们必须要使用HTTPS进行通信,其他一些对安全性要求不高的场景,我们其实没必要使用HTTPS,另外使用HTTPS需要使用到数字证书,但是一般权威机构颁发的数字证书都是收费的。


以上是关于HTTP—这估计是你看的最仔细的一份协议了!的主要内容,如果未能解决你的问题,请参考以下文章

看看这篇5000字的文章,带你看不一样的Android-Http

https加密解密过程详解

http协议进阶http概述

ssl协议

你看Http的 三次握手

给前端看的HTTP协议浅析