标签:
HTTP 简介
HTTP 是Hypertext Transfer Protocol(超文本传输协议)的简称。它用来在Internet上传递Web 页面信息。HTTP 位于TCP/IP 协议栈的应用层。传输层采用面向连接的TCP。
目前,设备支持的 HTTP 协议版本为HTTP/1.0。
URI和URL
URI Uniform Resource Identifier 统一资源标识符
URL Uniform Resource Locator 统一资源定位符
一个HTTP请求的详细过程
1.域名解析
通过浏览器访问网站一般都是填写URL,通过socket发送请求,socket是通过IP和端口号建立连接的,所以,第一步工作就是把URL所述的域名通过DNS解析成IP地址。通常,DNS解析成功后会有缓存机制,DNS的解析首先是从缓存的查找开始,如果缓存不存在,才真正请求DNS,缓存查找流程如下:
- 浏览器自身的DNS缓存;
- OS的缓存(windows的命令ipconfig /displaydns);
- Host文件(C:\Windows\System32\drivers\etc);
- DNS系统调用,向本地配置的首选DNS服务器发起DNS请求(一般是运营商提供);
- 运营商DNS代理查找缓存;
- 迭代DNS请求,一直到域名注册商提供的地址;
2.HTTP请求
HTTP通过tcp协议传输,三次握手成功后,浏览器向服务器发送GET/POST命令,GET的命令格式:GET 路径/文件名 HTTP/1.0,访问www.baidu.com的GET请求如下:
各头部字段的作用:
- Accept 就是告诉服务器端,我接受那些MIME类型
- Accept-Encoding 接收那些压缩方式的文件
- Accept-Lanague 告诉服务器能够发送哪些语言
- Connection 告诉服务器支持keep-alive特性
- Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端
- Host 用来标识请求服务器上的那个主机
- User-Agent 用户代理,一般情况是浏览器,也有其他类型,如:wget curl等
其中,起始行请求方法包括如下几种:
- GET: 完整请求一个资源 (常用)
- HEAD: 仅请求响应首部
- POST:提交表单 (常用)
- PUT: (webdav) 上传文件(但是浏览器不支持该方法)
- DELETE:(webdav) 删除
- OPTIONS:返回请求的资源所支持的方法的方法
- TRACE: 追求一个资源请求中间所经过的代理(该方法不能由浏览器发出)
HTTP响应
头部各字段作用:
应答头
|
说明 |
Content-Encoding |
文 档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的 下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept- Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 |
Content-Type |
表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。 |
Date |
当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 |
Expires |
应该在什么时候认为文档已经过期,从而不再缓存它? |
Location |
表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 |
Server |
服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 |
Transfer-Encoding: chunked |
表示输出的内容长度不能确定,Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略) |
Vary: Accept-Encoding |
告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题 |
Cache-control |
用于控制HTTP缓存,max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应 |
X-Cache |
表示http request是由proxy server回的 |
浏览器解析HTML
浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样)
浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个http请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。
HTTPS协议
HTTPS是HTTP的安全版,S实际上是SSL协议。SSL(Secure Sockets
Layer 安全套接层)及其继任者TLS(Transport
Layer Security)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL连接过程
抓包分析
1. client发送client hello
SSL客户端通过Client
Hello消息将它支持的SSL版本、加密算法、密钥交换算法、MAC算法等信息发送给SSL服务器;
2. server回应ServerHello
SSL服务器确定本次通信采用的SSL版本和加密套件,并通过Server
Hello消息通知给SSL客户端。如果SSL服务器允许SSL客户端在以后的通信中重用本次会话,则SSL服务器会为本次会话分配会话ID,并通过Server
Hello消息发送给SSL客户端;
3. server回应Certificate
SSL服务器将携带自己公钥信息的数字证书通过Certificate消息发送给SSL客户端;
4.server回应ServerHelloDone
SSL服务器发送Server
Hello Done消息,通知SSL客户端版本和加密套件协商结束,开始进行密钥交换;
5.Client发送ClientKeyExchange
SSL客户端验证SSL服务器的证书合法后,利用证书中的公钥加密SSL客户端随机生成的premaster
secret,并通过Client
Key Exchange消息发送给SSL服务器;
6.Client发送ChangeCipherSpec
SSL客户端发送Change
Cipher Spec消息,通知SSL服务器后续报文将采用协商好的密钥和加密套件进行加密和MAC计算;
7.Client发送Finished
SSL客户端计算已交互的握手消息(除Change
Cipher Spec消息外所有已交互的消息)的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL服务器。SSL服务器利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功;
8.Server发送ChangeCipherSpec
同样地,SSL服务器发送Change
Cipher Spec消息,通知SSL客户端后续报文将采用协商好的密钥和加密套件进行加密和MAC计算;
9.Server发送Finishd
SSL服务器计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL客户端。SSL客户端利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功;
SSL客户端接收到SSL服务器发送的Finished消息后,如果解密成功,则可以判断SSL服务器是数字证书的拥有者,即SSL服务器身份验证成功,因为只有拥有私钥的SSL服务器才能从Client
Key Exchange消息中解密得到premaster
secret,从而间接地实现了SSL客户端对SSL服务器的身份验证;
10.应用数据加密传送
HTTP协议介绍
标签:
原文地址:http://blog.csdn.net/qq_30144577/article/details/50637025