这篇文章主要是关于HTTP协议的基础问题,都是在平时常见的一些HTTP相关问题。
目录
网络通信OSI七层模型
在了解HTTP协议之前,先简单了解一下OSI网络结构,这样更好理解HTTP协议在网路传输中的位置及作用。
OSI:开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。
在网络中数据的传输一定是有协议与规范的:
OSI网络七层模型
-
7 应用层
-
6 表示层
-
5 会话层
-
4 传输层
-
3 网络层
-
2 数据链路层
-
1 物理层
其中高层(即7、6、5、4层)定义了应用程序的功能,可以统称为应用层;下面3层(即3、2、1层)主要面向通过网络的端到端,点到点的数据流。
常见的如IP协议在网络层;TCP协议在传输层;HTTP协议在应用层。在这里就不具体介绍。
HTTP协议是什么?
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
HTPP概述:
Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信的。HTTP是现代全球因特网中使用的公共语言。用户待获取的Web内容都是存储在Web服务器上的,因为Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。
在日常中个人用户使用的浏览器就是作为HTTP客户端通过URL向HTTP服务端(应用商服务器)即WEB服务器发送所有请求。
HTTP协议可分为三个部分:
-
超文本
-
传输
-
协议
- 协议:网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。
- 传输:传输是指通过物理点对点或点对多点传输介质(有线,光纤或无线)发送和传播模拟或数字信息信号的过程。例如电话、广播,或者经由任意媒介电话传真、例如电光纤,或者无线电频率。
- 超文本:指用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。简单可以理解为超过普通文本的文本,它可以包含文字、图片、音频、视频等不同形式内容的超链接,能从一个超文本跳转到另一个超文本
总结:
Http是一个在网络中客户端(请求方)与服务端(响应方)之间传输文字、图片、音频、视频等超文本数据的约定规则。
HTTP如何通信?
Http通信流程:
展示了HTTP协议通信流程如图所示:
有Web客户端通过HTTP协议(HTTP Protocol)将请求数据传送到Web服务端,服务端的相应服务接口接收数据后,根据请求执行处理服务从数据获取到需要的数据,处理完成后Web服务端再通过HTTP协议返回相应数据。
URL的组成
以 http://www.joes-hardware.com/seasonal/index-fall.html 为例,URL分以下三部分。
-
URL的第一部分(http):URL方案(scheme),方案可以告知Web客户端怎样访问资源。在这个例子中,URL说明要使用HTTP协议。
-
URL的第二部分(www.joes-hardware.com):主机(host),指的是服务器的位置。这部分告知Web客户端资源位于何处。·
-
URL的第三部分(/seasonal/index-fall.html):资源路径(path),路径说明了请求的是服务器上哪个特定的本地资源。
除了这三个主要组成部分,还有用户、密码、端口、参数等组件。
HTTP协议报文
如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了。
HTTP报文是在HTTP应用程序之间发送的数据块。数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。
HTTP报文的三个组成部分(起始行、首部和实体的主体部分);
HTTP报文是简单的格式化数据块
它们由三个部分组成:
-
对报文进行描述的起始行 (start line);
-
包含属性的首部(header)块;
-
可选的、包含数据的主体(body)部分。
请求报文格式
<method><request-URL><version>
<headers>
<entity-body>
响应报文格式
<version><status><reson--hrase>
<headers>
<entity-body>
示例:
-
起始行和首部就是由行分隔的ASCII文本。每行以一个由两个字符组成的行终止序列作为结束,包括一个回车符(ASCII码13)和一个换行符(ASCII码10)。行终止序列可以写做CRLF。
-
一组HTTP首部总是应该以一个空行(仅有CRLF)结束,甚至即使没有首部和实体的主体部分也应如此。
-
实体的主体或报文的主体(或者就称为主体)是一个可选的数据块。与起始行和首部不同的是,主体中可以包含文本或二进制数据,也可以为空。
HTTP协议常见状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。
1xx:信息性状态码
100~199
表示临时响应并需要请求者继续执行操作的状态代码。
HTTP/1.1向协议中引入了信息性状态码。
2xx:成功状态码
200~299
表示成功处理了请求的状态代码。
3xx:重定向状态码
300~399
表示要完成请求,需要进一步操作。通常这些状态代码用来重定向。
4xx:客户端错误状态码
400~499
表示客户端发送了服务器无法处理的东西,如错误的请求报文,或者不存在的URL等
5xx:服务器错误状态码
500~599
表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
一些常见的状态码:
- 100:Continue(继续) 收到了请求的起始部分,客户端应该继续请求
- 101:Switching Protocols(切换协议) 服务器正根据客户端的指示将协议切换成Update首部列出的协议
- 200:OK(客户端请求成功) 服务器已成功处理请求
- 201:Created(已创建) 对那些要服务器创建对象的请求来说,资源已创建完毕
- 202:Accepted(已接收) 请求已接受,但服务器尚未处理
- 205:Reset Content(重置内容)
- 302:Moved Permanently(永久搬离)
- 302:Found(已找到)
- 400:Bad Request(坏请求) 客户端请求有语法错误,不能被服务器识别
- 401:Unauthorized(未授权)
- 402:Payment Required(要求付款)当前状态码并未使用,是预留的
- 403:Forbidden(禁止) 服务器收到请求,但是拒绝提供服务
- 404:Not Found(未找到) 请求的资源不存在
- 405:Method Not Allowed(不允许使用的方法)
- 415:Unsupported Media Type(不支持的媒体类型)
- 500:Internal Sever Error(内部服务器错误) 服务器发生不可预期的错误
- 501:Not Implemented(未实现)
- 502:Bad Gateway(网关故障) 服务器作为网关或代理,从上游服务器收到无效相应。
- 503:Service Unavailable(未提供此服务)
- 504:Gateway Timeout(网关超时)
HTTP1.0/HTTP1.1/HTTP2.0
HTTP1.0 是在 1996 年引入的,1.0是第一个得到广泛使用的HTTP版本。HTTP/1.0添加了版本号、各种HTTP首部、一些额外的方法,以及对多媒体对象的处理。
-
无状态、无连接
HTTP1.1 是在 1999 年引入的,提供了一下改变:
-
长连接,一次连接可以多次传输
-
添加HOST字段,请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
-
缓存处理,引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match
-
支持断点续传(把文件分成几部分)
-
添加状态码,在HTTP1.1中新增了24个错误状态响应码
HTTP2.0 是在2015年开发的标准,改变如下:
- 多路复用(连接共享)
- 头部数据压缩
- 服务器推送
- 二进制分帧
- HTTP/2引入二进制数据帧和流的概念,所有的HTTP2.0通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。
HTTP和HTTPS的区别?
HTTPS = HTTP + SSL
HTTP协议在网络中以明文方式发送内容,不提供任何方式的数据加密,如果截取了传输的报文,就可以直接读取其中的信息,因此,HTTP不适合传输一些敏感信息,如密码信息等。
为了解决HTTP协议的这一缺陷,安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,即HTTP下加入了SSL层。SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
区别:
-
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议。
-
HTTP 的端口号是 80,HTTPS 的端口号是 443。
-
HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
-
HTTPS证书(SSL证书)需要权威的CA机构对信息进行审核才可以完成注册,是需要收费的。
SSL与TLS
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
HTTP中 GET 与 POST 的区别?
GET | POST |
一般用于信息获取 | 一般用于修改资源 |
幂等,浏览器回退是无害的 | 浏览器回退会在再次提交请求 |
请求浏览器会主动Cache | 需要手动设置浏览器Cache |
请求URL参数有长度限制 | 参数放在消息体中传递,没有长度限制 |
不安全,所有参数直接显示在URL中 | 安全,将参数放到消息体中传递到请求地址 |
注释:
GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET产生一个TCP数据包;POST产生两个TCP数据包。
GET方式的请求,浏览器会把HTTP Header和data一起发送,服务器响应200(返回数据);
对于POST请求,浏览器先发送Header,服务器响应100 Continue,浏览器再发送data,服务器响应200 ok(返回数据)。
使用时注意:
-
GET与POST都有自己的语义,不能随便混用。
-
在网络环境好的情况下,发送一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上有很大优势。
-
不是所有浏览器都会在POST中发送两次包,如Firefox浏览器就只发送一次。
后端技术小白,文章涵盖的不全还望见谅;如果文章中有错误的地方,欢迎留言指正,看到后会尽快修改 。
欢迎各位点赞、评论、收藏。