超文本传输协议HTTP
万维网(WWW)
- 万维网WWW(World Wide Web)是一个大规模的、联机式的信息储藏所
- 万维网用
链接的方式
从互联网上的一个站点访问另一个站点(链接到另一个站点),从而主动地按需获取丰富的信息
- 万维网是一个分布式的超媒体系统,它是超文本系统的扩充
- 超文本: 包含 指向其他文档的连接 的文本
- 超媒体与超文本的区别是文档的内容不同
(1)超文本文档仅包含文本信息
(2)超媒体文档除包含文本信息外还其他表示方式的信息,如图像、动画等
- 万维网把大量信息分布在整个互联网上,每台主机上的文档都独立进行管理
- 对这些文档的增加、修改、删除和重命名都不需要(实际上也不可能)通知到互联网上成千上万的节点
- 万维网以
客户端服务器
方式工作- 客户程序(浏览器)向服务器程序发出访问请求,服务器程序向客户程序送回客户所要的
万维网文档
- 网页: 在一个浏览器主窗口上显示出的万维网文档
- 万维网使用统一资源定位符URL(Uniform Resource Locator) 来标志万维网上的各种文档,并使每一个文档在整个互联网的范围内具有唯一的标志符URL
- 超文本传送协议HTTP(HyperText Transfer Protocol) 是一个应用层协议,它使用
TCP连接
进行可靠地传送- 万维网使用超文本标记语言HTML(HypterText Markup Language) 使得万维网页面的设计者可以方便地 用连接 从本网页的某处链接到互联网的任何一个万维网页面,并且能够在自己的主机屏幕上将页面显示出来
统一资源定位符URL
- 统一资源定位符URL用来表示从互联网上得到的
资源位置
和访问资源的方法
- URL的组成:
<协议>://<主机>:<端口>/<路径>
(1)协议:
最常协议:http
、ftp
(2)主机:
该主机在互联网上的域名
- 使用HTTP的URL:
http://<主机>:<端口>/<路径>
- URL的
<协议>
和<主机>
部分字母不分大小写,但<路径>
有时要区分大小写
- 在浏览器中输入URL地址显示页面的过程?
(1)根据域名进行DNS域名解析,目标是获取服务器的IP地址(具体过程参考DNS协议的文章)
(2)拿到IP地址后,结合默认的端口号,和服务器建立TCP连接
(3)建立TCP连接后,向服务器发起HTTP请求
(4)服务器响应HTTP请求,并返回html代码
(5)浏览器对html代码进行解析和呈现,断开连接
超文本传输协议HTTP
HTTP协议
定义了浏览器怎样向万维网服务器
请求万维网文档,以及服务器怎样把文档传送给浏览器- HTTP是面向事务的应用层协议, 事务是指一系列的信息交换,而这一系列的信息交换是一个不可分割的整体,即要么所有的信息交换都完成,要么一次信息交换都不进行
- HTTP协议是无状态的,即同一个客户第二次访问同一个服务器上的同一页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户, 也不记得为该客户曾经服务过多少次
HTTP/1.0
- 万维网客户把HTTP请求报文 作为TCP连接建立(
三报文握手
)中的第三个报文段的数据发送给万维网服务器 请求一个万维网文档所需的时间
=该文档的传输时间
+2倍往返时间RTT(一个RTT用于建立TCP连接,另一个RTT用于请求和接收万维网文档)
- HTTP/1.0使用了
非持续连接
,具有以下缺点:
(1)每请求一个文档就要有两倍RTT的开销
(2)万维网客户和服务器每一次建立新的TCP连接都要分配缓存和变量
HTTP/1.1
-
短连接 vs 长链接:
(1)短连接
:客户端与服务器每进行一次HTTP操作,就建立一次TCP连接,任务结束就中断连接
(2)长连接(持续连接)
:服务器发送响应后在一段时间内仍然内保持这条TCP连接,同一个浏览器和该服务器可以继续在这条连接上传送后续的HTTP请求
和响应报文
(3)HTTP/1.0默认使用短连接,HTTP/1.1默认使用长链接 -
HTTP/1.1的工作方式:
- 非流水线方式:
- 特点: 客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已经建立后,客户每访问一次就要用去一个往返时间RTT。
- 缺点: 服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
- 流水线传输:
- 客户在收到HTTP的响应之前就可以接着发送新的请求报文。
- 一个接一个的请求报文到达服务器后,服务器就可以连续发回响应报文;因此使用流水线方式时,客户访问所有的对象只需要花费一个RTT时间。
代理服务器
代理服务器
是一种网络实体,又称为万维网高速缓存
- 工作原理:
(1)代理服务器把最近的请求和响应暂存在本地磁盘中
(2)当新的请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址在此去互联网访问该资源
(3)若代理服务器中未存放请求的对象:
(1)
代理
服务器就代表发出请求的用户浏览器,与互联网上的源点服务器 建立TCP连接,并发送HTTP请求报文;
(2)源点服务器把所请求的对象放在HTTP响应报文中返回给代理服务器;
(3)代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后用);
(4)然后再把这个对象放在HTTP响应报文中,通过已建立的TCP连接,返回给请求该对象的浏览器。
HTTP报文结构*
- 由于HTTP是
面向文本
的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的 - 组成:
(1)开始行:用于区分是请求报文还是响应报文,在请求报文中叫做请求行,响应报文中叫做状态行
(2)首部行:用来说明浏览器、服务器或报文主体的一些信息,首部可以有多行
(3)实体主体:在请求报文中一般不用这个字段,而在响应报文中也可能没有这个字段 - 请求报文:
- 请求方法(重点):
- POST和GET的区别:*
(1)GET一般用于获取资源信息,POST一般用于更新资源信息
(2)本质区别:GET是幂等的,POST不是幂等的,幂等的意味着对同一URL的多个请求应该返回同样的结果
(3)GET把请求的数据放在URL上,以?分割URL和传输数据,参数之间以&相连,而POST把数据放在HTTP的请求体中,因此POST安全性更高
(4)GET请求会被浏览器主动缓存,而POST不会,除非手动设置
(5)GET提交的数据最大是2K(取决于浏览器和服务器对它的限制),POST理论上没有限制 - 响应报文:
(1)状态行:HTTP的版本
、状态码
、解释状态码的简单短语
- 状态码:
(1)1xx表示通知信息
,如请求收到了或正在进行处理
状态码 | 汉含义 |
---|---|
100 | 请求者应当继续提出请求 |
101 | 协议切换 |
(2)2xx表示成功
状态码 | 含义 |
---|---|
200 | 服务器已成功处理了请求 |
204 | 服务器成功处理了请求,但无响应体 |
206 | 服务器成功处理了客户端的范围请求 |
(3)3xx表示重定向
:浏览器需要执行某些特殊的处理以正确处理请求
状态码 | 含义 |
---|---|
301 | 资源永久重定向:请求的资源已被分配新的URI,以后应该使用资源现在所指的URI |
302 | 资源临时重定向 |
304 | 资源未被修改 |
(4)4xx表示客户的差错
状态码 | 含义 |
---|---|
400 | 请求报文出现语法错误 |
401 | 请求需要通过HTTP认证或认证失败 |
403 | 拒绝提供服务(未获得访问权限等) |
404 | 资源不存在 |
408 | 请求超时 |
(5)5xx表示服务器的差错
状态码 | 含义 |
---|---|
500 | 服务器出现错误 |
503 | 服务器超负荷或停机维护,暂时不能处理客户端请求 |
504 | 网关超时 |
Cookie和Session*
- HTTP是无状态的,它不对之前的请求和响应状态进行管理,无法根据之前的状态对本次请求进行处理
- Cookie是
客户端保持状态的方法
,即将用户状态信息存储在浏览器中;Session是服务器保存状态
的方法,即将用户状态信息存储在服务器中 - Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它在浏览器之后向同一服务器发起请求时被携带上,用于告知服务器用户状态信息,继续之前的业务操作
- Cookie的保存形式:
(1)会话Cookie
:保存在内存
中,关闭浏览器后会自动销毁
(2)持久Cookie
:存储在客户端磁盘
中,其有效期在服务器响应头部被指定,在有效期内,客户端再次请求服务器都可以直接从本地取出 - Session的工作原理:
(1)用户在登录时,会提交包含用户名和密码的表单,并放入HTTP请求报文中
(2)服务器验证该用户名和密码,若正确则把用户信息存储到Redis中,它在Redis中的Key
称为Session ID
(3)服务器响应报文中的Set-Cookie首部字段
包含了该Session ID
,客户端收到响应报文后将该Cookie值
存入浏览器中
(4)客户端之后对同一服务器发起请求时会包含该Cookie值,服务器收到后,从请求报文中提取出Session ID
,从Redis找到用户信息,继续之前的业务操作
-
Cookie和Session的区别:*
(1)存储位置不同
:cookie:存放在客户端,session:存放在服务端(更安全)
(2)存储的数据类型不同
:两者都是key-value,但针对value的类型是有差异的,cookie的value只能是字符串类型,而session的value可以是任何数据类型
(3)存储的数据大小不同
:cookie:大小受浏览器的限制,单个Cookie一般不超过4K,session:session对象没有对存储数据量的限制
(4)生命周期控制不同
:cookie的生命周期是累计的,从创建时,就开始计时,20分钟后cookie的生命周期结束;session的生命周期是间隔的,从创建时开始计时,如在20分钟没有访问session,那么session生命周期被销毁 -
Session和Cookie如何去选择:
(1)Cookie只能存储字符串,而Session则可以存储任何类型的数据,因此考虑数据复杂性时首选Session
(2)Cookie存储在浏览器中,容易被恶意查看,如果非要将一些隐私数据存放在Cookie中,可以考虑将Cookie值进行加密,然后再服务器进行解密
(3)对于大型网站,如果用户所有的信息都存储在Session中,那么开销非常大,因此不建议将所有的用户信息都存储在Session中
万维网的文档
- 超文本标记语言HTML
- 超文本标记语言HTML(HyperText Markup Language) 是一种制作万维网页面的标准语言,它消除了不同计算机之间信息交流的障碍。
- 动态万维网文档
- 静态文档: 静态文档在文档创作完成后就存放在万维网服务器中,在被用户浏览的过程中,内容不会改变,因此用户对静态文档的每次读取所得到的返回结果都是相同的。
- 动态文档: 文档的内容是在浏览器访问万维网服务器时才由应用程序动态创建的。
- 当浏览器请求到达时,万维网服务器要运行另一个应用程序,并把控制转换到该应用程序。接着,该应用程序对浏览器发来的数据进行处理,并输出HTML格式的文档,万维网服务器把应用程序的输出作为对浏览器的响应。
- 优点: 具有报告当前最新信息的能力。
- 通用网关接口CGI(Common Gateway Interface)。CGI是一种标准,它定义了动态文档应该如何创建,输入数据应如何提供给应用程序,以及输出结果应如何使用。
- CGI程序的正式名称是CGI脚本(script)。脚本指的是一个程序,它被另一个程序(解释程序)而不是计算机的处理机来解释或执行。使用脚本语言可以更容易或更快地进行编码,适合有限功能的小程序,但脚本运行的速度比一般的编译程序要慢,因为它的每一条指令先要被另一个程序处理(这就要一些附加的指令)而不是直接被指令处理器来处理。
- 活动万维网文档
- 活动文档一旦建立,它所包含的内容也就固定下来而无法及时刷新屏幕。此外无法显示动画之类的显示效果。
- 用于浏览器屏幕显示的连续更新:
服务器推送
和活动文档
- 服务器推送
- 服务器推送: 这种技术将所有的工作都交给服务器。服务器不断地运行与动态文档相关联的应用程序,定期更新信息,并发送更新后的文档。
- 缺点:
(1)为满足许多用户的需求,服务器就要运行许多服务器推送程序,造成过多的服务器开销。
(2)服务器推送技术要求服务器为每一个浏览器客户端维持一个不释放的TCP连接,随着TCP连接数目的增多,每一个连接所能分配到的网络带宽就下降,导致网络延时的增加。
- 活动文档
- 活动文档: 活动文档把所有的工作都转移给浏览器,每当浏览器请求一个活动文档时,服务器就返回一段活动文档程序副本,使程序副本在浏览器端运行。
HTTPS(补)*
-
什么是HTTPS:
(1)HTTPS是超文本传输安全协议,不是一个新的协议,而是让HTTP先和SSL通信,再由SSL和TCP通信,HTTPS是披着SSL外壳的HTTP
(2)通过使用SSL,HTTPS具有了防窃听、防伪装和防篡改的能力 -
HTTPS
和HTTP
的区别(HTTP
的缺点):
(1)HTTPS克服了HTTP在安全性上存在的许多缺陷
(2)HTTP使用明文进行通信,因此内容可能会被窃听
(3)HTTP不验证通信方的身份,因此身份可能遭遇伪装
(4)HTTP无法证明报文的完整性,因此报文有可能遭遇篡改
(4)HTTPS通过使用SSL,具有防窃听
、防伪装
和防篡改
能力
(5)使用HTTPS通信时,不再使用http://
,而是改用https://
-
HTTPS如何保证数据传输的安全:
(1)协商加密算法:
客户端向服务器发起SSL连接请求
,请求报文中包含客户端支持的SSL版本、加密算法等,服务器从中选定自己所支持的算法并告知客户端
(2)服务器鉴别:
服务器B向浏览器A发送包含其公钥的数字证书,浏览器A使用该证书的认证机构CA公开发布的公钥对证书进行验证
(3)会话密钥计算:
浏览器A随机产生一个秘密数,用服务器B的公钥进行加密后发送给服务器B,双方根据协商的算法产生共享的对称会话密钥
(4)安全数据传输:
双方用会话密钥加密和解密它们之间传送的数据并验证其完整性
-
HTTPS采用的加密方式有哪些(对称秘钥和非对称秘钥的区别):
(1)HTTPS采用了混合加密机制
,对称密钥加密方式的相比于非对称密钥加密方式更加简单,效率更高,但无法安全地将密钥传送给通信方
(2)非对称密钥
的加密方式中公开秘钥
所有人均可以获得,明文使用公开秘钥加密后,接收方只有使用私有秘钥才能解密获得明文,因此无需担心公开密钥传输过程中被窃取的问题,但加解密过程复杂,运算速度慢,同时公开加密方式暂用的系统开销比较大
(3)HTTPS充分利用两者的优势,将两种加密方式组合起来用于通信,在交换密钥环节
使用非对称秘钥的加密方式
,建立通信后的报文交换阶段
则使用对称密钥加密方式
- 客户端如何证明服务器的公开密钥是货真价实的公开密钥:
(1)可以使用客户端和服务器都信赖的第三方数字证书认证机构CA
颁发的公开密钥证书
来证明
(2)首先服务器的运营人员向CA提交公开密钥申请,CA判明申请者的身份后,会对已申请的公开密钥做数字签名
,然后分配这个公开密钥,并将该公开密钥放入密钥证书
后绑定在一起
(3)进行HTTPS通信时,服务器会把证书发送给客户端,客户端使用CA的公开密钥对证书上的数字签名进行验证,若验证通过,就可以开始通信