一、了解HTTP协议
浏览器背后的故事
- HTTP(超文本传输协议),允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
- HTTP是一个属于应用层的面向对象的协议
- WEB与HTTP :Web是一种基于超文本和HTTP的、全球的、动态交互的、跨平台的分布式图形信息系统。
建立在Internet上的一种网络服务。
HTTP的前世今生
透过TCP/IP看HTTP
- HTTP协议时构建在TCP/IP协议之上的,是TCP/IP协议的一个子集。
- TCP/IP协议其实就是一系列与互联网相关联的协议集合起来的总称。
- 分层管理是TCP/IP协议的重要特征。
- TCP/IP协议族分层:四层:应用层、传输层、网络层和数据链路层
1、应用层:一般是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。如FTP、DNS、HTTP等
2、传输层:传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。TCP、UDP协议。
3、网络层: 用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。
4、链路层:用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
数据的封装过程
DNS域名解析
先从本地host文件里找到域名对应的ip地址,如果没有再继续查找其他的域名服务器
回溯HTTP事务处理过程
当客户端访问Web站点的时候,首先会通过DNS服务查到域名的IP地址。然后浏览器生成HTTP请求,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端。
-
完整过程:
HTTP协议的特点
1、支持客户/服务器模式
2、简单快速,只需传送请求方法和路径,请求方法如GET、POST规定了客户与服务器联系的类型不同。
3、HTTP允许传输任意类型的数据对象。通过Content-Type规定
4、无连接的含义是限制每次连接只处理一个请求。(keepAlive来客户端对服务端的连接可以持续有效,避免重新建立连接)
5、无状态:HTTP是无状态协议。对于事务处理没有记忆功能。缺少状态意味着如果后续处理需要前面的信息,则它需要重传,这样可能导致连接传送的数据量增大。优点是简单(Cookie和Session解决),另一方面,在服务器不需要先前信息时它的应答就较快。
URI和URL
我们输入在浏览器里的web地址应该叫URI还是URL?
URI:一个紧凑的字符串用来标识抽象或物理资源
URN的作用就好像一个人的名字,URL就像一个人的地址,
或者说URN确定了东西的身份,URL提供了找到它的方式。
URL是URI的一种,但不是所有的URI都是URL
URI和URL最大的区别是“访问机制”(通过HTTP还是FTP),URL要有访问机制,就是协议。
URN是唯一标志的一部分。
HTTP报文结构分析
1、请求报文:
(1)请求行
(2)请求头
空行
(3)请求体
GET请求,参数放在请求行
POST请求,参数放在请求体
HTTP的报文头分为:通用报文头、请求报文头、响应报文头和实体报文头
通用报文头的字段:Cache-Control、Connection、Date、Upgrade等
请求报文头的字段:Accept、Accept-Charset、Host、If-Match等
响应报文头的字段:Accept-Range、Locations
实体报文头的字段:实体中的一些编码方式等等
举例:
- Accept:text/html:代表浏览器可以接受服务器回发的类型为text/html,如果服务器无法返回text/html类型,则会返回406错误,表示没有客户端可接受的类型。Accept:/代表所有的类型
- Accept-Encoding: 浏览器申明自己接受的编码方法,通常指压缩的方法。
-
Accept-Language:申明自己接收的语言
- Connection: keep-alive 当一个网页打开完成后,客户端和服务端之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
- Connection:close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
- Host :www.baidu.com:80 指定被请求资源的Internet主机和端口号,是从请求的URL提取出来的
- Refer :告诉服务器我是从哪个页面连接过来的,服务器借此可以获得一些信息用于处理。
- User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器类型。一般通过User-Agent来判断浏览器类型,从而进行不同的兼容设计。
- Content-Type:application/json : 说明了报文体内的对象的媒体类型。
2、响应报文
(1)响应状态行
(2)响应头
空行
(3)响应体
HTTP请求方法剖析
HTTP/1.1常用方法:
GET、POST、PUT、HEAD、DELETE、OPTIONS、TRACE、CONNECT
(1)GET方法:
用来请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应内容。
浏览器对URL的长度有限制,所以GET请求的参数的长度是有限的。
(2)POST方法:
与GET类似,一般用来传输实体的主体。POST方法的主要目的不是获取响应主体的内容,而是提交大的容量的内容。把请求的参数,提交的内容等都放在请求的请求体里面,这样做的安全性更高,可以提交的内容量也更多,没有长度限制。所以在表单提交的时候都会使用POST请求。
(3)PUT方法:
从客户端向服务器传送的数据取代指定的文档的内容。
与POST方法最大的不同是:PUT是幂等的,而POST不是幂等的。因此我们更多时候将PUT方法用作传输资源。但是它没有验证机制,所以还是用POST
(4)HEAD方法:
类似于GET,只不过返回的响应体中没有具体的内容,只是用来获取响应头,测试URL是否可用或者有改变。
(5)DELETE
(6)OPTIONS:
用来查询针对请求URI指定的资源支持的方法。(返回的响应头中的Allow字段里面会包含支持的方法)
(7)TRACE:回显服务器收到的请求,主要用于测试或者诊断。
(8)CONNECT:开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道。当通过代理服务器访问资源的时候,使用CONNECT
状态码
响应报文里面,响应状态行里面的三位数字码,用来表示响应的状态类型。
1xx:响应正在处理
2xx:成功
3xx:重定向,客户端要采用进一步的操作才能完成请求,后续的请求地址(重定向的目标)放在响应头的Location字段里面。
4xx:客户端请求错误
5xx:服务端错误
状态码举例
200 OK:请求成功并有响应返回。
202 Accepted:请求已被接受,但是未处理完成
206 Partial Content:部分内容,服务器成功处理了部分GET请求。(在请求头上设置了Range字段,)
301 Moved Permanently :永久移动,重新定向到新的URL
302 Found:与301类似,但是资源只是临时的移动。客户端应继续使用原有的URI.
400 Bad Request:客户端的请求语法错误,服务器无法理解
401 Unauthorized:请求要求用户的身份认证
403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found:服务器无法根据客户端的请求找到资源。
500 Interval Server Error:服务器内部错误,无法完成请求
502 Bad Gateway:充当网关或者代理的服务器,从远端服务器收到了一个无效的请求。
用telnet分析HTTP协议的通讯过程
HTTP状态管理:Cookie与Session
HTTP不存储连接的状态,优点是简单,缺点是会增加后续的请求的内容,比如重复登录的操作等。
Cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录改用户的状态,就向客户端浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来。当浏览器再请求改网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。客户端再次浏览时,只需从Session中查找状态。
Cookie用来保存SessionId.
保存Session ID的方式
1、Cookie
2、URL重写:把SessionId直接加入URl后面,用分号。或者直接把Session ID作为一个参数加到URL后面。
3、隐藏表单
Session的有效期
1、Session的超时失效,设置自动超时失效。
2、程序主动调用HttpSession.invalid(),比如注销的时候,主动使Session失效
3、服务器进程被终止。
比较一下Cookie和Session
存放的位置不同。(客户端浏览器,服务器)
安全性不同。
有效期上的不同。
熟悉HTTP协议结构和通讯原理
1、什么是编码
2、为什么需要编码
3、什么时候出现乱码
字符集与编码
一套完整的编码规范包括字库表、编码方式、字符集
常见的编码规范介绍
(1)ASCII码(1个字节)
(2)GBK(两个字节)
(3)ISO-8859-1(ASCII字符加上其他的很多字符)是不支持中文的
(4)Unicode(四个字节):可以表示所有字符。占空间大
乱码的由来:
解码过程:一串二进制数字使用一种编码方式解码,但是一般只有一种解码方式解码翻译可以得到正确的结果,如果使用了错误的编码方式就会乱码。
因为URL是采用ASCII字符集进行编码的,所以如果URL中包含有非ASCII字符集中的字符,要对其进行编码。
“%编码规范”:
对URL中属于ASCII字符集的非保留字不做编码;对URL中的保留字西药取其ASCII内码,然后加上%前缀将该字符进行编码;对于URL中的非ASCII字符需要取其Unicode内码,然后加上“%”前缀进行编码。
HTTP协议之身份认证
身份认证信息:密码、动态令牌、数字证书、生物认证、IC卡等
- 常见的认证方式:
(1)BASIC认证:不用了
请求->服务端返回401,需要认证->认证信息通过Base64编码,写入到请求头字段authorization->服务端验证,验证成功返回200,失败返回401
(2)DIGEST认证:不用了
与BASIC一样的质询/响应的方式,但不会像BASIC认证那样传送认证信息明文,比BASIC更安全点。
(3)SSL客户端认证:安全,费用比较高
借由HTTPS的客户端证书完成的认证方式。凭借客户端证书,服务器可确认访问是否来自登录的客户端。
(4)基于表单的认证:
使用web应用程序各自实现的基于表单的认证方式。
HTTP的长连接和短连接
HTTP协议时基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求就结束了。
TCP协议是在传输层实现可靠传输。
HTTP的长连接和短连接本质上是TCP长连接和短连接。
HTTP/1.0时,默认都是短连接。
HTTP/1.1起,默认使用长连接,保持连接性。(Connection字段:keep-alive)
HTTP中介之代理
代理的作用:抓包、翻墙、匿名访问、过滤器(过滤请求)。(用VPN的原理不同,是通过隧道的技术实现)
HTTP中介之网关
网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。
网关扮演的是“协议转换器”的作用。
两种:
(1)服务器端web网关:(HTTP/*)
(2)服务器端安全网关:(HTTP/HTTPS)
(3)客户端安全加速器网关:(HTTPS/HTTP)
(4)资源网关:
HTTP缓存
- 为什么要使用HTTP缓存?
- 缓存的内容是什么?
HTTP缓存更多的是缓存静态的文件。
HTTP缓存头部
Cache-Control字段:请求/响应头的缓存控制字段,值有:
- no-store:所有内容都不缓存
- no-cache: 使用缓存前请求服务器判断是否是最新。
- private :只有客户端可以缓存,代理和其他的不能缓存
- public :都可以缓存
Expire字段:响应头字段,代表资源过期时间
缓存改进方案:
跳过缓存过期时间,主动感知文件变化。 - md5/hash缓存。
通过不缓存HTML,为静态文件添加MD5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件的变化的问题。 - CDN缓存
是构建在网络上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等模块,可以让用户就近获取所需内容,降低网络拥塞,提高访问响应速度和命中率。
HTTP内容协商机制
客户端与服务端对响应资源的语言、字符集合编码方式进行协商。
三种协商方式:
客户端驱动、服务端驱动、透明协商
客户端可以用一些请求头的字段,来告知服务器协商的内容。
Accept
Accept-Language
Accept-CharSet
Accept-Encoding
响应的字段
Content-Type
Content-Language
服务端驱动的协商方式,允许服务端对客户端协商的内容进行近似匹配,通过q权值优先级来匹配。
断点续传和多线程下载
客户端请求头:Range字段,服务端响应头:Content-Range
- Range :用于请求头中,指定第一个字节的位置和最后一个字节的位置
断点续传过程
1、客户端下载一个1024K的文件,已经下载了其中512K
2、网络中断,客户端请求续传,因此需要在HTTP请求头的Range字段申明本次需要传输的片段,这会通知服务端同文件的512K的位置开始传输文件。
3、响应头的Content-Type字段会返回响应的信息,成功下载会返回206(部分内容),而不是200.
使用HTTP协议构建应用
servlet.jar,开发,Tomcat部署HTTP服务,抓包,postman测试。。。
安全的HTTPS
HTTP与HTTPS
中间人攻击,HTTP传输请求的明文,容易被获取并篡改。
可以使用秘钥把信息进行加密,
对称加密和非对称加密:
可以在传输公钥的过程用非对称加密,后面获得私钥之后,使用对称加密。
HTTP协议概述
HTTPS可以认为是HTTP+TLS
TLS是传输层加密协议,它的前身是SSL协议。
HTTPS功能介绍
- 内容加密:
非对称秘钥交换:公钥+私钥,通过公钥对明文加密传输,通过私钥解密,公钥依然可以被截获,然后偷窥者可以伪装成服务器用公钥加密发送报文给你,套取私钥。
针对这种问题,可以依靠第三方证书认证的机制。服务器不将公钥公开,而是通过第三方数字证书认证机构,服务器把公钥交给他,他来进行登记和下发证书,证明通信方的身份。在证书里面会含有公钥的内容。通信方可以使用这个证书向CA质问证书有没有被篡改,没问题后用这个公钥加密报文,传给服务器。如果偷窥者拦截到证书,他只有公钥,解不开密码,而服务器可以解开。 - 身份认证:
数字证书,服务端先把证书传递给客户端,客户端用证书机构的公钥解密证书签名,在根据规则生成一个签名,进行对比。证书默认装到了浏览器里面。 - 数据完整性
HTTPS的成本
- 证书的费用以及更新维护
- HTTPS降低用户的访问速度
- 消耗CPU资源,需要增加大量机器(加密,计算量)
HTTPS对性能的影响
- 协议交互所增加的网络往返时间(RTT)
- 加密计算带来的时耗(浏览器和服务端都可能有计算时耗)