协议系列之HTTP协议
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览器更加高效,使网络传输降低。保证计算机正确高速地传输超文本文档。如今我们普遍使用的版本号是HTTP1.1。
HTTP是一个应用层协议,它由请求和响应组成。是一个标准的B/S模型。它也是一个无连接的协议,这里无连接指的是每次连接仅仅处理一个请求,server处理完client请求后便断开连接;同一时候,它也是一个无状态的协议,那么什么是无状态呢?简单地说就是同一个client,这次请求跟上一次请求是没有相应关系的。
HTTPS简单地说就是HTTP的安全版。通常在安全性要求比較高的站点(比如银行站点)会看到HTTPS,它本质事实上也是HTTP协议,仅仅是在HTTP添加了一个TLS或SSL协议层。如图2-2-6-1。假设在TCP协议上加一层TLS或SSL协议。就是HTTPS协议了。TLS\SSL提供了加密的机制,所以它比HTTP明文传输更安全。图中能够看出,HTTP能够直接进入TCP传输层;也能够在TCP层上加一层TLS\SSL层,这样就先经过TLS\SSL再进入TCP传输层。这两种方式便是HTTP与HTTPS。
一般HTTP的port为80。而HTTPS的port为443。
图2-2-6-1 HTTP协议层
简单地说。SSL\TLS协议层基本的职责就是借助下层协议的信道安全地协商出一份加密密钥,而且用此密钥来加密HTTP请求响应报文。它攻克了下面三个安全性方面的议题:①提供认证服务,认证本次会话实体身份的合法性。②提供加密服务,强加密机制能保证通信过程中的消息不会被破译。
③提供防篡改服务,利用Hash算法对消息进行签名。通过验证签名保证通信内容不被篡改。
HTTPS运用越来越广泛。并且在安全场景中是一个非常好的解决方式,一般作为解决安全传输的首选解决方式。那么还是有必要略微深入了解一下HTTPS的工作原理及流程。
在理解HTTPS工作原理前,先了解一些加密解密算法与Hash算法:(1)对称加密。
密钥仅仅有一个。加密解密都是这个password,加解密速度快,典型的对称加密算法有DES、AES、RC4等。(2)非对称加密。密钥成对出现。分别为公钥跟私钥。公钥无法推知私钥。反之私钥也不能推知公钥。
加密解密使用不同密钥,公钥加密须要私钥解密,反之私钥加密须要公钥解密。
非对称加密速度较慢,典型的非对称加密算法有RSA、DSA、DSS等。(3)Hash算法,这是一种不可逆的算法,我们经常使用于验证数据的完整性。
图2-2-6-2具体描写叙述了HTTPS完毕一次通信要做哪些事情。
首先。因为HTTPS是基于TCP/IP通信的,属于可靠传输,那么必需要先进行3次握手,完毕连接建立。接下去的是SSL的握手协议。此协议很有效的让客户和server之间完毕相互之间的身份认证。第一步,client浏览器向server发送SSL\TLS协议的版本、加密算法的种类、产生的随机数、以及其他需要的各种信息。第二步。server从client支持的加密算法中选择一组加密算法与Hash算法,而且把自己的证书(包括站点地址、加密公钥、证书颁发机构等)也发送给client。
第三步。浏览器获取server证书后对其合法性进行验证,颁发机构是否合法。证书中的网址是否与正在訪问的地址一致,通过验证的浏览器会显示一个小锁头,否则提示证书不受信。
第四步,client浏览器生成一串随机数并用server传来的公钥加密,再使用约定好的Hash算法计算握手消息,发送到server端。
第五步,server接到握手消息后用自己的私钥解密,并用Hash算法验证,这样两方都有了此次通信的密钥。第六步,server再使用密钥加密一段握手消息,返回给client浏览器。
第七步,浏览器用密钥解密。并用hash算法验证。确定算法跟密钥。完毕以上七步后两方就能够利用此次协商好的密钥进行通信。
图2-2-6-2 HTTPS的工作原理及流程
HTTP请求响应模型
从某种意义上来说,HTTP协议永远都是由client发起请求。server进行响应。并发送回响应报文。假设没有client进行请求或以前请求,那么server端是无法将消息推送到client的。http协议採用了请求/响应模型。一个http请求跟响应一般如图2-2-6-3所看到的,client向server发送一个请求,请求头包括请求方法、URI、协议版本号、请求修饰符、客户信息、类似于MIME结构的消息内容。server以一个状态行作为响应。内容包括消息协议版本号、成功或失败编码、server信息、实体元信息及一些实体内容。这样就完毕了一个请求响应过程。
图2-2-6-3 HTTP请求响应模型
通常。把一次http操作称为一个事务。而它的工作流程大概能够用下面四点来概括:
開始工作。client浏览器先要与server建立连接,即是通过三次握手建立连接。在浏览器上最简单的就是点击一个超级链接,就触发了连接建立。
连接建立后,client浏览器发送一个请求到server,这个过程事实上是组装请求报文的过程,具体的报文格式与解析会在下节展开。
server端接收到请求报文后,对报文进行解析,组装成一定格式的响应报文,返回给client。
client浏览器接收到响应报文后。对其进行解析,并通过浏览器内核。依照一定的外观进行显示,然后与server断开连接。
解析HTTP报文
上节我们了解了http请求响应模型,那么具体请求与响应报文格式是如何的。报文又是如何被解析的?这节将具体展开讲述。想要深入理解webserver就必须对http报文熟悉,正所谓练拳先练功。要研究tomcatserver就要先对http报文有一定的了解。http报文是面向文本的,报文中每一个字段都是一些ascii码串。它包含请求报文和响应报文。
首先看看http请求报文,一个http请求由三部分组成:请求行、请求头部、请求体。图2-2-6-4具体展示了一个http请求报文的结构与具体的字段意义。
请求行,由请求方法字段、URL字段和http协议版本号字段组成,他们用空格分隔。请求头部。包括若干个属性与属性值,他们通过冒号分隔,格式为“属性名:属性值”,server据此获取client的信息;请求体。一般在POST方法里使用。而不在GET方法中使用。
它将表单中得组件格式化成param1=value1¶m2=value2键值对组,即用来存放请求參数数据。但有时也用来存放请求URL。
请求方法中GET和POST是最常见的,除此之外还包含DELETE、HEAD、OPTIONS、PUT、TRACE。当我们点击网页链接或在浏览器输入网址訪问时,就是用了GET方法,请求參数和值附加在URL后面。用问号隔开,如,/index.jsp?
id=10000,用GET方法传递的參数都能在地址栏上看到,大多浏览器对地址的字符长度做了限制。一般最多是1024个字符。所以,要传送大量数据的话,要选择用POST方法。POST方法同意client提交很多其他信息给server。它把请求參数封装到请求体中,能够传输大量数据,不会对数据大小进行限制。同一时候也不在地址栏显示參数。
其他方法比較少用。不再展开,可查找相关资料。
请求头部经常使用的典型属性有下面几种:
User-Agent:client请求的浏览器类型,更确切地说是client应用程序的名称,不同版本号、不同厂商的值都可能不同样。
Accept:告诉serverclient可识别的媒体类型列表。这个属性的值能够是一个或多个MIME类型的值。server能够依据这个推断发不发送这个媒体类型。
Host:为server提供client想要訪问的那台机器的因特网主机名和port号。
Cookie:用于传输client的cookie到server,server维护的session就是通过cookie附带的jsessionid值来区分的哪个client关联哪个session的。
当然,我们还能够通过重写URL的方式将jsessionid附带在URL后面。
Referer:表示这个请求是从哪个URL过来的,能够让server知道client从哪里获得其请求的RUL。假设在A主页点击一个连接进入主页B,浏览器就会在请求中插入一个带有A的Referer头部。
Cache-Control:通过这个属性能够对缓存进行控制。它是一个缓存指令,指定了对某个对象的可缓存性有关的缓存特有指令。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lhbmd6aGl6aG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
图2-2-6-4 HTTP请求报文
接着看HTTP响应报文,跟请求报文一样由三部分组成:响应行、响应头、响应体。如图2-2-6-5,响应行包括协议及版本号、状态码及其描写叙述。
响应头包括了若干个属性与属性值,他们通过冒号分隔。格式为“属性名:属性值”,client能够通过这个获取相关信息。响应体一般存放我们真正须要的文本。
响应状态码由三位数字组成,经常使用的状态码例如以下:
200 OK:client请求成功。
400Bad Request:client请求由语法错误。server无法识别。
401 Unauthorized:请求未经授权。
403Forbidden:server收到请求,但拒绝提供服务。
404Not Found:请求资源不存在。
500Internal Server Error:server发生不可预期的错误。
503Server Unavailable:server当前不能处理client的请求,一段时间后可能恢复正常。
经常使用的的响应报文头属性:
Cache-Control:server通过该报文头属性告诉client怎样对响应的内容进行缓存,比如值为max-age=600。则表示client对响应内容缓存600秒,在此期间假设client再次訪问该资源,直接从client缓存中获取内容,不再向server获取。
Location:这个属性用于网页重定向,比如server把重定向的地址加入到响应包头的这个属性。这样client浏览器解析报文后就直接又一次跳转到这个地址。
Set-Cookie:利用这个属性server端可对client的cookie进行设置。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lhbmd6aGl6aG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
图2-2-6-5 HTTP响应报文
HTTP的版本号
HTTP协议最初设计就是为了通过网络来支持client与server之间的事务处理。
HTTP从1990年開始使用,最原始的版本号是HTTP0.9。这是一个面向消息的简单协议,简单描写叙述了client与server之间请求与响应的过程,client向server端请求连接,通过握手建立连接后向server发送GET方法訪问,server端将响应结果返回给client。然后断开连接。
HTTP1.1、HTTP1.0向下兼容HTTP0.9。是如今使用的HTTP协议的子集。
经过三年的发展,HTTP1.0被提出。它对HTTP0.9进行了非常多改进:添加了请求类型,如HEAD、POST等。加入了HTTP版本号号;加入了响应码表示处理的状态;使用MIME的消息标题和消息体格式来描写叙述訪问对象的数据类型和附加在后面的元信息。比如Content-type:text/html表明响应的消息实体是HTML文件,引入MIME后有利于扩大HTTP协议处理数据类型。添加了对代理的支持,HTTP0.9版本号仅仅支持直接连接交互,而HTTP1.0能够通过代理实现间接连接交互。
又经过四年的发展,产生了HTTP1.1。
它是在HTTP1.0基础上实现的一次飞跃,主要在性能、安全、数据类型处理等方面进行了改进。提出server端缓冲对象的概念,在降低网络同样类型内容的重复传送、提高訪问速度等方面有非常大的提高。
HTTP1.1採用了永久连接。这样非常好地提高了性能,之前的版本号都是默认响应完就直接关闭连接,下次又要又一次建立连接。
同一时候,它还同意client与server端对内容进行协商。突破HTTP1.0中server和IP一一相应的限制,能够通过主机名来决定由哪个server提供服务。
最后。为了适应WWW的发展须要,HTTP在功能和性能上进行了大量的改进。HTTPPng将是下一代的HTTP协议。在效率跟性能上都将有进一步的提高。
喜欢研究java的同学能够交个朋友,以下是本人的微信号:
协议系列之HTTP协议的更多相关文章
- 协议系列之UDP协议
上节说的TCP协议虽然提供了可靠的传输,但是也有一个缺点,发送速度慢.那么有没有一种协议能快速发送的呢?这节要讨论的就是UDP协议,它提供了更加快的发送速度,但也牺牲了可靠性,它是一种无连接的传输协议 ...
- 协议系列之TCP协议
3.TCP协议 从上一节我们了解了什么是IP协议,以及IP协议的一些特性,利用IP协议传输都是单向的,不可靠的,无连接状态的.正是这些特性,于是便产生了TCP协议.TCP协议属于传输层,在IP协议网络 ...
- 协议系列之IP协议
1.协议 协议(protocol)的定义:为计算机网络中进行数据交换而建立的规则.标准或约定的集合.两个终端相互通信时双方达成的一种约定,规定了一套通信规则,双方通信必须遵守这些规则.这些规则规定了分 ...
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析
C# 串口操作系列(4) -- 协议篇,文本协议数据解析 标签: c#uiobjectstringbyte 2010-06-09 01:50 19739人阅读 评论(26) 收藏 举报 分类: 通讯 ...
- Zookeeper概念学习系列之zab协议
不多说,直接上干货! 上一章讨论了paxos算法,把paxos推到一个很高的位置. Zookeeper概念学习系列之paxos协议 但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺 ...
- 安全协议系列(三)----CCMP与WPA-PSK
本节讨论 CCM 在 WiFi 中的实际应用 -- CCMP 协议 根据 RFC 3610,完成 CCMP 报文的加解密,需要提供:分组密钥(K).随机数(Nonce).附加认证数据(AAD),这三个 ...
- 协议系列UDP协议
所述上部TCP虽然该协议提供了一个可靠的传输,但也有一个缺点.发送速度慢.是否有协议它可以以高速传送?这部分是将要讨论UDP协议,它提供了更加快了传输速度.而且在可靠性为代价,这是一个无连接的传输协议 ...
- 协议系列之TCP/IP协议
根据前面介绍的几种协议,将IP协议.TCP协议.UDP协议组合起来,于是便有了TCP/IP协议.现在很多的应用的通信都是建立在TCP/IP协议的基础上,运用非常广泛,很有必要对其学习一下. 打个不太恰 ...
- Android网络编程系列之HTTP协议原理总结
前言 作为搞移动开发的我们,免不了与网络交互打交道.虽然市面上很多开源库都封装的比较到位,我们实现网络访问也轻车熟路.但还是十分有必要简要了解一下其中的原理,以便做到得心应手,也是通往高级开发工程师甚 ...
随机推荐
- iOS图片的伪裁剪(改变图片的像素值)
0x00 原理 利用一张图片事先画好的图片(以下称为蒙板),盖在要被裁剪的的图片上,然后遍历蒙板上的像素点,修改被裁剪图片对应位置的像素的色值即可得到一些我们想要的不规则图片了(比如人脸) 0x01 ...
- 如果数据为null,则转成数据库可识别的DBNULL.Value
// <summary> /// 如果数据为null,则转成数据库可识别的DBNULL.Value /// </summary> /// <param name=&quo ...
- javascript获取div高度
DOM的: 获得了div的高度值 = document.getElementById("目标id").offsetHeight;
- 我摘录的js代码
1.修改样式 document.getElementByIdx( "div1").style.display = "none"; 2.鼠标悬停图标变小手 sty ...
- Python学习的一些好资料
教程: 1. 廖雪峰的Python教程:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0 ...
- c#xml序列化对象,xml标记都缩写了
最近最后一个接口,他们的格式很严格必须是如下格式 <message> <age>20</age> <name>张三</name> </ ...
- BZOJ 1263 整数划分
Description 从文件中读入一个正整数\(n\).要求将\(n\)写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,\(n=13\),则当\(n\)表示为\(4+3+3+3\)(或\( ...
- BZOJ 1072 排列
Description 给一个数字串\(s\)和正整数\(d\), 统计\(s\)有多少种不同的排列能被\(d\)整除(可以有前导\(0\)).例如\(123434\)有\(90\)种排列能被\(2\ ...
- JSP出现中文乱码问题
今天纠结了好半天,本地运行程序后没有中文乱码,唯独发到服务器后运行出现了乱码. 究其原因,皆因eclipse环境默认的JSP编码是Iso-8859-1,需要将其改为utf-8,与JSP文件中的编码声明 ...
- NXP LPC11xx I2C Slave 从机程序
/**************************************************************************** * $Id:: i2cslave.c 363 ...