http
http简介
HTTP 超文本传输协议 (HyperText Transfer Protocol)是一种网络协议(网络协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则)
http设计目的
提供一种发布和接收HTML页面的方法。
网络基础TCP/IP
TCP/IP协议族里重要的一点就是分层,好处是解藕。TCP/IP协议族层次分别为以下4层:应用层、传输层、网络层和数据链路层。
-
应用层
- 应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol, 文件传输协议)和DNS(Domain Name System, 域名系统)服务就是其中两类。
HTTP协议处于应用层。
- 应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol, 文件传输协议)和DNS(Domain Name System, 域名系统)服务就是其中两类。
-
传输层
- 提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol, 传输控制协议)和UDP(User Data Protocol, 用户数据报)
-
网络层
- 网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
IP协议处于网络层。
- 网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
-
数据链路层
- 用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card, 网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。
TCP协议
TCP协议中的标识位(位码)
- SYN (synchronous建立联机)
- ACK (acknowledgement 确认)
- PSH (push传送)
- FIN (finish结束)
- RST (reset重置)
- URG (urgent紧急)
- Sequence number (顺序号码)
- Acknowledge number (确认号码)
TCP位于传输层,提供可靠的字节流服务。为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP一定会向对方确认是否成功送达。握手过程中使用了TCP的标志----SYN(synchronize)和ACK(acknowledgement)。 若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
-
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
-
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
-
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
-
简单来说就是:
- 客户端向服务端发送SYN
- 服务端返回SYN,ACK
- 客户端发送ACK
为什么要三次握手
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
两次或者四次可以么 ?
- 两次握手无法保证Client正确接收第二次握手的报文,也无法保证Client和Server之间成功互换初始序列号。
- 三次就可以实现,四次也可以,但是会降低传输的效率
http请求方法
- GET:获取资源
- POST:传输实体文本
- HEAD:获得报文首部
- PUT:传输文件
- DELETE:删除文件
- OPTIONS:询问支持的方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理
HTTP Request Header 常见的请求头
- Accept:浏览器能够处理的内容类型
- Accept-Charset:浏览器能够显示的字符集
- Accept-Encoding:浏览器能够处理的压缩编码
- Accept-Language:浏览器当前设置的语言
- Connection:浏览器与服务器之间连接的类型
- Cookie:当前页面设置的任何Cookie
- Host:发出请求的页面所在的域
- Referer:发出请求的页面的URL
- User-Agent:浏览器的用户代理字符串
HTTP请求消息Request
包括:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
1、GET /562f25980001b1b106000338.jpg HTTP/1.1
2、Host img.mukewang.com // 本次访问,将要访问的资源路径
3、User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 // 将浏览器的各类信息及其浏览器所在的环境等信息带过来,不同的浏览器有不同的信息,因此此信息由发送请求的浏览器来定义。
4、Accept image/webp,image/*,*/*;q=0.8
5、Referer http://www.imooc.com/
6、Accept-Encoding gzip, deflate, sdch
7、Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本. GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息 从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的,即使第四部分的请求数据为空,也必须有空行。 第四部分:请求数据也叫主体,可以添加任意的其他数据。这个例子的请求数据为空。
HTTP Responses Header常见的响应头
- Date:表示消息发送的时间,时间的描述格式由rfc822定义
- server:服务器名称
- Connection:浏览器与服务器之间连接的类型
- Cache-Control:控制HTTP缓存
- content-type:表示后面的文档属于什么MIME类型
http响应消息Response
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。 响应头:
响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号分割
| 响应头 | 说明 |
|---|---|
| Server | 服务器应用程序软件的名称和版本 |
| Content-Type | 响应正文的类型 |
| Content-Length | 响应正文的长度 |
| Content-Charset | 响应正文的编码 |
| Content-Encoding | 响应正文使用的数据压缩格式 |
| Content-Language | 响应正文使用的语言 |
第一部分:状态行,由HTTP协议版本号, 状态码(200), 状态消息(OK) 三部分组成。 第二部分:消息报头,用来说明客户端要使用的一些附加信息 第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的 第四部分:响应正文,服务器返回给客户端的文本信息。空行后面的html部分为响应正文。
http切换到HTTPS
具体实现方式是,去掉页面链接中的http头部,这样可以自动匹配http头和https头。例如:将www.baidu.com改为//www.baidu.…
http响应状态码
-
1xx:指示信息--表示请求已接收,继续处理
-
2xx:成功--表示请求已被成功接收、理解、接受
- 200 --- OK,客户端请求成功
- 201 --- (已创建) 请求成功并且服务器创建了新的资源。
- 202 --- (已接受) 服务器已接受请求,但尚未处理。
- 203 --- (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
- 204 --- (无内容) 服务器成功处理了请求,但没有返回任何内容。
- 205 --- (重置内容) 服务器成功处理了请求,但没有返回任何内容。
- 206 --- (部分内容)客户端发送了一个带有Range头的GET请求,视频/音频可能会用到
-
3xx:重定向--要完成请求必须进行更进一步的操作
- 301 --- 永久重定向,所请求的界面转移到新的url,永久重定向
- 302 --- 临时重定向,表示资源临时被分配了新的 URL
- 303 --- 表示资源存在着另一个 URL,应使用 GET 方法获取资源
- 304 --- 缓存,服务端告诉客户端有缓存可用,不用重新请求
- 305 ---(使用代理) 请求者只能使用代理访问请求的网页。
-
4xx:客户端错误--请求有语法错误或请求无法实现
- 400 --- Bad Request, 客户端请求有语法错误,不能被服务器所解析
- 401 --- Unauthorized, 请求未授权
- 403 --- Forbidden, 禁止页面访问,会在响应正文中给出不提供服务的原因
- 404 --- Not found, 请求资源不存在,如:输入了错误地址
- 405 ---(方法禁用) 禁用请求中指定的方法
-
5xx:服务器端错误--服务器未能实现合法的请求
- 500 --- Internal Server Error, 服务器错误
- 501 --- (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
- 502 --- (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
- 503 --- Server Unavailable, 请求未完成,服务器临时过载或者宕机,一段时间后可恢复正常
200 OK //客户端请求成功
301 moved permanently, //永久性重定向,表示资源已被分配了新的 URL
302 found, //临时性重定向,表示资源临时被分配了新的 URL
303 see other, //表示资源存在着另一个 URL,应使用 GET 方法获取资源
304 not modified, //表示服务器允许访问资源,但因发生请求未满足条件的情况
307 temporary redirect, //临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
501 Not Implemented //表示服务器不支持当前请求所需要的某个功能
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
http缓存(浏览器缓存)
http存在哪些问题
- 复杂性(特性之间是相互依存的)
- 扩展性差 (很难实现递增式扩展)
- 性能低(很多低效特性会随着高时延、低吞吐量的无线访问技术的广泛使用而变得更加严重)
- 高延迟 — 队头阻塞(Head-Of-Line Blocking)
- 无状态特性 — 阻碍交互
- 明文传输 — 不安全性
- 不支持服务端推送
http2
HTTP2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接。
http2新增特性:
- 二进制分帧 - HTTP2 性能增强的核心
- 只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。分帧有什么好处?服务器单位时间接收到的请求数变多,可以提高并发数。最重要的是,为多路复用提供了底层支持。
- 多路复用 - 解决串行的文件传输和连接数过多
- 一个域名对应一个连接,一个流代表了一个完整的请求-响应过程。帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多个流。
http2的缺陷
- TCP 以及 TCP+TLS 建立连接的延时
- TCP 连接需要和服务器进行三次握手,即消耗完 1.5 个 RTT 之后才能进行数据传输。RTT(Round-Trip Time):往返时延。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
- TCP 的队头阻塞并没有彻底解决
- TCP 为了保证可靠传输,有一个“超时重传”机制,丢失的包必须等待重传确认。HTTP2 出现丢包时,整个 TCP 都要等待重传,那么就会阻塞该 TCP 连接中的所有请求。
- 多路复用导致服务器压力上升
- 多路复用没有限制同时请求数。请求的平均数量与往常相同,但实际会有许多请求的短暂爆发,导致瞬时 QPS 暴增。
- 多路复用容易 Timeout
- 大批量的请求同时发送,由于 HTTP2 连接内存在多个并行的流,而网络带宽和服务器资源有限,每个流的资源会被稀释,虽然它们开始时间相差更短,但却都可能超时。
http3
基于 UDP 协议的 QUIC 协议。
http3特点
- 改进的拥塞控制、可靠传输
- 可插拔 — 应用程序层面就能实现不同的拥塞控制算法。
- 单调递增的 Packet Number — 使用 Packet Number 代替了 TCP 的 seq。
- 不允许 Reneging — 一个 Packet 只要被 Ack,就认为它一定被正确接收。
- 前向纠错(FEC)
- 更多的 Ack 块和增加 Ack Delay 时间。
- 基于 stream 和 connection 级别的流量控制。
- 快速握手
- 由于 QUIC 是基于 UDP 的,所以 QUIC 可以实现 0-RTT 或者 1-RTT 来建立连接,可以大大提升首次打开页面的速度。
- 集成了 TLS 1.3 加密
- 多路复用
- QUIC 是为多路复用从头设计的,携带个别流的的数据的包丢失时,通常只影响该流。QUIC 连接上的多个 stream 之间并没有依赖,也不会有底层协议限制。假如 stream2 丢了一个包,也只会影响 stream2 的处理。
- 连接迁移
- TCP 是按照 4 要素(客户端 IP、端口, 服务器 IP、端口)确定一个连接的。而 QUIC 则是让客户端生成一个 Connection ID (64 位)来区别不同连接。只要 Connection ID 不变,连接就不需要重新建立,即便是客户端的网络发生变化。由于迁移客户端继续使用相同的会话密钥来加密和解密数据包,QUIC 还提供了迁移客户端的自动加密验证。
https协议的优点:
- 传输数据安全
- 搜索引擎排名更高
https协议的缺点:
- SSL证书费用高
- SSL证书需要绑定IP
https协议的工作原理
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤
- 客户使用https url访问服务器,则要求web 服务器建立ssl链接。
- web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
- 客户端和web服务器端开始协商SSL链接的安全等级,也就是加密等级。
- 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
- web服务器通过自己的私钥解密出会话密钥。
- web服务器通过会话密钥加密与客户端之间的通信。