HTTP 和 HTTPS

一、HTTP协议

最近看了一些网络通信方面的书籍,研究了一下 HTTP 和 TCP/IP,有了一些新的收获和理解,在这里做个归纳和总结。

(1)什么是HTTP协议

HTTP (HyperText Transfer Protocol,超文本传输协议) 是一种通信协议,是指计算机网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端,是互联网上应用最为广泛的一种网络协议。

(2)一种无状态协议

HTTP协议是不保存状态的协议,即HTTP是无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过来的请求或响应都不做持久化处理。

使用HTTP协议,每当有新的请求发送时,就会有对应的新的响应产生。协议本身不保留之前一切的请求或响应报文的信息。也就是说,无法根据之前的状态进行本次请求的处理。

无状态优点: ①更快地处理大量事务,确保协议的可伸缩性。②由于不必保存状态,这就可以减少服务器的CPU及内存资源的消耗。

HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

Cookie会根据从服务器端发送的响应报文类中的Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往服务器发送请求时,客户端会自动的请求报文中加入Cookie值后发送出去。服务器端接收到客户端发送过来的Cookie后,回去检查究竟是从哪一个客户端发来的请求,然后对比服务器上的记录,最后得到之前状态的信息。

(3)HTTP方法

HTTP/1.0 和 HTTP/1.1支持的方法

其中LINK 和 UNLINE 已被HTTP/1.1废弃,不再支持。

(4)HTTP协议的报文

用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的HTTP报文叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。

HTTP报文包括以下三部分:

1. 报文首部

客户端或服务器端需处理的请求或响应的内容及属性。包括:请求行(包含用于请求的方法,请求URI,HTTP版本),状态行(包含表明响应结果的状态码,原因短语,HTTP版本),首部字段(包含表明请求和响应的各种条件和属性的各类首部)。

2. 空行

CR+LF,CR(Crriage Return,回车符) 和 LF(Line Feed,换行符)。

3. 报文主体

应被发送的数据。

请求报文和响应报文的示例图:

(5)HTTP持久化连接

1. 持久连接

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接,增加了通行量的开销。

为了解决上述TCP的问题,HTTP/1.1推出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive 或 HTTP connection reuse)的方法。

持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。

优点:减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度就相应提高了。

在HTTP/1.1中,所有连接默认都是持久连接,但在HTTP/1.0内并未标准化。

2. 管线化

持久连接使得多数请求以管线化方式发送成为可能。之前发送请求后需等待并收到响应之后,才能发送下一个请求。管线化技术出现后,不用等待响应就可直接发送下一个请求。

(6)HTTP结果的状态码

HTTP状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。通过状态码,用户可以知道服务器是正常的处理了请求,还是出现了错误。

每条HTTP响应报文返回时都会携带一个状态码,状态码是由一个三位数字和原因短语组成,如200 OK。数字的第一位是响应类别(状态码类别),后两位无分类。

5种状态码的类别:

只要遵守状态码类别的定义,及时改变RFC2616总定义的状态码,或服务器端自行创建装条码都没问题。

几个常见的状态码:

  • 200 OK。  表示从客户端发来的请求在服务器端被正常处理了。
  • 204 No Content。 表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体。一般在只需要重客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
  • 301 Moved Permanently。 永久性重定向。表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这是应该按Location首部字段提示的URI重新保存。
  • 302 Found。 临时性重定向。表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
  • 304 Not Modified。 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,其实和重定向没有关系。
  • 400 Bad Request。 表示报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
  • 401 Unauthorized。 表示发送的请求需要通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。若之前已经进行过1次请求,则表示用户认证失败。
  • 404 Not Found。 表示服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
  • 500 Internal Server Error。 表示服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
  • 503 Service Unavailable。 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况所需要的时间,最好写入Retry-After首部字段再返回给客户端。

(7)常见的疑问

1. HTTP 和 TCP/IP 的区别

TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。

详细点说就是,我们在传输数据的时候,可以只使用 TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

2. URI、URL、URN 的区别

URI:Uniform Resorce Identifier,统一资源标识符。

URL:Uniform Resource Locator,统一资源定位符。

URN:Uniform Resource Name,统一资源名称。

URI用字符串表标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。

三者关系图:

如果是一个人,我们会想到他的姓名和住址。URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。

二、HTTPS 协议

(1)为什么要使用HTTPS

上面已经介绍了HTTP协议,虽然HTTP协议用的很普遍,但是它也有些不足。列举如下:

  • 通信使用明文(不加密),内容可能会被窃听。
  • 不验证通信方的身份,因此有可能遭遇伪装。
  • 无法验证报文的完整性,所以有可能已遭篡改。

这些问题不仅在HTTP上出现,其他未加密的协议中也会存在这类问题。

为了统一解决上述这些问题,需要在HTTP上在加入加密处理和认证等机制。我们把添加了加密及认证机制的HTTP称为HTTPS(HTTP Secure)。

简单的说,其实  HTTPS = HTTP  +  加密  +  认证  +  完整性保护。

经常会在Web的登录页面和购物结算界面使用HTTPS通信。使用HTTPS通信时,不再用http://,而是改用https://。当浏览器访问HTTPS通信有效的Web网站时,浏览器的地址栏会出现一个带锁的标记。

(2)特殊的HTTP

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socker Layer)和 TLS(Transport Layer Security)协议代替而已。

通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓HTTPS,其实就是身披 SSL 协议这层外壳的HTTP。

TLS/SSL 是独立于HTTP的协议,是介于 TCP 和 HTTP 之间的一层安全协议,不影响原有的 TCP 协议和 HTTP 协议,所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。不光是HTTP协议,其他运行在应用层的SMTP 和 Telnet等协议均可配合SSL协议的使用。

(3)为什么不都使用HTTPS

既然HTTPS那么完全可靠,那为何所有的Web网站不一直使用HTTPS?

主要是因为以下几个原因:

1. 与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。

如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能处理的请求数量必定会随之减少。因此,如果是非敏感信息还是用HTTP通信,只有在包含个人敏感数据时,才利用HTTPS加密通信。特别是每当那些访问量较多的Web网站在进行加密处理时,并非对所有内容都进行加密处理,而是仅对那些需要信息隐藏时才会加密,以节约资源。

2. 节约购买证书的开销。

要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格根据不同的认证机构略有不同,一年几百到几千的都有,那些购买证书并不合算的服务以及一些个人网站,可能只会选择采用HTTP的通信方式。

3. HTTPS使用SSL时,它的处理速度会变慢。

SSL的慢有两种,一是通信慢,二是大量消耗CPU及内存等资源,导致处理速度变慢。和HTTP相比,网络负载可能会慢2到100倍。除去和TCP连接、发送HTTP请求和响应以外,还必须进行SSL通信,因此整体上处理通行量不可避免会增加。SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。当然,可以通过使用SSL加速器这种硬件来改善该问题。

本文主要收集整理自《图解HTTP》

时间: 2024-10-13 10:09:14

HTTP 和 HTTPS的相关文章

屏谖畔涨善ab63gro0l16rstpb58

中新社首尔4月13日电 (记者 吴旭)韩国第20届国会议员选举于当地时间13日18时结束投票.据韩国中央选举管理委员会公布的初步统计数据显示,本届国会议员选举投票率为58%,较上一届高出3.8个百分点.最终确定投票结果将于14日上午予以公布.从选区来看,全罗南道.全罗北道投票率领先,均突破60%,而大邱.釜山.京畿道及仁川地区投票率则低于平均值.在选举"主战场"首都圈地区,首尔以59.8%的投票率超出均值.根据目前初步统计结果,本届选举的投票率虽然没有超过事前预测的60%,但较第18届

噬鸵叟客切q08c365s

新华社瓦莱塔4月10日电(记者李拯宇 李佳)全国政协主席俞正声10日在前往非洲三国进行正式友好访问途中过境马耳他,在瓦莱塔会见马耳他议长法鲁贾. 俞正声说,中马保持长期友好关系,政治上相互信任,经济上密切合作,人文交流不断深化.中方感谢马方在中国撤侨行动中给予的支持和帮助.中方愿同马方一道,落实两国领导人达成的共识,弘扬中马传统友好,拓展在科技.渔业.旅游等领域互利合作,打造合作新亮点.中国全国政协愿与马耳他议会和社会各界保持密切交往,加强治国理政经验交流,为两国扩大务实合作营造良好环境,共同促

蚜戮苛裂退q47uc785b3

新华社瓦莱塔4月10日电(记者李拯宇 李佳)全国政协主席俞正声10日在前往非洲三国进行正式友好访问途中过境马耳他,在瓦莱塔会见马耳他议长法鲁贾. 俞正声说,中马保持长期友好关系,政治上相互信任,经济上密切合作,人文交流不断深化.中方感谢马方在中国撤侨行动中给予的支持和帮助.中方愿同马方一道,落实两国领导人达成的共识,弘扬中马传统友好,拓展在科技.渔业.旅游等领域互利合作,打造合作新亮点.中国全国政协愿与马耳他议会和社会各界保持密切交往,加强治国理政经验交流,为两国扩大务实合作营造良好环境,共同促

中三他身东取必信史规不

对啊我恍然大悟凌月果然心细如尘啊 但是凌月的雪却隐藏着绝强的杀伤力下一刻突然一大片冰雪在血饮的人群中爆开顿时傲世狂人和傲世嗜血均是大惊失色忍不住道居然那么高的防御 但是级别却只有级而已不过这已经足以傲视群雄了因为我的等级已经一下子窜到了中国排名的第位只要再努力一把完全可以在等级榜上崭露头角了顿时傲世狂风和傲世狂剑两个大惊失色注已经全部被吸引了过去不客气就不客气谁怕谁啊但是这一切也只是为了杀最后的而清理路障而已那个食人魔首领才是我们真正此行的目的嗯出去吃夜宵吧秦韵亲手做的 嗯那好吧凌雪又叮嘱了我一

Charles关于Https SSLHandshake解决备忘录

抓包Https时错误提示:SSLHandshake: Received fatal alert: unknown_ca 1.准备工作,下载Charles版本 有情链接,提取码为:ghc6,其中包含了Charles两个版本 a Charles3.9.3 主要针对iphone5手机抓包 b Charles4.1.2 主要针对iphone6及以上抓包 为什么用两个不同版本?实践中发现,某一个版本不能同时解决问题 2.设置允许SSL Proxy Proxy->Proxy Settings->SSL-&

http升级https的时候,遇到一个问题

问题: Mixed Content: The page at 'https://api.xxxx.com/test' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://api.xxxx.com/test'. This request has been blocked; the content must be served over HTTPS. 添加这个: <meta http-equ

利用Wireshark 解密HTTPS流量

在我之前的一篇文章中已经介绍了一种解密HTTPS流量的一种方法,大致方法就是客户端手动信任中间人,然后中间人重新封包SSL流量. 文章地址: http://professor.blog.51cto.com/996189/1746183 -------------------------------------------------------------------------------------- 今天给大家介绍另外一种解密HTTPS流量的方法. Wireshark 的抓包原理是直接读取

HTTPS 路径配置

1: 首先安装 fiddlercertmaker.exe 文件 2:Tools  -> HTTPS 3: Connections 勾中Allow remote computer to connect

Https 忽略证书\使用自定义证书的java代码实现

public SSLContext createIgnoreVerifySSL() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { SSLContext sc = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] ar

nginx建https站实验

简单的lnnmp传输拓扑图 Nginx1主要是对外网提供网站服务,既然是对外网的提供服务器,那么我们就要考虑问题了.外网的网络带宽有限,这里对外网的传输我们就使用压缩传输:同时我们也希望数据的安全性,这里也需要提供https的加密传输:最重要的一点是这台服务器可以向后端转发客户端的请求. Nginx2提供动态和静态数据给前端Nginx1,这里有一个非常严重的问题,这台主机不处理动态数据只是把动态数据转发给php-mysql,假如直接让代理服务器Nginx1把请求转发到php-fpm上. mysq