文章目录
HTTP
超文本传输协议
1.0
1.1(主流版本)keepline
2.0
特点
- 支持CS模式
- 协议简单所以简单快速 ( 只需传送方法(get head post)和路径)
- 灵活 任意数据类型的对象
- 无连接 每次连接只处理一个请求 请求完等待一定时间就断开
- 无状态
请求结构
URL:
响应结构
请求/响应的步骤
- 客户端连接到Web服务
- 发送HTTP请求
- 服务器接收请求并返回HTTP响应
- 释放连接TCP连接
- 客户端浏览器解析html内容
输入地址 按下回车后的流程
- DNS解析
由提供的URL经过DNS解析系统来的得到主机的IP地址
解析过程:先搜索浏览器自身DNS缓存,如果找到没有过期的对应条目,解析结束
否则回到操作系统的DNS缓存找,有则结束
否则读取hosts文件有没有,有则结束
否则向本地配置的首选DNS服务器发起域名解析请求。 - 封装HTTP数据包
报文的组成具体见上图:
- 开始行是请求行 由请求方法(get post 等等)请求资源的URL HTTP版本
http 0.9 只能有get没有协议头 只能纯文本
http 1.0 还在用
http 1.1 最广泛的协议版本 与1.0的主要区别就是是否持久连接 1.0一个tcp只传输一个web对象 默认为持久连接 也可以设置成非持久连接
http 2.0传输性能好 低延迟 叫2.0是因为新增二进制分帧层 传输的信息分割成更小的帧与消息,二进制格式编码,可以乱序发送,根据每个帧的标识符重新组装。 - 头部行 说明浏览器服务器报文主体的信息
不管有没有请求正文都有一个回车符 换行符 - 请求正文 一般不使用
- 封装成TCP包 建立TCP连接 发送请求报文
HTTP请求报文作为三次握手的第三个报文的数据发送给服务器
TCP建立后,客户端发送一个http请求给服务器,请求方法格式URL,协议版本号,MIME信息(客户端信息,实体信息) - 服务器接收到请求后返回响应报文
格式是状态行 协议版本号和一个成功或者错误的代码+MIME信息(服务器信息,实体信息) - 浏览器解析渲染页面
- 连接结束
HTTP 1.0中的请求方法
get post 区别
三个层面:
HTTP报文层面:GET将请求放在URL,POST放在报文体中
数据库层面:GET符合幂等性和安全性,POST不符合
其他层面:GET可以被缓存、被存储,POST不行
(1)PUT
向指定资源位置上传其最新内容。
(2)DELETE
请求服务器删除 request-url所标识的资源。
(3)OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法。
(4)HEAD
向服务器索要与get请求相一致的响应,但是响应体将不会被返回。
(5)TRACE
回显服务器收到的请求,主要用于测试和诊断。
(6)CONNECT
预留给能够将连接改为管道方式的代理服务器。
状态码
常见状态码:
-
200 Ok
get方法下 会返回资源 -
204 No Content
不返回资源 -
206 Partial Content
返回一部分资源 -
301 Moved Permanently
永久性重定向 请求资源分配了新的URI 如果此时保存书签则保存的新的URI -
302 Found
临时性重定向 请求的资源也是分配了新的URI,但是保存成书签则不会想301去更新书签依然保留返回302的页面的URI -
303 See Other
请求资源存在另外一个URI 应使用get定向获取请求资源 302 与303相同,但是303明确要使用GET方法获取资源 -
当301 302 303状态码返回时候 几乎所有浏览器都会把post 改成 get 删除请求报文主体 自动再次发送请求
-
400 Bad Request
请求报文有语法错误,需要修改请求再次发送 -
401 Unauthorized
请求没有经过授权 请求身份验证 -
403 Forbidden
收到请求,但被服务器拒绝 IP禁止 -
404 Not Found
请求资源不存在 -
500 Internal Server Error
服务器的错误 -
503 Service Unavailable
服务器超负荷或者维护
cookie 与 session
Cookie 与 Session 都可以进行会话跟踪,主要作用都是在整个会话过程中,实现数据的跨页面访问,但是实现的原理不太一样。
区别:
(1)cookie在客户端记录信息确定用户身份,session在服务器端记录信息确定用户身份。
(2)Cookie是服务器发给客户端的特殊信息,cookie是以文本的方式保存在客户端,每次请求时都带上它。
(3)Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。。
(4)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
(5)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
联系:
(1)cookie和session都是用来跟踪浏览器用户身份的会话方式。
(2)session 的运行依赖 session id,而 session id 是存在 cookie 中的,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)。
Session是保存在服务器端的,每个用户都会产生一个Session。如果并发访问的用户非常多,会产生非常多的Session,消耗大量的内存。 而Cookie保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie是很好的选择。
HTTP版本之间的区别
- HTTP1.1与1.0
(1)长连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,一定程度上弥补了HTTP 1.0每次请求都要创建连接的缺点。
(2)错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
(3)带宽优化及网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
(4)Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
(5)缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 - HTTP2.0与1.x
HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段这些核心概念没变,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。
(1)新的二进制格式(Binary Format)
而之所以叫2.0,是在于新增的二进制分帧层。HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
(2)多路复用(MultiPlexing)
即连接共享,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
(3)header压缩
HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
(4)服务端推送(server push)
同时还可以让服务器将响应主动“推送”到客户端缓存中,以此来避免往返的延迟。
HTTPS
HTTPS传输流程
1.浏览器将支持的加密算法信息发送给服务器
2.服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器
3.浏览器验证证书合法性,并结合证书公钥加密信息发送给浏览器
4.服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器
5.浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据
用户在浏览器中输入域名后 首先是浏览器自动补全http://而不是https://所以在这个时候会进行301 302跳转 会有被劫持的风险
HTTP与HTTPS的区别
(1)HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
(2)HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
(3)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(4)HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。