HTTP/HTTPS协议详解

HTTP协议详解:http://blog.csdn.net/gueter/article/details/1524447

读博笔记:↓

                                       HTTP

http请求:请求行,消息报头,请求正文      

请求行格式:Method Request-URI HTTP-Version CRLF

                    Method 表示请求方法;

                    Request-URI 是一个统一资源标识符;

                    HTTP-Version 表示请求的HTTP协议版本;

                    CRLF 表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

 

http响应:状态行,消息报头,相应正文

状态行格式:HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version 表示服务器HTTP协议的版本;

Status-Code 表示服务器发回的响应状态代码;

Reason-Phrase 表示状态代码的文本描述。

  1xx:指示信息--表示请求已接收,继续处理
  2xx:成功--表示请求已被成功接收、理解、接受
  3xx:重定向--要完成请求必须进行更进一步的操作
  4xx:客户端错误--请求有语法错误或请求无法实现
  5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

http消息由客户端发到服务器的请求消息和服务器发给客户端的响应消息组成。

请求消息和响应消息都由:开始行,消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成

  开始行:对于请求消息,开始行是请求行。对于响应消息,开始行是状态行。

  消息报头 包括普通报头、请求报头、响应报头、实体报头    

    普通报头:在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。

    请求报头:请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

    响应报头:响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。

    实体报头:请求和响应消息都可以传送一个实体,一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息

 

————————————————————HTTPS————————————————————————————————————————————————————

以下内容参考:http://www.bubuko.com/infodetail-910254.html

       http://segmentfault.com/q/1010000000192807

       http://www.cnblogs.com/zhuqil/archive/2012/10/06/ssl_detail.html

       

 https = http + ssl/tls

SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。

SSL的工作原理

握手协议(Handshake protocol

记录协议(Record protocol

警报协议(Alert protocol

 

1、握手协议

握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。

每个握手协议包含以下3个字段
(1)Type:表示10种消息类型之一
(2)Length:表示消息长度字节数
(3)Content:与消息相关的参数

SSL握手过程:

①客户端浏览器向服务器传送客户端SSL 协议的版本号,提供的加密算法的种类,一个用于生成主密钥的32位随机数,以及其他服务器和客户端之间通讯所必须的各种信息。

②服务器向客户端返回它支持的SSL协议的版本号,可用的加密算法的种类,一个用于生成主密钥的32位随机数,以及其他必要的相关信息,同时服务器还将向客户端传送自己的证书。

③客户利用服务器传过来的信息验证服务器的合法性。服务器的合法性包括:a、证书是否过期  b、发行服务器证书的CA 是否可靠  c、发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”    d、服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步

④客户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。

⑤服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留),然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

⑥客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知 服务器端   客户端的握手过程结束。

⑦服务器端向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知 客户端   服务器端的握手过程结束。

⑧SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯。

 

注意:上述步骤②中,服务器端返回给客户端证书时,证书通常包含有公钥、名称、数字签名等内容,其中数字签名是加密的,数字签名是用颁发机构的私钥  对  本证书的公钥、名称以及其他信息做hash散列加密而成。

 

客户端要解密数字签名来验证该证书是否合法可靠,解密方式如下:

①客户端浏览器会寻找该 证书 的根证书颁发机构。在本机上的证书管理器里寻找那些受信任的根证书颁发机构列表是否有该证书的根证书颁发机构,如果有则用该根证书的公钥解密服务器下发的  证书 。

②如果不能正常解密,则服务器下发的证书则被认为是伪造的,浏览器会弹出警告提示框。

③如果能够正常解密,则获取到公钥,名称,数字签名等信息,然后与本身的公钥、名称等信息对比一下,确认公钥没有被篡改,如果公钥不一致则被认为是不可信的。

2、记录协议 

记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议,记录协议向SSL连接提供两个服务:
(1)保密性:使用握手协议定义的秘密密钥实现
(2)完整性:握手协议定义了MAC,用于保证消息完整性
 

SSL通讯完整性验证原理

见下图:

数据传输时,将分片传输。

每条记录中数据和mac(指纹)均做加密处理。

  • 保密性:传输的数据均是采用session key加密,保证了保密性;
  • 真实性:双方握手时对对方的身份均有验证,因此可以保证对方的真实性
  • 完整性:每部分数据均有mac验证,验证时计算数据的mac然后与接收到的mac比较,即可确定数据是否完整。
  • 不可否认性:session key只有通信双方有,并且不在网络上传输,因此攻击者无法伪造使用session key加密的数据,所以具有不可抵赖性。

 

  • 如下图:

 

3、警报协议

客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则双方立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。

 

 

 

内容总结,https传输在建立连接时采用的是非对称加密算法,一旦连接建立完成,后续的通讯则使用了对称加密算法。因为非对称加密算法的效率较低,这样做一定程度上可以保证安全性又使数据的传输速率提高。

 

 

___________________________________________________________________________________________________________________________

当我们在浏览器的地址栏输入“www.baidu.com”然后按回车,这之后发生了什么事,我们直接看到的是打开了对应的网页,那么内部客户端和服务端是如何通信的呢?

 

 1、URL自动解析

      HTTP URL包含了用于查找某个资源的足够信息,基本格式如下:HTTP://host[“:”port][abs_path],其中HTTP表示桶盖HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

例如:输入www.163.com;浏览器会自动转换成:HTTP://www.163.com/

 

2、获取IP,建立TCP连接

浏览器地址栏中输入"HTTP://www.xxx.com/"并提交之后,首先它会在DNS本地缓存表中查找,如果有则直接告诉IP地址。如果没有则要求网关DNS进行查找,如此下去,找到对应的IP后,则返回会给浏览器。

  *  浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  *  如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。
  *  接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  *  接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
  *  你的ISP的DNS服务器从根域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所           以到顶级服务器的匹配过程不是那么必要了。

当获取IP之后,就开始与所请求的Tcp建立三次握手连接,连接建立后,就向服务器发出HTTP请求。

 

3、客户端浏览器向服务器发出HTTP请求

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,接着以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

例如:GET/sample/hello.jsp HTTP/1.1

 

4、Web服务器应答,并向浏览器发送数据

客户机向服务器发出请求后,服务器会客户机回送应答,

HTTP/1.1 200 OK

应答的第一部分是协议的版本号和应答状态码,正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

 

5、Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

Connection:keep-alive

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

 

网上对HTTP通信的另一种说法:

 

(1)建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80

 

(2)Web浏览器向Web服务器发送请求命令 
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令
例如:GET/sample/hello.jsp HTTP/1.1

 

(3)Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

 

(4)Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码

 

(5)Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

 

(6)Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

 

(7)Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
posted @ 2015-09-26 14:40  heshengbang  阅读(541)  评论(0)    收藏  举报