目录
一、了解HTTP
1、浏览器背后的故事
访问www.baidu.com步骤:首先访问DNS服务器,获取ip,向目标地址发送请求(通信的协议就是HTTP协议),服务器回传页面内容,浏览器渲染页面。
什么是HTTP?
HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
简单理解:就是在两者之间传递HTML的一种规则。
2、HTTP的起源
1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
3、通过TCP/IP看HTTP
HTTP协议是构建在TCP/IP协议之上的,是tcp/ip协议的一个子集。
3.1、TCP/IP协议族
- TCP/IP协议其实是一系列与互联网相关联的协议集合起来的总称。
3.2、TCP/分层管理
- 由四层协议组成:应用层,传输层,网络层,链路层。
3.3、TCP/IP通信传输
- HTTP数据传输过程:
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。我们用HTTP举例来说明,首先作为发送端的客户端在应用层( HTTP协议)发出一个想看某个Web页面的HTTP请求。
接着,为了传输方便,在传输层( TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。
接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。- 传输层三次握手以及四次挥手:
三次握手,双方都确认自己的发送和接收是否可用。(必须3次)
详细解析:https://www.jianshu.com/p/e7f45779008a https://blog.csdn.net/u013760665/article/details/89669509
4、各种协议与HTTP协议的关系
TCP协议:
按层次分,TCP位于传输层,提供可靠的字节流服务。所谓的字节流服务( Byte Stream Service)是指,为了方便传输。
将大块数据分割成以报文段( segment )为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。IP协议:
IP协议位于网络层,IP协议的作用是各种数据包传送给对方,期间用到路由选择,ARP地址解析协议。DNS协议:
DNS 服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
二、熟悉HTTP
1、HTTP协议特点
- 基于请求/响应模型的协议。请求和响应必须成对,先有请求后有响应
- http协议默认端口:80
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2、迷之URL和URI
Q:输入在浏览器里的Web地址应该叫url or uri?
URI用字符串标识某一互联网资源, 而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
URI可以分为URL和URN,URN好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。
URL是URI的一种,但不是所有的URI都是URL。
3、HTTP报文结构分析
HTTP请求包括:请求行、请求头、请求体
HTTP的报文头大体可以分为四类:
- 通用报文头
请求报文和响应报文两方都会使用的首部。
- 请求报文头
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。 - 响应报文头
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。 - 实体报文头
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
3.1、常用报文头
accept:
告诉服务端,该请求所能支持的响应数据类型,专业术语称为MIME 类型(文件类型的一种描述方式)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 */*代表所有类型都接收
Accept-Encoding:
浏览器申明自己接收的编码格式Accept-Encoding: gzip, deflate, br
Accept-Language:
浏览器申明自己接收的语言
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 q=0.8:q为优先级,优先返回中文,
Connection:
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Connection: keep-alive Connection: close 一次请求后,立马断开TCP连接。
Host:
用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来。
Host: hzs13.cnzz.com
Referfer:
告诉服务器从哪个页面跳转过来的。
Referer: https://www.cnblogs.com/
User-Agent:
告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0
content-type:
说明了报文体内对象的媒体类型。
content-type: text/html; charset=utf-8
3.2、HTTP常用方法
- GET
- POST
- PUT
- HEAD
- DELETE
- TRACE
- OPTIONS
- CONNECT
get请求:
将请求参数追加在url后面,不安全,url长度限制。没有请求体,一般的HTTP请求大多都是GET。
post请求:
请求参数在请求体处,较安全。
请求数据大小没有限制,只有表单设置为method=“post”才是post请求,其他都是get请求。
HEAD请求:
HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
DELETE请求:
删除指定资源。
OPTIONS请求:
用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
PUT请求:
把一个资源存放在指定的位置上。
本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT是幂等的,而POST不是幂等的。PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
TRACE请求:
回显服务器收到的请求,主要用于测试或诊断。
CONNECT请求:
CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
3.3、状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
1XX: Informational (信息性状态码) 接收的请求正在处理2XX: Success (成功状态码) 请求正常处理完毕
- 200 OK:客户端请求成功
- 206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
3XX: Redirection ( 重定向状态码) 需要进行附加操作以完成请求
- 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。浏览器自动定向到新的uri。
- 302 Found:临时重定向,表示请求的资源临时搬到了其他位置。
4XX: Client Error (客户端错误状态码) 服务器无法处理请求
- 400 Bad Request:客户端请求有语法错误,服务器无法理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供执行此请求。
- 404 Not Found:请求资源不存在。比如,输入了错误的url
5XX: Server Error (服务器错误状态码) 服务器处理请求出错
- 500 Internal Server Error:服务器内部发生错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
3.4、HTTP状态管理:Cookie与Session
三、HTTP其他特性
1、HTTP之身份认证
常见认证方式:
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
1.1、BASIC认证
BASIC认证的流程图:
流程:
- 当请求的资源需要BASIC认证时,服务器会随状态码401Authorization Required,返回带WWW-Authenticate首部字段的响应。该字段内包含认证的方式(BASIC)及Request-URI安全域字符串( realm )。
- 接收到状态码401的客户端为了通过BASIC认证,需要将用户ID及密码发送给服务器。发送的字符串内容是由用户ID和密码构成,两者中间以冒号(:)连接后,再经过Base64编码处理。
- 接收到包含首部字段Authorization 请求的服务器,会对认证信息的正确性进行验证。如验证通过,则返回一条包含Request-URI资源的响应。
BASIC认证不安全,只使用Base64加密,解码后就是id和密码,HTTP非加密通信,容易被获取,所以不常用。
1.2、DIGEST认证
为弥补BASIC认证存在的弱点,从HTTP/1.1起就有了DIGEST认证。DIGEST 认证同样使用质询/响应的方式( challenge/response),但不会像BASIC认证那样直接发送明文密码。
所谓质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。流程图:
1.3、SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
为达到SSL客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
认证步骤:
- 接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
- 用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。
- 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
1.4、基于表单验证
由于使用上的便利性及安全性问题,HTTP协议标准提供的BASIC认证和DIGEST认证几乎不怎么使用。另外,SSL客户端认证虽然具有高度的安全等级,但因为导入及维持费用等问题,还尚未普及。所以只好使用由Web应用程序各自实现基于表单的认证方式。
2、HTTP的长连接与短连接
HTTP长连接与短连接本质上是TCP长连接与短连接。
HTTP/1.0中,默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,结束就中断。
HTTP/1.1起,默认使用长连接,用来保持连接特性。
只要任意一段没有提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提高了。
3、代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端;“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
4、网关
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非HTTP协议服务。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通,信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL语句查询数据。另外,在Web购物网站上进行信用卡结算时,网关可以和信用卡结算系统联动。网关是资源和应用程序之间的粘合剂。协议转换器的角色。
5、缓存
5.1、缓存?
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。5.2、缓存控制头部
- Cache-Control:请求响应头,缓存控制字段
no-store:所有内容都不缓存
no-cache:缓存,但是所有浏览器使用缓存前,都会判断缓存是否最新。
max-age=x:请求缓存后的X秒内不再请求。
public:客户端和代理服务器(CDN)都可以缓存
private:只有客户端可以缓存- Expires:响应头
- Last-Modefied:响应头,资源最新修改时间,由服务器告诉浏览器。
- if-Modefied-Since:请求头,资源最新修改时间,由浏览器告诉服务器,和Last-Modefied是一对,它两会进行对比。
6、内容协商机制
同一个Web网站有可能存在着多份相同内容的页面。比如英语版和中文版的Web页面,它们内容上虽相同,但使用的语言却不同。
当浏览器的默认语言为英语或中文,访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商( Content Negotiation )。三种机制:
服务器驱动协商(主流)
由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。请求头中的字段。
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
客户端驱动协商
由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器类型,自行切换成PC版页面或手机版页面。透明协商
是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一-种方法。7、断点续传和多线程下载
断点续传就是从之前下载断开始恢复下载。
实现:
HTTP是通过在Header里两个参数实现的,客户端请求时对应的是Range,服务器端响应时对应的是Content-Range
四、HTTPS
实际上HTTP和HTTPS可以算是两种不同的网络传输协议,虽然就差一个字母,但是本质却大不相同。
1、HTTP的缺点
- 通信使用明文(不加密),内容可能会被窃听;
由于HTTP本身不具备加密的功能,所以也无法做到对通信整体(使用HTTP协议通信的请求和响应的内容)进行加密。即,HTTP报文使用明文(指未经过加密的报文)方式发送。
- 不验证通信方的身份,因此有可能遭遇伪装;
无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器。
无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。无法判定请求是来自何方、出自谁手。
即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击( Denial of Service,拒绝服务攻击)。 .- 无法证明报文的完整性,所以有可能已遭篡改。
接受到的内容可能有误,文件可能被篡改。2、HTTPS = HTTP+加密+认证+完整性保护
HTTPS可以认为是HTTP+TLS。
TLS是传输层加密协议,它的前身是SSL协议。
HTTPS并非是应用层的一.种新协议。只是HTTP通信接口部分用SSL ( Secure Socket Layer )和TLS ( Transport Layer Security )协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。2.1、对称加密
加密和解密同用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。
问题:发送密钥就有被窃听的风险,但不发送,对方就不能解密。再说,密钥若能够安全发送,那数据也应该能安全送达。
2.2、非对称加密
公开密钥加密方式很好地解决了共享密钥加密的困难。
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥( privatekey),另一把叫做公开密钥( public key)。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
另外,要想根据密文和公开密钥,恢复到信息原文是异常困难的,因为解密过程就是在对离散对数进行求值,这并非轻而易举就能办到。问题:公开密钥加密也存在问题,那就是在传递公开秘钥的时候,公开密钥已经被替换。
2.3、证书
为了解决上述问题,可以适用数字认证机构颁发的公开秘钥证书。
流程:
首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
3、HTTP使用成本
- 证书费用和更新维护;
- HTTPS降低用户访问速度;
- 消耗CPU资源,需要增加大量机器。
五、HTTP的功能追加协议
1、HTTP的瓶颈
- 一条连接上只可发送一个请求。
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大。
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
- 可任意选择数据压缩格式。非强制压缩发送。
ajax轮询
Ajax 是一种有效利用JavaScript和DOM 的操作,以达到局部Web页面替换加载的异步通信手段。和以前的同步通信相比,由于它只更新一部分页面,响应中传输的数据量会因此而减少,这一优点显而易见。
Ajax的核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信。借由这种手段,就能从已加载完毕的Web页面上发起请求,只更新局部页面。
而利用Ajax实时地从服务器获取内容,有可能会导致大量请求产生。另外,Ajax仍未解决HTTP协议本身存在的问题。长轮询
客户端发起连接之后,若服务器没有新消息,客户端就一直等待,连接不断开,当服务端有新消息,会返回给客户端。
2、WebSocket
WebSocket是基于HTTP基础之上的协议。可以把WebSocket当做HTTP为了实现长连接而打的补丁。
2.1、WebSocket协议:
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送(全双工)JSON、XML、HTML或图片等任意格式的数据。
2.2、特点
- 推送功能
支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
- 减少通信量
只要建立起WebSocket连接,就希望- - 直保持连接状态。和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应减少了。
- 握手·请求
- 握手·响应
- WebSocket API
3、SPDY
SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL。
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie以及HTTP报文等。优点:
- 多路复用
通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一-条TCP连接上完成,因此TCP的处理效率得到提高。
- 赋予请求优先级
SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。
- 压缩HTTP头部
- 服务器提示 功能
服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。
- 推送功能
支持服务器主动向客户端推送数据的功能。
参考:
《图解HTTP》
大话HTTP