http协议

http协议

一.简介

HTTP是一种超文本传输协议,HTTP是一个在计算机世界里专门在两点之间传输文字,图片,音频,视频等超文本数据的约定和规范

二.HTTP协议主要特点(1.0版本的)

简单快速,灵活,无连接,无状态
(1) HTTP是无连接的
无连接的含义是限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,即断开连接.采用这种方式可以节省传输时间
PS:HTTP/1.1里改成总是默认启用keep-live长连接机制,所以现在的HTTP已经不再是无连接的了
(2) HTTP是媒体独立的
这意味着,只要客户端和服务端知道如何处理数据的内容,任何类型的数据都可以通过HTTP传输,客户端以及服务端指定适合的MIME-type内容类型即可
(3) HTTP是无状态的
HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,缺少状态,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的数据量增大,另外,在服务器不需要先前信息时,它的应答就较快.
通过Cookie,Session解决无状态

三.HTTP报文

1.请求报文

一个HTTP请求报文由请求行(request line),请求头(header),空行和请求数据4部分组成
1.1.请求行(request line)
包括请求方法字段,URL字段和HTTP协议版本.比如GET /index.html HTTP/1.1。
1.2.请求头(header)
头部字段是key-value的形式,以键值对的形式组成,每行一对,请求头部通知服务器有关客户端请求的信息。
1.3.空行
它的作用是通过一个空行,告诉服务器请求头部到此为止
1.4.请求体
若方法是GET,则此项为空,没有数据
若方法是POST,则通常来说此处放置的就是要提交的数据
比如要使用POST方法提交一个表单,其中有user字段中数据为admin, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

2.响应报文

响应报文由状态行,响应头,空行,响应正文组成
2.1.状态行
包含HTTP协议的版本,状态码,以及描述(作为数字状态码的补充,是更详细的解释文字,帮助人理解原因)
2.2.响应头
字段(响应头)说明示例Access-Control-Allow-Origin指定哪些网站可以跨域源资源共享Access-Control-Allow-Origin: *Age响应对象在代理缓存中存在的时间,以秒为单位Age: 12Allow对于特定资源的有效动作;Allow: GET, HEADCache-Control通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。
2.3.空行
最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。
2.4.响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

在这里插入图片描述

四.HTTP方法

1.GET
用于请求访问已经被URI识别的资源,可以通过URL传参给服务器
2.POST
用于传输信息给服务器,主要功能与get方法类似,但一般推荐使用POST方式
3.PUT
传输文件,报文主体中包含文件内容,保存到对于URI位置。
4.HEAD
获得报文首部,与get方法类似,只是不返回报文主体,一般用于验证URI是否有效
5.DELETE
删除文件,与PUT方法类似,删除对应URI位置的文件
6.OPTIONS
查询相应URI支持的HTTP方法
7.GET和POST区别
(1) GET请求在URL中传输是有长度限制的,大小2kb,而POST没有(长度限制)
(2) GET比POST更不安全,因为参数直接暴露在URL上,不能传递敏感信息(安全问题)
(3) GET 参数通过URL传递,POST放在Request body(请求体)中(传递参数的形式)
(4) GET请求只能传递URL编码类型的参数,而POST支持多种编码格式(传递的参数类型)
(5) GET请求会被浏览器主动缓存,而POST不会(缓存问题)

五.HTTP状态码

HTTP状态码的英文为HTTP Status Code。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  1. 1XX
    指示信息:表示请求已经接收,继续处理
  2. 2XX
    成功:表示请求已经被成功接收,理解,处理
  3. 3XX
    重定向:表示要完成请求,必须进一步操作
  4. 4XX
    客户端错误:请求有语法错误或请求无法实现
  5. 5XX
    服务端错误:服务器未能实现合法的请求
    6.常见状态码
    状态码英文标识描述
    200OK表示从客户端发送给服务器的请求被正常处理并返回;
    204No Content表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回)
    206Patial Content表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。
    301Moved Permanently永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
    302Found临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
    301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)303See Other表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源
    302与303的区别:后者明确表示客户端应当采用GET方式获取资源
    304Not Modified协商缓存,返回的状态码
    400Bad Request表示请求报文中存在语法错误;
    401Unauthorized未经许可,需要通过HTTP认证;
    403Forbidden拒绝访问,没有权限
    404Not Found无法找到请求的资源,举个例子:输入了错误的URL。
    500Inter Server Error表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;
    503Server Unavailable表示服务器暂时处于超负载或正在进行停机维护,无法处理请求
1.三次握手(连接的建立)

所谓的三次握手即TCP连接的建立.这个连接必须是一方主动打开,另一方被动打开的
1.2 三次握手步骤
1.2.1 第一次握手:
客户端发送一个带SYN=1,Seq=X的数据包到服务器端口(第一次握手,由客户端发起,告诉服务器我要发送请求了)
1.2.2 第二次握手
服务器发回一个带SYN=1,ACK=X+1,Seq=Y的响应包以示传达确认信息(第二次握手,由服务器发起,告诉客户端我准备接受了,你赶紧发送吧)
1.2.3 第三次握手
客户端再回传一个带ACK=Y+1,Seq=Z的数据包,代表握手结束(第三次握手,由客户端发送,告诉服务器,我马上就发了,你准备接受)
1.3 为什么要进行第三次握手
主要为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误.

2.四次挥手(连接的断开)

所谓的四次挥手即TCP连接的释放,连接的释放必须是一方主动释放,另一方被动释放
数据传输完毕后,双方都可以释放连接.最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭.
2.1 四次挥手详细步骤
2.2.第一次挥手
客户端向服务端发送报文,FIN,ACK,Seq,表示已经没有数据传输了,并进入FIN-WAIT-1状态 (第一次挥手:由客户端发起,发送给服务器,我请求报文发送完了,你准备关闭吧)
2.3 第二次挥手
服务端发送报文,ACK,Seq,表示同意关闭请求,此时客户端发起方进入FIN-WAIT-2状态.(第二次挥手:由服务器发起的,告诉客户端,我请求的报文接受完了,我准备关闭了,你也准备吧)
2.4 第三次挥手
服务端先客户端发送报文段,FIN,ACK,Seq,请求关闭连接,并进入LAST-ACK状态,(第三次挥手:由服务器发起,告诉客户端,我响应报文发送完了,你准备关闭吧)
2.5 第四次挥手
客户端向服务端发送报文段,ACK,Seq,然后进入等待TIME-WAIT状态.服务端收到客户端的报文段后关闭连接,客户端等待一定时间后未收到回复,则正常关闭(第四次挥手:由客户端发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)

总结一个http的过程

1.和服务器建立链接(三次握手)作用:主要为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误.
2.建立链接后,发送一个请求给服务器(请求报文:请求行,请求头,空行,请求 体)
3.服务器接受到请求以后进行相应的处理并给出一个回应(响应报文:状态行,响应头,空行,响应体)
4.断开于服务器的链接(四次挥手)

HTTP1.0

特点
优点:简单、HTTP基本的报文格式就是 header + body、灵活和易于扩展
HTTP协议里的各类请求方法`状态码、头字段等都是可以自定义扩展的。
同时 HTTP 由于是工作在应用层( OSI 第七层),则它下层可以随意变化。
应用广泛和跨平台
缺点
无状态
服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息
但是会导致它在完成有关联性的操作时会非常麻烦。
例如登录->添加购物车->下单->结算->支付,这系列操作都要知道用户的身份才行。但服务器不知道这些请求是有关联的,每次都要问一遍身份信息。
无状态的问题解决方法有cookie/session/token
不安全
1.明文传输内容可能会被窃听。比如,账号信息容易泄漏,那你号没了。
不验证通信方的身份
2.可能会遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。
无法证明报文的完整性
3.有可能已经遭到篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。
安全问题HTTPS得到了解决。
无连接
浏览器的每次请求都要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。
每个TCP只能发送一个请求。发送数据完毕,连接就关闭。如果还要请求其他资源,就需要再建立一个连接。
TCP三次握手是一个很耗费时间的过程,所以HTTP/1.0性能比较差。

HTTP 1.1改进

1.缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
2.带宽优化及网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
3.错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.HOST头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5.长连接
在早期的HTTP1.0中,每次http请求都要建立一个TCP连接,创建连接的过程需要消耗资源和时间,为了减少资源消耗,就需要重用连接。
后来的HTTP1.0 与 HTTP1.1 中,引用了重用连接的机制,在HTTP请求头中加入Connection:keep-alive,告诉对方这个响应完成后不要关闭,下一次继续使用。
HTTP1.0需要保持长连接要在头部信息中加入此参数,HTTP1.1 默认长连接,可以不加。如果不需要长连接,则在头部信息加上:Connection:close,接受到请求的客户端就会自动关闭连接。
长连接会一直保持吗?
不会! 一般服务端都会设置keep-alive超时时间,超过指定的时间间隔,服务端主动关闭连接。
同时,服务端还会设置最大请求数,比如最大请求数为300,只要超过最大请求数,即使没到超时时间,都会主动关闭连接。
参数content-length,指明响应体数据的大小,浏览器收到如数的响应知道响应完成,就可以关闭连接。
管道网络传输
采用长连接的方式,管道传输成为了可能。长连接有两种工作方式:非流水线方式和流水线方式。
非流水线方式:客户端在收到前一个响应之后才能发出下一个请求。在TCP连接建立后,客户端每访问一次对象都要消耗一个RTT。优点:比非持续连接的两倍RTT节省了建立TCP连接所需的一个RTT。 缺点:服务器发送完一个对象之后,其TCP连接处于空闲状态,浪费服务器资源。
流水线方式:客户在收到HTTP响应之前,就接着发送新的请求。服务器可以持续发送响应报文。优点:只需要一个RTT。使TCP连接中的空闲时间减少,提高文档下载效率。
但是服务器会按照顺序,回应请求。如果前面的请求特别慢,后面的请求就会排队等待。称为队头堵塞。

HTTP 2.0 改进

1.头部压缩
如果发送多个请求,头部是一样的或是相似的,协议会消除重复的部分。
HPACK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
2.二进制格式
报文采用了二进制格式。
头信息和数据体都是二进制,统称为帧:头信息帧和数据帧。
这样虽然对用户不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。
3.数据流
数据包不是连续发送的,同一个连接里面的连续的数据包,可能属于不同的回应。必须对包进行标记,指出属于哪个回应。
每个请求或回应的所有数据包,称为一个数据流(Stream)。
每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数
客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。
4.多路复用
HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。
移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率。

HTTPS 改进

HTTPS 在 HTTP 与TCP之间加入了 SSL/TLS协议。
HTTPS如何解决 HTTP不安全的问题?
混合加密的方式实现了信息的机密性,解决了窃听的风险。
摘要算法保证数据的完整性,能够为数据生成独一无二的指纹,指纹用于校验数据的完整性,解决了篡改的风险。
将服务器公钥放入数字证书中,解决了冒充的风险。

HTTP 与 HTTPS 区别?

1.HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS解决了HTTP不安全的缺陷,在TCP与HTTP之间加入了SSL/TLS协议,保证报文能够加密传输。
2.HTTP连接建立相对简单,TCP三次握手之后可进行HTTP传输。而HTTPS在三次握手之后,还要进行SSL/TLS握手过程,才可以进入加密传输。
3.HTTP的端口号是80,HTTPS端口号是443.
4.HTTPS需要向CA(证书权威机构)申请数字证书,保证服务器是可信的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值