HTTP-协议核心组件与安全扩展深度解析
HTTP 协议核心组件与安全扩展深度解析
一、什么是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 :
- Content-Length字段:服务器在响应数据时,会通过 Content-Length 字段,表明本次响应数据的长度。
例如:Content-Length: 1000- Connection 字段:Connection字段用于浏览器要求服务器使用长连接,以便其他请求复用该连接。
例如:Connection: keep-alive- Content-Type 字段:Content-Type 字段用于服务器响应时,告诉浏览器,本次响应数据的内容类型。
例如:Content-Type: text/html; charset=utf-8- Accept 字段:Accept 字段用于浏览器发起请求的时候,声明可以接受哪些响应数据格式。
例如:Accept: /- Content-Encoding 字段:Content-Encoding 字段说明数据的压缩方法,表示服务器响应的数据使用的压缩格式。
例如:Content-Encoding: gzip- Accept-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加密网页内容内容服务器浏览器
感谢你花时间读到这里~ 如果你觉得这篇内容对你有帮助,不妨点个赞让更多人看到;如果有任何想法、疑问,或者想分享你的相关经历,欢迎在评论区留言交流,你的每一条互动对我来说都很珍贵~ 我们下次再见啦!😊😊