超级文本传输协议HTTP
1.定义
HTTP是浏览器和Web服务器之间应用层通信协议,Web服务器存放的都是超文本信息,浏览器需要通过HTTP协议传输所要访问的信息,HTTP规定了访问的格式和规则,以能够可靠地交换文件(文本、声音、图像等多种多媒体文件)
2.统一资源定位符URL
使用URL来定位互联网上上的资源,用户浏览页面的方式有两种,一种是在浏览器的地址窗口中键入所要找的页面的URL,另一种是在某一个页面中用鼠标点击一个可选部分,这时浏览器会自动在因特网上找到所要链接的页面。
协议:http、https、ftp
主机:域名或者IP地址
端口:http默认是80端口,可以省略
路径:如果省略需要,需要定义默认首页
访问Web服务器的三种区分方法:
IP地址
端口号
域名:IP地址可以相同,端口号可以都是80,通过域名访问
3.HTTP的工作过程
①浏览器分析链接指向页面的URL;
②浏览器向DNS请求解析域名的IP地址;
③域名系统DNS解析出清华大学服务器的IP地址;
④浏览器与服务器建立TCP连接,三次握手;
⑤浏览器发送请求报文
⑥服务器发送请应答报文
⑦服务器发送数据
⑧关闭tcp连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代:Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
4.HTTP的协议版本
http1.0与http1.1的区别
①长连接
http1.0每个文件都需要建立一个TCP连接,http1.1只要建立一个TCP连接就可以传输多个文件,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
②节约带宽
HTTP1.0中,存在一些浪费带宽的现象,客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
③错误通知
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
④Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
⑤缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
http1.1与2.0的区别
①多路复用
同一个连接可以并发处理多个请求,单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;由于减少TCP 慢启动时间,提高传输的速度
原理:采用二进制分帧的技术,在二进制分帧层中, HTTP/2 会将所有传输的信息分割为帧(frame),并对它们采用二进制格式的编码 ,其中 首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。
②首部压缩
为使数据传输更快,HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩
在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。
③HTTP2支持服务器推送
HTTP1.x明确每一条资源都必须请求,在浏览器增量获取资源的过程中,服务器等待请求,处于空闲状态。
为了改善延迟,HTTP/2引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前。一个服务器经常知道一个页面需要很多附加资源,在它响应浏览器第一个请求的时候,可以开始推送这些资源。这允许服务端去完全充分地利用一个可能空闲的网络,改善页面加载时间。
https与http的区别
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密。
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
数字证书:
防止中间人窃取公钥,顶替发送数据,要声明这个公钥确定来自目标者,公钥和个人信息用一个Hash算法生成一个消息摘要, 这个Hash算法有个极好的特性,只要输入数据有一点点变化,那生成的消息摘要就会有巨变,这样就可以防止别人修改原始内容。
为防止中间人将整个原是信息都替换掉,有公信力的认证中心(简称CA)用它的私钥对消息摘要加密,形成签名,把原始信息和数据签名合并, 形成一个全新的东西,叫做“数字证书”
HTTPS传输过程:
①客户端向服务器发送HTTPS请求,连接到服务器443端口
②服务器将自己的公钥发送给客户端。
③客户端收到服务器端的公钥之后,会对公钥进行检查,验证服务器发送的数字证书的合法性。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,即客户端密钥,然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
④客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
⑤服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
⑥然后服务器将加密后的密文发送给客户端。
⑦客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
5.HTTP的报文格式
请求报文:从客户端向服务器发送请求报文
①请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
②请求方法:
GET:最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。
POST:对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参 数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中,保证了数据的保密性,而POST提交,地址栏不会改变。
③首部行
首部行由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
最后一个首部行之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
④实体主体
当请求方式是post的时,请求体有请求的参数;
如果请求方式为get,那么请求参数不会出现在请求体中,会拼接在url地址后面
响应报文:服务器给客户端的应答报文
①状态行
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
常用的状态码:
200 表示OK客户端请求成功
404 请求资源不存在,可能是URL资源定位错误
403 服务器接受请求,但拒绝提供服务
503 服务器不能处理当前请求,一段时间后可能恢复正常
100 服务器接受了请求,等待客户端继续发送
②消息头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
③响应正文
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
6.cookie和session
HTTP协议是无状态的;HTTP协议的请求过程,是基于 TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,该过程是无状态的。
但是在有些时候是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的、有针对性的去分析某些客户端的习惯。这些时候,就需要去记录客户端的连接状态,识别请求的状态等。所以为了解决类似的事情,就需要使用到了 Cookie 和 Session。
①Cookie:在客户端访问某个地址时,会将请求交到服务器进行处理,在发送请求的时候,浏览器会将页面的头部信息一并的交到服务器端进行处理。在处理的过程中,Cookie 在服务器端生成 ,在此同时,可以将一些需要保存的信息,存放到此 Cookie 中。生成 Cookie 对象时,需要确定具体的名称及具体的值,可以设置当前 Cookie 的过期时间,设置过期时间后,就相当于持久化了 Cookie 中的数据,此时的 Cookie 会以之前的 Cookie 名称,会以文件形式保存在客户端。
在下次客户进行请求的时候,Http 会附带着已经存储过的 Cookie,一并发送到服务器。
②Session:Session 是在服务器端生成的,存储在服务器端,会为本次请求开辟一块内存空间。Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录
6.代理服务器
代理服务器 (proxy server) 又称为万维网高速缓存 (Web cache),它代表浏览器发出 HTTP 请求。万维网高速缓存把最近的一些请求和响应暂存在本地磁盘中。当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去互联网访问该资源。
优势:
①可以控制内网中的计算机,在路由器上设置只允许代理服务器的地址访问外网,内网计算机需要找代理服务器才能上网,代理服务器就可以限制访问的网站、时间、IP地址等
②通过Web代理服务器可以绕过防火墙,例如翻墙技术
③利用代理服务器的高速缓存,节省了上网带宽
7.HTTP的特点
①无状态:HTTP协议本身没有记忆能力。
没有记忆能力代表HTTP协议本身并不知道你是新访问者还是旧访问者,这会导致一个问题,很多网站必须要记住已经登陆过的用户,总不能每刷新一次页面就要求用户重新输入帐号密码。HTTP服务器开发者还必须额外利用cookies与session来实现记忆功能
②无连接:HTTP协议本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。
③持续连接:HTTP1.1它使用了持续连接,即万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。
持续连接有两种工作方式,即非流水线方式和流水线方式。
非流水线方式,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续连接的两倍RTT的开销节省了建立TCP连接所需的一个RTT时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
流水线方式,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可持续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率