HTTP的那些事儿

这篇具有很好参考价值的文章主要介绍了HTTP的那些事儿。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

超文本传输协议(Hyper Text Transfer Protocol,HTTP),它是在计算机世界中的两个点之间传递文本,图片,多媒体等超文本文件的协议。HTTP处在数据链路层,网络层,传输层,应用层中的应用层,基于TCP之上。

HTTP的特点

  1. 应用广泛,各大网站,APP都离不开HTTP的身影
  2. 无状态,和TCP不同,HTTP是无状态的,第一次对话后第二次对话服务端还是不认识客户端
  3. 请求应答。HTTP协议是双向的,一问一答
  4. 可靠传输。HTTP因为是基于TCP的所以不会丢包
  5. 明文传输。早期的HTTP是明文传输的

HTTP的缺点

  1. 随着时代的发展HTTP的性能渐渐达不到要求
  2. 原本明文传输的HTTP不具有安全性
  3. 无状态的特点导致需要通过Cookie为HTTP添加状态

HTTP的优点

  1. 简单,方便扩展。使用扩展出来的Cookie轻松解决无状态问题。
  2. 应用广泛,环境成熟

HTTP在性能上做的努力

在上古时期,HTTP0.9这个版本发送一个HTTP请求就会断开TCP连接,再次发起HTTP请求需要重新建立TCP连接。我们知道一个TCP链接需要3次握手和4次挥手,至少需要3RTT。而一个HTTP请求是2RTT(请求 + ACK确认 + 响应 + ACK确认),一共是5RTT而一次HTTP请求有3 / 5是浪费在TCP上的,造成的时间浪费触目惊心。为了优化这个问题HTTP1.0提供了Connection: Keep-Alive,可以让一个TCP链接排队发送多个HTTP请求。这样多个HTTP请求均摊了TCP链接建立需要的时间,从一定程度上优化了HTTP的性能。

现在的网站需要发送的请求数量和以前不在一个数量级,如果浏览器只能建立一个TCP链接,在这一个TCP链接上排队发送请求,那太慢了,所以浏览器允许针对同一个域名建立6个左右的TCP链接,并发请求网站需要的资源。但是随着时代的发展在一些情况下一个域名并发6个TCP也不太够,所以可以通过域名分片的方式来解决的这个问题,例如jd.com这个域名并发6个,可以将一些静态资源放在static.jd.com这样两个加一起可以并发到12个左右。(浏览器对于TCP并发的限制我理解是防止服务器扛不住)

上面说到一个TCP链接里HTTP请求只能排着队,一个一个请求。我认为这是以下两个原因导致的:

  1. HTTP是请求 - 应答模式的
  2. HTTP是明文的,文本格式的,也就是说只能通过顺序才能识别出响应和请求的对应关系

这个问题就是著名的队头阻塞,请求必须排着队一个一个来,队头处理时间长了那么后面的都得等着。

为了解决这个问题,提升HTTP传输的速度,经过google的努力推出了HTTP2。HTTP2在性能上我理解主要做了两件事:

  • 一个是改变了HTTP文本传输的现状,改成了二进制传输,引入了帧和流的概念,让HTTP的请求和响应可以乱序收发,在很大程度上改善了队头阻塞问题。
  • 另一个是引入了HPACK算法对HTTP头部进行压缩。因为HTTP报文很多都没有实体,而主要的内容是url和对应的query,而头部的字段包括Cookie等信息每次请求都要带上造成了极大的浪费,并且大多数请求过程中这些头部信息都不会修改。为了解决传输过程中HTTP头部过大的问题,HTTP2使用HPACK来对头部内容进行压缩,HPACK引入了动态索引表和静态表的内容,如果头部没有变动,只用传输表中对应的索引,两端根据索引就可以知道传输的头部内容是什么,极大的压缩了HTTP头部的传输数据量,提升传输速度。

到这里HTTP性能已经优化了很多并且一个域名只需要对应一个TCP链接即可。

为什么说HTTP2只是很大程度上解决了队头阻塞问题呢

因为HTTP是基于TCP的,而TCP是可靠传输,在发送一个包之后会再发送一个TCP请求来确认这个包是否传输完成,如果丢了需要重发已确保传输数据的完整性,在网络差的环境下TCP也会因为丢包导致阻塞,TCP需要等待包全都收到之后才会将收到的包一起交给应用层。为了解决这个问题google又推出了HTTP3革了HTTP2的命。HTTP3是基于QUIC的。QUIC是应用层协议,它基于UDP而不是TCP,所以QUIC没有上面说到的阻塞问题,当然QUIC也是在UDP上实现了可靠传输的能力,换句话说QUIC协议取了TCP的精华。为什么不在TCP上直接改呢?我理解应该是改不动,老设备兼容是一个要命的事,所以只能新推出一个协议QUIC

到这里对于协议本身的优化就告一段落了。

除了对于协议本身的优化,还可以通过Content-Encoding: gizp来压缩实体体积,让传输的数据量减少,进一步提升HTTP传输数据的速度。

HTTP在安全上做的努力

HTTP在安全上其实没做啥努力,在努力的其实是背后的SSL/TLS。

什么是安全性?

安全性由四大部分组成,分别是机密性、完整性、身份认证和不可否认

HTTP是明文传输的,在传输链路中间,就可能被第三方偷窥(丧失了机密性),篡改(丧失了完整性),发送请求的对象也不知道是谁(丧失了身份认证),无法确保完整和身份认证,那么对方完全可以否认发过这个消息(丧失了不可否认性)。

SSL/TLS实现了HTTP的安全性,所以安全的HTTP被称为HTTPS。

可以考虑下在不受信任的网络环境中怎么才能安全的通信呢?

第一个想到的就是对通信内容进行加密,通过一套加密规则,配合上秘钥对通信内容加密,这样我们在网络中发送的是密文,即使第三方截获也无法破解。但是问题来了,这个秘钥怎么给到对方呢?通过网络吗?那不是被截获之后还是被轻松解密吗?可以再对秘钥加密一下,那用于加密秘钥的秘钥咋弄?所以只用对称加密的方式秘钥交换就成了问题。

机密性

这就轮到另一种加密方式出场了,非对称加密。和加密解密使用同一个秘钥的对称加密不同,非对称加密有两个秘钥,一个公钥(可以给所有人),一个私钥(只能自己持有,需要保密),公钥加密的内容只有私钥可以解密,反过来私钥加密的内容只有公钥可以解密。

有了新工具非对称加密,服务端可以将自己的公钥下发给客户端,这样客户端可以使用公钥将对称加密的秘钥加密给到服务端,服务端使用自己的私钥解密拿到对称加密的公钥开始接下来的加密通信。事情好像完美解决了。

但是话说回来为什么不直接使用非对称加密加密通信内容,而是要加密对称加密的秘钥?

这是因为对称加密和非对称加密的计算速度差了好几个数量级,所以为了提升速度非对称加密只用于交换秘钥。

通过这一套方法实现了HTTP的机密性。但是除了机密性,安全性中还剩下完整性,身份认证和不可否认这三个事情。

完整性

虽然现在实现了HTTP的机密性,但是第三方还是可以截获机密的报文对报文篡改后重新发送给服务端,收集足够多的报文尝试做够多次,可以根据服务器的不同返回值观察总结从而破解出秘钥(具体咋操作我也不清楚)。所以如果服务器可以知道这个报文在中途被篡改过,那么就不响应就大大提升了通信的安全性。

为了增加完整性,需要引入摘要算法,摘要算法可以将任意长度的数据压缩成定长,并且摘要算法具有雪崩效应,对于原文的一点改动生成的摘要则完全不同,同时摘要算法生成的摘要不可逆。

我们可以通过摘要算法生成原始数据的摘要,并附上原始数据一起发送给对方,这样如果被修改过,那么肯定和摘要是对不上的。当然通信必须要建立在机密性之上,否则连原文和摘要一起改那也就束手无策了。

到这里完整性和机密性都具备了,还差身份认证和不可否认。

身份认证和不可否认

为什么有了机密性和完整性本次会话还是不安全的呢?问题出在了通信的两个端点上,到目前为止,客户端只知道服务端的一个公钥,但是这个公钥谁都能拿到,客户端并不知道这个公钥就是公钥所有者给它的。为了证明公钥来自所有者,可以让服务端使用自己的私钥给上面提到的摘要签名,因为私钥是所有者私有的别人不会知道。客户端收到消息之后会进行验签。首先对报文内容生成摘要,再使用公钥解密服务端发送过来的数字签名,两者进行对比,如果一致则表示没问题,认证了公钥和私钥确认配对,同时这个消息确实是这个公钥所有者发出的。同时实现了身份认证和消息的不可否认性。

数字证书和CA

这就完了吗?既然有这个问题那么就说明肯定没完。

公钥的信任问题,客户端怎么知道这个公钥就是jd.com的公钥呢?中间人完全可以使用自己的一套公钥和私钥,给客户端一套自己的公钥完成上面说的流程也完全实现了安全性的四个要求(我理解这就是抓包工具抓取HTTPS包的实现原理)。所以事情还没结束。

服务端的公钥不可信,怎么办?这时需要有三方力量介入,告诉客户端这个公钥确实是jd.com这个域名的。怎么告诉呢?通过给这个公钥颁发数字证书,为这个公钥和jd.com这个域名等其它信息生产摘要,再使用颁发证书这个机构自己的私钥给这个摘要签名,这些信息一起打包生成一个数字证书。

客户端拿到这个证书之后,会使用证书中的公钥验证一下这个证书有没有被篡改过,然后看下jd.com这个域名和他的公钥是否对的上。

问题又来了,这个机构的公钥是不是真的?为什么要相信这个机构办法的证书呢?为了解决这个问题,这个机构需要再找一个机构来帮它证明一下。这么看来这件事没有止境了。所以我们必须要相信有几个机构的证书是可信的,否则这个体系就走不下去了。这些机构颁发的证书就是根证书是信任链的起点。这些根证书是被内置在系统中的,当验证走到这一层时就表示之前获得的证书是可信的。

是可信的吗???没有绝对的安全,比如说这个根证书机构搞错了,受到了欺骗,将自己的证书颁发给了失信机构,这就是不安全的。再比如说这个机构被黑客攻击了随意颁发证书。。。所以针对这两种情况,第一会采取证书吊销的方式规避风险,而第二种则可以将这个机构的根证书从系统中删除,让这个机构颁发的证书都不被信任。

参考

极客时间HTTP透视协议专栏文章来源地址https://www.toymoban.com/news/detail-414383.html

到了这里,关于HTTP的那些事儿的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【网络编程】一文详解http协议(超文本传输协议)

    【网络编程】一文详解http协议(超文本传输协议)

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。    目录 一、http协议 1、http协议的介绍 2、URL的组成 3、urlencode和urldecode 二、http的请求方法、状态码及状态码描述、常见的响

    2024年02月06日
    浏览(14)
  • 【Java网络编程】HTTP超文本传输协议

    【Java网络编程】HTTP超文本传输协议

        HTTP 全称为 Hyper Text Transfer Protocol 超文本传输协议,它是基于 TCP 传输协议构建的应用层协议,作为支撑万维网 www 的核心协议,为了保证其效率及处理大量事务的能力,因此在设计时, HTTP 被制定成为一种无状态协议,也就是说: HTTP 本身不会对发送过的请求和相应的通

    2024年04月09日
    浏览(10)
  • 直播程式源码平台细讲HTTP协议:超文本传输

    直播程式源码平台细讲HTTP协议:超文本传输

    HTTP协议的简介   HTTP协议是一种数据通信协议,是浏览器与服务器之间的协议,HTTP协议的中文全称为超文本传输协议,HTTP协议在直播程式源码平台中,承载着数据传输的重要任务,用户可以通过HTTP协议获取直播程式源码平台中提供给用户的信息与视频资源,并通过网络流传

    2024年02月10日
    浏览(5)
  • https是什么意思?(安全超文本传输协议)

    在逛论坛的时候发现有网友说到IE打不开HTTPS的情况,在论坛上的留言发现有部分网友说到还不知道什么是HTTPS?那么 HTTPS是什么意思? 所以yii666就在这里跟大家详细讲解HTTP的具体含义。内容如下: HTTP(hypertext transport protocol) HTTP相信大家有见到过,HTTP它所代表的就是超文

    2024年02月05日
    浏览(8)
  • web服务之https超文本传输安全协议

    web服务之https超文本传输安全协议

    超文本传输协议HTTP协议 被用于在 Web浏览器和网站服务器 之间传递信息 HTTP协议 以 明文方式 发送内容, 不提供任何方式的数据加密 ,如果 攻击者 截取了 Web浏览器和网站服务器之间的传输报文 ,就可以直接读懂其中的信息,因此HTTP协议 不适合传输一些敏感信息 ,比如

    2024年03月12日
    浏览(6)
  • HTTPS安全套接字层超文本传输协议

    HTTPS安全套接字层超文本传输协议

    HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付

    2024年02月15日
    浏览(8)
  • 超文本传送协议HTTP

    超文本传送协议HTTP

    目录 HTTP简介: URL的格式: HTTP协议的特点: HTTP/1.0协议: HTTP/1.1协议: HTTP/2: HTTP代理服务器: HTTP的报文结构: 请求报文的特点: 响应报文的特点: Cookie:  Cookie的工作原理: 万维网的文档: 静态文档: 超文本标记语言HTML 可扩展标记语言XML 可扩展超文本标记语言 XHT

    2024年02月20日
    浏览(6)
  • HTTPS(超文本传输安全协议)被恶意请求该如何处理。

    HTTPS(超文本传输安全协议)被恶意请求该如何处理。

    HTTPS(超文本传输安全协议)端口攻击通常是指SSL握手中的一些攻击方式,比如SSL握手协商过程中的暴力破解、中间人攻击和SSL剥离攻击等。 攻击者控制受害者发送大量请求,利用压缩算法的机制猜测请求中的关键信息,根据response长度判断请求是否成功。 攻击者可以控制的

    2024年02月21日
    浏览(8)
  • vite中配置 https 安全超文本网络协议

    vite中配置 https 安全超文本网络协议

    前言: https 的配置是相对安全的,但是需要购买证书,它是 SSL/TLS + HTTP 的安全超文本网络协议 此版本配置的是在 vite 开发服务器上临时配置的 https 协议, 生产环境需要购买证书, 在nginx 中配置 在 vite 项目根目录中创建 mkcert 目录 全局安装 mkcert yarn add -g mkcert 利用 mkcert 创

    2024年02月04日
    浏览(7)
  • 8.物联网LWIP,简要介绍http(超文本,URL),html(css,ajax),web实现打开灯

    8.物联网LWIP,简要介绍http(超文本,URL),html(css,ajax),web实现打开灯

    一。HTTP详解 1.超文本:(HyperText) (1)超文本文件彼此链接,形成 网状 (web),内含有 超链接 (Link)与各种 媒体元素标记 (Markup)。 (2)超文本文件彼此 链接使用URL 表示。(下面解释URL) (3)常见超文本格式是 超文本标记 语言 HTML 。(下面解释HTML,代码) 综上

    2024年02月10日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包