前言
1. http和tcp有什么区别和联系?
2. http报文格式是什么样的?
3. http常用的头部字段分别代表什么含义?
4. http常用的状态码分别代表什么含义?
5. https提供了哪些机制保证安全?
6. websocket解决了http的什么弊端?
目录
http相关基本概念
http报文
http响应状态码
http安全-https
http认证
websocket协议
一. 基本概念
1. 概述
- web理念:文档之间相关关联,连成可相互参阅的万维网(www)
- web互连(通讯)的基础:tcp/ip协议族,http属于它内部的子集
- web(www)的三项构建技术:
- html:页面使用什么语言展示
- URL:页面在什么位置
- http:文档之间传递的协议是什么
- tcp/ip协议族分层包括:数据链路层,网络层,传输层 ,应用层
- tcp/ip协议族分层作用:各层各司其职,模块划分清晰,便于维护,解耦
2. 各分层概述
2.1 应用层
- 决定了向用户提供应用服务时通讯的活动
- 包括:FTP,DNS,HTTP等
2.2 传输层
- 提供网络中两台计算机之间的数据传输
- 包括:TCP,UDP
2.3 网络层
- 众多选项中选择合适的传输路径传输数据包
2.4 链路层
- 用来处理网络的硬件部分
3. tcp/ip数据传输方式
- 利用tcp/ip协议族通讯时,通过分层顺序通讯。
- 发送端从应用层往下走,接收端从应用层往上走
- 发送端每经过一层都会被打上该层所属的首部信息,接收端每经过一层将把首部去掉
4. 与http协议密不可分的协议
4.1 IP协议
- 位于网络层
- 作用是把各种数据包传送给对方
- 确保传送正确的两个条件
- IP地址:指明了节点被分配到的地址。可变。
- MAC地址:网卡所属的固定地址。不可变。
4.2 TCP协议
- 位于传输层
- 作用是提供可靠的字节流服务
- 字节流服务:将大块数据分割成以报文段为单位的数据包
- 可靠:采用三次握手策略
4.3 DNS协议
- 应用层协议
- 作用是提供域名到ip地址之间的解析服务
4.4 各种协议的关系
4.5 http协议和tcp协议的区别与联系
区别
- 所属协议层不同:tcp属于传输层,http属于应用层
- 职责不同:tcp解决数据传输问题,http解决数据包装问题
联系
- http协议是构建在tcp协议之上的
- 打个比方:ip是高速公路,tcp是跑在高速公路上的卡车,http是卡车里面的包裹
5. URL与URI
- URL:统一资源定位符,资源的地址。是URI的子集
- URI:统一资源标识符,用字符串标识某一互联网资源
- URI的格式
6. 应用程序划分
- 客户端:请求资源的一端
- 服务端:提供资源响应的一端
- 代理:有转发功能的应用程序,位于客户端和服务器的中间人角色
- 作用:缓存,访问控制
- 网关:转发其他服务器通讯数据的服务器。与代理类似,不过网关能使通信线路上的服务器提供非http协议服务
- 作用:提高安全性:客户端与网关之间的通信线路加密
- 隧道:客户端与服务端建立一条特殊通信线路,使用ssl等手段加密,提高安全性
二. HTTP报文
1. 概述
- 用于http协议交互的信息被称为报文
- 报文分为请求报文和响应报文
- 报文首部字段包括很多维度:内容编码,分块传输,多部分对象集合,范围请求,内容协商等
2. 报文格式
- 报文由报文首部和报文主体两部分组成,中间由空行分开
- 请求行:包含请求方法(get,post),请求URI,http版本
- 状态行:响应结果状态码,原因,http版本
- 首部字段:通用首部,实体首部,请求首部,响应首部
- 其他:cookie等信息
3. 内容编码
- 指明内容等编码格式,客户端负责解码
- 能有效地处理大量等访问请求,不过会消耗更多cpu
- 常用的内容编码
- gzip(GNU zip)
- compress(unix系统标识压缩)
- deflate(zlib)
- identity(不编码)
4. 分块传输
- 把实体主体分块的功能
- 用于传输大容量数据
- 每一块都标记大小,最后一块用0标记
5. 多部分对象集合
- 发送一份报文主体内可包含多类型实体
- 使用时需要在首部字段里添加:Content-type
- 包含的对象如下(content-type的值):
- multipart/form-data:web表单文件上传时使用
- multipart/byteranges:响应报文包含多个范围的内容时使用
6. 范围请求
- 指定范围发送的请求
- 解决网络中断必须从头下载的问题
- 用到首部字段Range指定资源的byte范围:Ranges:bytes=5001-10000
- 响应会返回206状态码和响应报文
7. 内容协商
- 客户端和服务端就响应内容进行交涉,提供最合适的资源
- 协商判断的依据有:响应资源的语言,字符集,编码方式
- 包含的首部字段:Accept,Accept-Charset,Accept-Encoding,Accept-Language,Content-Language
三. 响应状态码
1. 概述
- 描述请求的处理结果
- 状态码的类别
状态码 类别 描述 1XX 信息性状态码 接收的请求正在处理 2XX 成功的状态码 请求正常处理完毕 3XX 重定向状态码 需要进行附加操作以完成请求 4XX 客户端错误状态码 服务器无法处理请求 5XX 服务器错误状态码 服务器处理请求出错
2. 2XX成功
- 200: OK:正常处理
- 204: No Content,服务器接受的请求成功处理,但返回但响应报文不包含主体部分
- 206: Partial Content,服务器成功执行客户端的范围请求,响应报文中包含Content-Range指定范围的内容
3. 3XX重定向
-
301: 永久性重定向,表示请求的资源已经分配了新的uri,以后应使用新的uri
-
302: 临时性重定向,表示请求的资源uri临时性被移动
-
303: 指明客户端应该用Get方法去请求,而不是post
当301, 302, 303状态码返回时,几乎所有浏览器都会把Post改为Get,并删除请求报文的主体,之后请求会自动再次发送
-
304: Get请求中含有附加条件时,请求的资源不满足这些条件。这些附加条件包括:If-Math,If-Modified-Since,If-None-Match,If-Range,If-UnModified-Since中的任意一个
-
307:临时重定向,类似302,不过不会从post变为get
4. 4XX客户端错误
- 400:请求报文中存在语法错误
- 401: 用户认证失败
- 403: 无权限访问
- 404: 无法找到请求的资源,url不存在
5. 5XX服务端错误
- 500: 服务器处理出错,可能是内部的bug
- 502: 错误的网关,资源发送给上游服务器时发送不了
- 503: 服务器处理高负载或停机维护状态,无法处理请求
四. Http首部
1. 首部字段的格式
- 首部字段名:字段值(可为多个)
- 单值:Content-Type: text/html
- 多值:Keep-Alive:timeout=15, max=100
- 首部字段重复,规范里没有明确规定如何处理,各个浏览器不同
2. 首部字段分类
- 通用首部字段:请求和响应都使用的字段
- 请求首部字段:客户端信息,请求的附加信息等
- 响应首部字段:响应的附加信息
- 实体首部字段:请求和响应的实体部分使用的字段
3. 首部字段概览
- http1.1共规定里47中首部字段
3.1 通用首部字段有:
- Cache-Control:控制缓存的行为
- Connection:连接的管理
- Keep-Alive:维持持续连接(http1.1默认持久连接,之前版本没有)
- close:表示关闭持久连接
- 其他首部字段:表示这个首部字段不再转发给代理服务器
- Date:创建时间
- Pragma:报文指令
- http1.0及向前版本的兼容字段
- Trailer:报文末端的首部
- Transfer-Encoding:报文主体传输编码方式
- http1.1仅对分块传输有效
- Upgrade:升级为其他协议
- Via:代理服务器相关信息
- Warning:错误通知
3.2 常用的请求首部字段有:
- Accept:用户代理可处理的媒体类型
- Accept-Charset:优先的字符集
- Accept-Encoding:优先的内容编码
- gizp
- compress
- deflate
- identity
- Accept-Language:优先的语言
- Authorization:web认证信息
- Host:请求资源的服务器
- User-Agent:客户端程序信息
- Range:字段范围请求
- Referer:请求的原始资源的URI
3.3 常用的响应首部字段有:
- Accept-Ranges:是否接受字段范围请求
- Age:推算字段创建经过时间
- Server:服务器的安装信息
- Retry-After:再次发起请求的时机要求
3.4 常用的实体首部字段有:
- Allow:可支持的http方法
- Content-Encoding:实体主体的编码方式
- Content-Language:实体主体的自然语言
- Content-Length:实体主体大小
- Content-Type:实体主体的媒体类型
- Expires:过期时间
- Last-Modified:最后修改时间
3.5 其他首部字段
- Cookie:请求首部字段,服务器收到客户端传来的cookie
- Set-Cookie:响应字段,服务器传给客户端的cookie。包含的属性:
- name=value:cookie的名称和值
- expires:有效期,不指定则默认为浏览器关闭时
- path:服务器上的文件目录作为Cookie的适用对象
- domain:cookie适用对象的域名
- Secure:仅在https安全通信时才会发送cookie
- HttpOnly:Cookie不能被javascript脚本访问
- Connection
- Keep-Alive
五. HTTPS
1. http的缺点
- 通信适用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,可能遭遇伪装。典型如:DOS攻击
- 无法证明报文的完整性,内容可以被篡改。典型如:中间人攻击(MITM)
2. 解决策略
2.1 防止被窃听的对策
- 内容的加密:将http报文所含的内容进行加密。该方案的缺点:
- 需要客户端和服务器都有加密和解密机制
- 内容也有被篡改的风险
- 通信的加密:http协议中没有加密机制,通过和SSL,TLS组合使用,加密http的通信内容。SSL在客户端和服务器建立安全的通信线路。
2.2 防止伪装的对策
- SSL提供的证书,可以作为通讯双方身份认证的功能
2.3 防止内容被篡改的策略
- SSL提供的摘要功能可以解决
3. HTTPS
3.1 概述
- https = http + 加密 + 认证 + 完整性保护
- https并非应用层新协议,只是通信接口部分用SSL和TLS协议代替而已
- http直接和tcp通信。使用ssl时,http先和ssl通信,再由ssl和tcp通信
3.2 常用的加密方式
共享密钥加密
- 也叫对称密钥加密,加密和解密用同一个密钥
- 缺点:无法安全的将密钥发送给接收方
公开密钥加密
- 使用一对非对称的密钥,一把交私有密钥,一把交公开密钥。
- 发送密文的一方使用对方的公开密钥进行加密,对方收到加密信息后用自己的私钥解密
- 不需要发送私钥,不用担心信息被窃取
- 要根据密文和公钥恢复原文信息,以目前的技术是非常困难的
- 缺点:处理速度较慢
3.3 https的加密方式
- 采用共享密钥加密和公开密钥加密两种方式
- 交换密钥环节采用公开密钥加密
- 建立通信之后,报文交换阶段采用共享密钥加密
3.4 数字证书
- 公开密钥加密的问题:无法证明公开密钥本身的正确性
- 解决方案:由数字证书机构和相关机构颁发的公开密钥证书
3.5 为什么不一直使用https
- 加密通信会消耗更多的cpu和内存资源,服务器处理的请求量会降低。所以一般非敏感信息使用http,敏感信息才使用https
- 购买证书的开销比较大
六. http认证
1. 概述
http1.1使用的认证方式有:
- Basic认证
- Digest认证
- SSL客户端认证
- FormBase认证
2. Basic认证
- http1.0就定义的认证方式
- 原理:将”用户名:密码”字符串做base64加密,然后作为首部Authorization字段的值传给服务端
- 缺点:没有加密,安全等级低
- 使用率:并不常用
3. Digest认证
- http1.1定义的认证,为了弥补basic认证的不足
- 原理:发送方请求认证->接收方返回质询码->发送方根据质询码计算响应码发给接收方做验证
- 优点:提供防止密码被窃听的保护机制
- 缺点:无法保证用户被伪装
- 使用率:仍达不到web网站安全要求,使用受限
4. SSL客户端认证
- 借助客户端的证书完成认证
- 双因素认证方式:密码+证书。
- 使用率:客户端证书需要一定费用,尚未普及
5. FormBase认证
- web应用程序各自实现的认证方式
- 使用率:web应用常用的认证方式
6. 状态的管理
- http本身没有状态管理,每次请求并不知道上次请求内容
- 使用Cookie和Session作为状态管理,弥补了http的不足
六. WebSocket协议
1. 概述
- 是html5提供的一种在单个tcp连接上进行全双工通信的协议
2. 为什么会出现该协议?
http协议有以下弊端:
- 一条连接上只可以发送一条请求
- 请求只能从客户端开始,客户端不可用接受除响应以外的指令
- 首部信息没有压缩,延迟大
- 每次请求都要发送冗长的首部信息
- 可任意选择压缩格式,没有强制压缩
websocket协议为解决这些弊端而生。
3. websocket的特点
- 支持服务器向客户端推送数据的功能。服务器可直接发送数据,不用等待客户端请求
- 减少通信量:只要建立连接,就一直保持连接状态。不仅连接开销小,且首部信息很少,减少通信量
4. websocket通信机制
- 在http建立连接后,需要完成一次“握手”步骤
- 附加头信息中添加"Upgrade: WebSocket",表明这是一个申请协议升级的 HTTP 请求
- Sec-WebSocket-Key:记录握手过程中的键值
- Sec-WebSocket-Protocol:记录使用的子协议
参考文献
《图解http》