目录
一、什么是HTTP协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于在客户端和服务器之间传输数据的应用层协议,基于 TCP/IP 通信。
HTTP是一个属于应用层的协议,同时也是一个双向协议,基于浏览器-服务器架构模型进行工作。浏览器 与 服务器之间,基于http协议进行通信 ,浏览器发送请求数据给服务器,服务器根据接收到并处理请求后,向浏览器发送响应信息。
二、HTTP协议通信过程
HTTP 是一个应用层协议,默认端口为80,在传输层使用 TCP协议进行数据的传输。
http协议通信过程包括如下步骤:
1.当用户发起一个新的请求;
2.浏览器发起对服务器的 TCP连接请求;
3.服务器与浏览器之间会按照TCP协议的三次握手,建立之间的 TCP 连接;
4.浏览器按照http协议格式,创建请求数据包(http请求报文);
5.将请求数据包(http请求报文)发送至服务器;
6.服务器按照http协议格式,解析请求报文;
7.执行请求处理,调用相关业务逻辑方法,产生响应数据;
8.服务器按照http协议格式,将响应数据封装至响应数据包(http响应报文);
9.服务器将响应数据包,发送至浏览器;
10.浏览器按照http协议格式,对响应数据包进行解析;
11.浏览器将响应数据包中的响应内容,显示至浏览器页面,呈现给用户;
三、URL
HTTP协议使用 URL( Uniform Resource Locator,统一资源定位符)来定位资源。
格式:http://host[":"port][abs_path]
示例:http://192.168.0.116:8080/index.html
- http表示要通过HTTP协议来定位网络资源;
- host表示合法的Internet主机域名或者IP地址;
- port指定一个端口号,为空则使用缺省端口80;
- abs_path指定请求资源的URI;
四、HTTP 请求
【1】请求报文
浏览器通过URL发起一个请求时,会发送一个http请求报文给目标服务器,服务器根据请求报文中携带的请求数据进行处理。
请求报文结构
- 第一行是包含:请求方式、URL、协议版本;
- 接下来的多行都是http请求首部内容,其中包含若干个http首部字段。
- 一个空行用来分隔首部和内容主体 Body
- 最后是请求的内容主体
【2】请求方式
HTTP请求报文 第一行为请求行,其中包含了请求方式字段,常见的请求方式:GET、POST、HEAD、PUT、DELETE、OPTIONS。
GET : 获取资源。用于使用给定的URL从给定服务器中检索信息,完成从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不会对数据产生其他影响。
POST :提交数据增加资源。用于将数据发送到服务器以创建或增加资源。使用post方法,如果两个请求相同,后一个请求不会覆盖第一个请求,所以post用于增加资源。
HEAD :获取响应报头。HEAD 和 GET方法类似,但是不返回响应报文内容主体部分,仅传输响应报头部分。主要用于确认 URL的有效性以及资源更新的日期时间等。
PUT :修改资源。用来修改资源,要求在请求报文的主体中包含数据内容,然后保存到请求URL指定位置。使用put方法,如果两个请求相同,后一个请求会覆盖第一个请求,所以put用于修改资源。
DELETE :删除资源。用来删除指定的资源。
OPTIONS :查询支持的方法。查询指定的 URL能够支持的方法。会返回 Allow: GET, POST, HEAD, OPTIONS等请求方式内容。
GET 和 POST 的区别
GET用于获取数据,POST用于提交数据;
GET和POST的请求报文格式不同
POST方法请求报文第一行是这样的 POST /URL HTTP/1.1 \r\n
GET方法请求报文第一行是这样的 GET /URL HTTP/1.1 \r\n
GET使用请求报文中的首部字段URL传递请求参数,POST使用Request Boby提交数据;
GET是幂等且可缓存,POST非幂等且不可缓存;
「幂等」:意思是多次执行相同的操作,结果都是「相同」的。
五、HTTP 响应
【1】响应报文
当服务器处理完请求后,会将响应数据放入http响应报文中返回给浏览器。
响应报文结构
第一行包含:协议版本、状态码以及描述。
最常见的状态码及描述是: 200OK ,表示请求成功。
接下来的若干行是首部内容
一个空行分隔首部和内容主体
最后是响应的内容主体
【2】状态码
服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求后的响应结果。
1XX 信息
1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际工作中使用场景比较少。
2XX 成功
2xx 类状态码表示服务器成功处理了客户端的请求。
「200 OK」最常见的成功状态码,表示一切正常。
「204 No Content」常见的成功状态码,与 200 OK 基本相同,但响应报文没有 body 数据。
「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
3XX 重定向
3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
4XX 客户端错误
4xx 类状态码表示客户端发送的报文有误,服务器无法处理。
「400 Bad Request」表示客户端请求的报文有错误。
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
「405 Not Allowed」表示服务器不支持客户端采用的请求方式。
5XX 服务器错误
5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
「500 Internal Server Error」服务器发生了内部错误。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
六、HTTP首部字段
Host字段:浏览器发送http请求时,用来指定服务器的域名。
例如:Host : www.apesource.com
Content-Length字段:服务器在响应数据时,会通过 Content-Length 字段,表明本次响应数据的长度。
例如:Content-Length: 1000Connection 字段:Connection字段用于浏览器要求服务器使用长连接,以便其他请求复用该连接。
例如:Connection: keep-aliveContent-Type 字段:Content-Type 字段用于服务器响应时,告诉浏览器,本次响应数据的内容类型。
例如:Content-Type: text/html; charset=utf-8Accept 字段:Accept 字段用于浏览器发起请求的时候,声明可以接受哪些响应数据格式。
例如:Accept: */*Content-Encoding 字段:Content-Encoding 字段说明数据的压缩方法,表示服务器响应的数据使用的压缩格式。
例如:Content-Encoding: gzipAccept-Encoding 字段:客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法。
例如:Accept-Encoding: gzip, deflate
七、连接管理
【1】短连接和长连接
HTTP 1.0 默认使用短连接,每次使用HTTP协议进行通信,都需要重新按照三次握手的方式,建立一个独立的TCP连接,响应完毕后,通过四次挥手断开连接。这种重复的连接创建和断开,增加了通信的开销。
为了解决这个问题,HTTP/1.1 改用长连接的通信方式,也叫持久性连接。长连接只需要建立一次 TCP 连接就能进行多次 HTTP通信,这种方减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
- 在 HTTP/1.0 默认是短连接,如果需要使用长连接,则使用 Connection : Keep-Alive
- 从 HTTP/1.1 默认是长连接,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;
【2】管线化连接
将多个HTTP请求(request)整批提交的技术,在传送过程中不需先等待服务端的回应。管线化机制须通过长连接(persistent connection)完成,仅HTTP/1.1支持此技术(HTTP/1.0不支持)。
八、HTTPS
【1】HTTP协议存在的问题
HTTP由于使用明文传输,所以存在以下安全问题:
- 使用明文进行通信,内容可能会被窃听,比如被抓包;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装,比如钓鱼网站;
- 无法证明报文的完整性,报文有可能遭篡改,比如强制在线广告植入。
【2】什么是HTTPS协议?
HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是 HTTP 协议的安全增强版本,核心是在 HTTP 的基础上加入了 SSL/TLS 加密层,解决了 HTTP 明文传输的安全隐患,确保客户端与服务器之间的数据交互 “机密、完整、可信任”。
【3】HTTP和HTTPS有哪些区别?
对比维度 | HTTP(HyperText Transfer Protocol) | HTTPS(HyperText Transfer Protocol Secure) |
---|---|---|
安全性 | 明文传输,无加密 / 身份验证,数据易被窃听、篡改、冒充 | 基于 SSL/TLS 加密层,实现身份验证、数据加密、完整性校验,安全可靠 |
核心本质 | 纯应用层协议,直接基于 TCP 传输 | HTTP + SSL/TLS(在 HTTP 与 TCP 之间增加加密层) |
默认端口 | 80 端口(无需额外配置) | 443 端口(需专门配置 SSL/TLS 环境) |
数字证书 | 无需证书,任何服务器可直接提供 HTTP 服务 | 必须配置CA 机构颁发的有效数字证书(如 Let’s Encrypt、Symantec),否则浏览器提示 “不安全” |
性能开销 | 无加密 / 解密、证书校验过程,传输效率略高 | 需额外执行 “证书验证、密钥协商、数据加解密”,有轻微性能损耗(可通过 TLS 优化、CDN 加速缓解) |
浏览器标识 | 地址栏无特殊标记,部分浏览器(如 Chrome)会标注 “不安全” | 地址栏显示绿色小锁图标,点击可查看证书信息,部分场景(如银行网站)显示 “EV 绿色地址栏” |
数据传输过程 | 客户端请求 → 服务器明文响应,全程无加密 | 1. 证书验证 → 2. 协商对称密钥 → 3. 加密传输数据 → 4. 完整性校验 |
【4】加密方式
1.对称密钥加密
对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。
优点:运算速度快;
缺点:无法安全地将密钥传输给通信方。
2.非对称密钥加密
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。
公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。
优点:可以更安全地将公开密钥传输给通信发送方;
缺点:运算速度慢。
【5】HTTPS的工作原理
用户通过浏览器请求https网站,服务器收到请求,选择浏览器支持的加密和hash算法,同时返回数字证书给浏览器,包含颁发机构、网址、公钥、证书有效期等信息。
浏览器对证书的内容进行校验,如果有问题,则会有一个提示警告。否则,就生成随机秘钥X,同时使用证书中的公钥进行加密,并且发送给服务器。
服务器收到之后,使用私钥解密,得到随机秘钥X,然后使用随机秘钥X对网页内容进行加密,返回给浏览器。
浏览器则使用随机秘钥X和之前约定的加密算法进行解密,得到最终的网页内容
文确认加密,hash请求https://xxxxx算法返回证书校验证书发送密钥x生成随机密钥私钥解密,获得X,证书公钥加X密返回加密内容使用x解密网页使用X加密网页内容内容服务器浏览器
感谢你花时间读到这里~ 如果你觉得这篇内容对你有帮助,不妨点个赞让更多人看到;如果有任何想法、疑问,或者想分享你的相关经历,欢迎在评论区留言交流,你的每一条互动对我来说都很珍贵~ 我们下次再见啦!😊😊