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》
HTTP 和 HTTPS的更多相关文章
- 【流量劫持】躲避 HSTS 的 HTTPS 劫持
前言 HSTS 的出现,对 HTTPS 劫持带来莫大的挑战. 不过,HSTS 也不是万能的,它只能解决 SSLStrip 这类劫持方式.但仔细想想,SSLStrip 这种算劫持吗? 劫持 vs 钓鱼 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- 7.让网站支持http和https的访问方式
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 怎么让网站在本地支持SSL?http://www.c ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 猖獗的假新闻:2017年1月1日起iOS的APP必须使用HTTPS
一.假新闻如此猖獗 刚才一位老同事 打电话问:我们公司还是用的HTTP,马上就到2017年了,提交AppStore会被拒绝,怎么办? 公司里已经有很多人问过这个问题,回答一下: HTTP还是可以正常提 ...
- WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果
前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
- 【原创】免费申请SSL证书【用于HTTPS,即是把网站从HTTP改为HTTPS,加密传输数据,保护敏感数据】
今天公司有个网站需要改用https访问,所以就用到SSL证书.由于沃通(以前我是在这里申请的)暂停了免费的SSL证书之后,其网站推荐了新的一个网站来申请证书,所以,今天因为刚好又要申请一个证书,所以, ...
- https 安全验证问题
最近为了满足苹果的 https 要求, 经过努力终于写出了方法 验证 SSL 证书是否满足 ATS 要求 nscurl --ats-diagnostics --verbose https://你的域名 ...
- Ubuntu下配置apache开启https
一.HTTPS简述随着网络的日常,信息安全越来越重要,传统的网站都是http协议明文传输,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比http协议安全. 那ht ...
随机推荐
- 【Electron】Electron开发入门(七):打开本地文件或者网页链接 and webview里操纵electron api
1.打开本地文件或者网页链接 // 打开系统本地文件 const {shell} = require('electron'); // Open a local file in the default ...
- SSH程序框架的整合(1)
spring整合hibernate 有两种方式 1.注解方式 2.xml方式实现 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory ...
- Xamarin android 的WebClient Json下载并存储本地及sqlite数据库
这一点雕虫小技可能对熟悉的人来说已经不值一提.但是我想,既然这些都是常用的功能,集成在一起做个笔记也有点意义吧. 首先,json 是传递数据的事实标准了.所以先说一下将它从服务器端下载下来..net ...
- POPTEST老李分享DOM解析XML之java
POPTEST老李分享DOM解析XML之java Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...
- MyBatis 源码分析——动态SQL语句
有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...
- Python第一天接触心得
最近想学Python,就开始看教程下载,官网是https://www.python.org/downloads/,最新版本是3.6.1, 注意:x86-64表示适用于windows 64位系统:x86 ...
- 使用 nvm 来管理nodejs版本 。
最近需要升级一下node版本,所以使用nvm搞一搞. 1. 下载 nvm 在 github 下载非安装版本的nvm包https://github.com/coreybutler/nvm-windows ...
- SSL证书的生成方法
在Linux下,我们进行下面的操作前都须确认已安装OpenSSL软件包. 1.创建根证书密钥文件root.key: [root@mrlapulga:/etc/pki/CA/private]#opens ...
- react中,constructor和getInitialState的区别
1,ES6语法 使用class声明一个类,且要继承react组件的方法和属性的时候 : 在里面我们可以直接指定 this.state = { }, 我们可以当前组件内任何地方使用 this.setSt ...
- AngularJs 4大核心
放弃了IE8, 4大核心: MVC: 数据模型,视图层,业务逻辑和控制模式(控制器), 为何MVC不是设计模式呢?(23种设计模式里没有MVC,MVC模式的目的就是实现Web系统的职能分工,超越了设计 ...