- 请求报文
- 请求行 方法、URL、HTTP版本
- 请求头(请求首部)
- Cookie
- Cache-control:HTTP/1.1的产物,优先级高于Expires,可以在请求头或响应头设置,多种指令如下
- public 可以被客户端和代理服务器缓存
- private 只可以被客户端缓存
- no-store 不缓存任何响应
- no-cache 资源被缓存但立即失效,下次请求会验证资源是否过期
- If-None-Match :将当前的Etag发送给服务器
- If-Modified-Since :会将Last-Modified 的值发送给服务器
- 空行
- 请求体
- 响应报文
- 响应行 HTTP版本、状态码、状态码含义
- 响应头(响应首部)
- Expires:HTTP/1.0 的产物,受限于本地时间,如果修改了本地时间,可能会造成缓存失败
- Etag HTTP/1.1出现
- Last-Modified
- Cache-control
- Content-Security-Policy(CSP)
- 空行
- 响应体
- HTTP 方法
- GET 获取资源
- POST 传输资源
- PUT 更新资源
- DELETE 删除资源
- HEAD 获取报文首部
HTTP状态码
1xx 提示信息——表示请求已接收,继续处理
2xx 成功——表示请求已被成功接收
- 200 OK,表示从客户端发来的请求在服务器端被正确处理
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content,进行范围请求
3xx 重定向——要求请求必须进行更进一步的操作
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL
- 304 not modified,表示服务器允许访问资源
4xx 客户端错误——请求有语法错误或者请求无法实现
- 400 bad request,请求报文存在语法错误
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden,表示对请求资源的访问被服务器拒绝
- 404 not found,表示在服务器上没有找到请求的资源
5xx 服务端错误——服务器未能实现合法请求
- 500 internal sever error,表示服务器端在执行请求时发生了错误
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
什么是持久连接
- 在同一个
TCP
的连接中可传送多个HTTP
请求 & 响应。应用于在请求访问 HTML 页面资源,还要请求图片资源。- 什么是管线化
- 将多个HTTP请求整批发送,在发送过程中不用等待对方响应
- 只有GET和HEAD请求可以进行管线化,而POST则有所限制。
- get 和 post 区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被加入到书签,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
- 大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。
- 密码学基础
- 对称加密:又称私钥加密,即发送方和接收方使用同一个密钥去加密和解密数据。特点是算法公开,加密解密速度快。
- 非对称加密:又称公钥加密。加密使用一对密钥,即公钥和私钥,二者成对出现。用公钥或者私钥中的任何一个进行加密,则用另一个进行解密。优点是安全性较高,缺点是加密和解密耗时长,速度慢,只适合对少量数据进行加密。
- HTTPS传输
- SSL:全称是Secure Sockets Layer,即安全套接层协议。
- TLS:全称是Transport Layer Security ,即安全传输层协议。
- HTTPS为了兼顾安全和效率,采用混合加密机制,同时使用了对称加密和非对称加密。对数据进行对称加密,数据对称加密所需要的私钥通过非对称加密传输。
- 需要用SSL/TLS对数据进行加密和解密,用HTTP对加密后的数据进行传输。
- 涉及到三个密钥:客户端生成的随机密钥,用来进行对称加密。服务器端的公钥和私钥,用来进行非对称加密。
- 一个HTTPS请求实际上包含了两次HTTP传输,大致分为7步
- 1.客户端向服务端发起HTTPS请求,连接到服务器的443端口(客户端发起HTTPS请求,请求公钥)
- 2.服务端返回证书(传送证书)
- 3.客户端验证证书的合法性,如合法,那么客户端会生成一个随机值,这个随机值就是用于对称加密的私钥,称之为客户端密钥。然后利用服务器端的公钥对客户端私钥进行非对称加密,这样客户端密钥就变成密文了。至此,第一次HTTP请求结束(客户端验证证书,生成随机对称密钥,并对对称密钥进行加密)
- 4.客户端会发起HTTPS中的第二次HTTP请求,将加密后的客户端密钥发送给服务器(客户端传送客户端密钥)
- 5.服务器接收到客户端发来的密文,利用自己独有的服务端私钥对密文进行非对称解密,得到客户端私钥。然后利用客户端私钥对数据进行对称加密,这样数据就变成密文(服务器端解密客户端密钥)
- 6.服务器将加密后的密文发送给客户端(服务器端传送加密数据)
- 7.客户端收到服务器发送来的密文,利用客户端私钥对其进行对称解密,得到服务器发送过来的数据。这样,整个HTTPS传输完成(客户端解密加密数据)
- 证书
- 数字证书:原始信息+数字签名
- 数字签名:原始信息(申请人的公钥、个人信息、其他信息等)经过Hash算法处理变为消息摘要,摘要经过CA的私钥加密变为数字签名
- 验证证书(实质上是验证两个摘要是否相同)
- 证书上的原始信息在客户端经过Hash算法处理变为消息摘要
- 数字签名被客户端利用CA的公钥解密,得到CA创建的消息摘要
- 验证两个信息摘要是否相同
概念
- 帧——HTTP 2.0 通信的最小单元,以二进制传输代替原本的明文传输,有一个固定9字节的头部和一个指定长度的负载。sid(Stream Identifier) 31位,用作流控制,标明这一帧属于哪个流。Type 8位 定义了frame的类型。
- 消息:一个完整的帧序列,它映射到逻辑的请求和响应消息
- 流——已建立的TCP连接上的双向字节流,可以承载一个或多个消息
线头堵塞
- 每个TCP连接同时只能处理一个请求—响应,浏览器按FIFO原则处理请求,如果上一个响应没返回,后续请求—响应都会受阻。
- 管线化的问题:第一个响应慢会阻塞后续响应,服务器为了按序返回响应,则需要缓存多个响应,占用更多的资源
优点
- 多路复用
HTTP2采用二进制格式传输,取代了HTTP1.x的文本格式,二进制格式解析更高效。
多路复用代替了HTTP1.x的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完 成。在HTTP1.x中,并发多个请求需要多个TCP连接,浏览器为了控制资源会有6-8个TCP连接都限制。
HTTP2中
- 同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。
单个连接上可以并行交错的请求和响应,之间互不干扰
服务器推送:推送额外的资源,而不需要客户端明确请求每一个资源
头部压缩:HTTP/1.x版本中,元数据始终以纯文本形式发送,如果再使用HTTP cookie,那么头部体积将会变得很重。HTTP/2.0 使用HPACK压缩了头部
二进制分帧层
TCP/IP
TCP的三次握手和四次挥手
- 三次握手
- 客户端——发送带有SYN标志的数据包–一次握手–服务端
- 服务端——发送带有SYN/ACK标志的数据包–二次握手–客户端
- 客户端——发送带有ACK标志的数据包–三次握手–服务端
- 四次挥手
- 客户端——发送一个FIN,用来关闭客户端到服务器的数据传送
- 服务器——收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号
- 服务器——关闭与客户端的连接,发送一个FIN给客户端
- 客户端——发回ACK报文确认,并将确认序号设置为收到序号加1
TCP和UDP的区别
1.连接性:TCP面向连接;UDP是无连接的。(TCP需要三次握手,而UDP不需要握手)
2.可靠性:TCP提供可靠的服务;UDP尽最大努力交付,即不保证可靠交付。(通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP则可能出现丢包,不保证顺序到达)
3.面向对象:TCP面向字节流;UDP是面向报文的。( 面向报文的是指发送方的UDP对应用层交下来的数据报文,不合并不拆分,只是在其上面加上首部后就交给了下面的网络层。)。
【 举个例子:
发送方使用TCP协议先发送 100个字节的包1,再发送10个字节的包2;等待2秒后,接收方只需要接收一次就能能将数据(110字节)接收下来。
发送方使用UDP协议先发送 100个字节的包1,再发送10个字节的包2;等待2秒后,接收方必须要接收两次才能将包1(100字节)和包2(10字节)分别接收。】4.差错拥塞控制:UDP没有差错和拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。(TCP拥塞控制,当另一端出现阻塞时,会降低发送速率)。
5.系统开销:TCP首部开销20字节(具有报文段序号,应答序号,窗口大小等);UDP的首部开销小,只有8个字节(2个字节的源端口,2个字节的目的端口,2个字节的报文长度,2个字节的校验和)。
6.信道:TCP的逻辑通信信道是全双工的可靠信道,即可以流入也可以流出的信道;UDP则是不可靠信道。
7.有序性:TCP是有序的字节流;UDP则是无序的。(这是由于tcp头部存在报文段的序号,而udp没有)
ARP((Address Resolution Protocol 地址解析协议) 用于实现从 IP 地址到 MAC (Media Access Control 媒体访问控制)地址的映射,即询问目标IP对应的MAC地址,MAC地址又称以太网地址或物理地址。
ARP工作原理
- 1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
- 2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
- 3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
- 4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。IP地址指明了是哪个局域网,MAC地址指明了指定局域网下某台设备的地址。
以太网协议解决了局域网的点对点通信,但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。
IP 协议可以连接多个局域网。路由器就是基于 IP 协议。局域网之间要靠路由器连接。
为什么要等待2MSL( Maximum Segment Lifetime 报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间) ?客户端在发送完 ACK 后,会等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那么客户端也可以关闭连接
- 保证TCP协议的全双工连接能够可靠关闭
- 特殊情况,因为IP协议的不可靠性或者是其它网络原因,导致服务器端没有收到客户端最后回复的ACK。那么服务器端就会在超时之后继续发送FIN,如果客户端等待2MSL,则还可以接收到FIN。
- 保证这次连接的重复数据段从网络中消失(确保迟来的数据报能被识别并丢弃)
- 假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达服务器端,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。
TCP流量控制
- 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收,利用滑动窗口机制。
- 滑动窗口分为四个窗口:已发送并被确认,已发送未被确认、可发送、不可发送
TCP拥塞控制
- 包括四部分
- 慢启动
- 发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢开始门限 ssthreth 状态变量。
- 先将拥塞窗口 cwnd 设置为一个最大报文段MSS的数值,MSS开始默认为1
- 在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS (Maximum Segment Size)的数值。 [指数增长] 比如 1 1+1=2 2+2=4 4+4=8
- 慢启动的“慢”并不是指 cwnd 增长速率慢而是说在TCP开始发送报文时,先设置cwnd=1,使发送端开始时只发送一个报文段进行探测。
- 拥塞避免
- 当 cwnd > ssthreth 时,即拥塞窗口大于慢开始门限时,每经过一个往返时间RTT(Round-Trip Time)就使cwnd+1 [ 线性增长 ]
- 当发生网络拥塞时,将出现拥塞时的发送方窗口值减半 ( 乘法减小) 设置为慢开始的新门限值ssthreth ,然后设置 cwnd=1,开始执行慢启动算法
- 快重传
- 发送端只要一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段,不必等待报文段的重传计时器到期
- 快恢复
- 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,将当时的发送窗口减半作为慢开始的新门限值。但是接下去并不执行慢开始算法(即不设置 cwnd=1),而是执行拥塞避免算法( cwnd = ssthresh )