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://www.cnblogs.com/study-everyday/p/6869955.html
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 ...
随机推荐
- 并发编程-synchronized关键字大总结
0.synchronized 的特点: 可以保证代码的原子性和可见性. 1.synchronized 的性质: 可重入(可以避免死锁.单个线程可以重复拿到某个锁,锁的粒度是线程而不是调用).不可中断( ...
- webpack3.0之loader配置及编写(一)
loader 用于对模块的源代码进行转换.loader 可以使你在 import 或"加载"模块时预处理文件.loader 可以将文件从不同的语言(如 TypeScript)转换为 ...
- js的数组与对象关系
有的时候总犯糊涂,不理解对象和数组的关系,转载一篇文章,深刻记忆一下 http://hi.baidu.com/samdan/item/05179313d1ee4b9e99ce3371 比如有一个数组a ...
- 【C#笔札】Tryparse的用法
这是参考读物的上得一个例子.自己仿照做的作业 private void button1_Click(object sender, EventArgs e) { int P_int_Number,i; ...
- js比较时间大小(时间为以-分割的字符串时)
function dateCompare(startdate, enddate) { var arr = startdate.split("-"); var start ...
- 有效二叉查找树判断(java实现)
leetcode 原题 :(即判断二叉树是否为二叉查找树) Given a binary tree, determine if it is a valid binary search tree (BS ...
- 在jenkins和sonar中集成jacoco(三)--使用jacoco收集集成测试的覆盖率
我们系统使用weblogic做服务器,集成测试框架使用的是junit+selenium. 首先,要把jacoco的jacocoagent.jar包放到部署应用的服务器上,接着在系统服务的JAVA_OP ...
- jdk1.8的lambda语法(转)
原文链接:http://www.jb51.net/article/115081.htm 代码: package com.jdk_8; import org.junit.Test; import jav ...
- vue: register and import
components/header-nav/menu-nav.vue <template> <div> menu nav </div> </template& ...
- windows下jenkins安装过程中的那些坑
在jenkins官网https://jenkins.io/download/下载2.89.4版本的war包,使用jar -jar jenkins.war命令安装,报端口被占的错误,使用jar -jar ...