1. HTTP协议
HTTP超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,是互联网应用最广泛的一种网络传输协议。
客户端(浏览器)会向服务器提交HTTP请求,然后服务器向客户端返回响应,其中响应包含有关请求的状态信息,还可能包含请求的内容。
1.1 常见的HTTP请求方法
- GET: 从服务器上获取数据
- POST:向服务器传送数据
- PUT:上传文件,更新数据
- DELETE:删除服务器上的对象
- HEAD:与GET方法相同,但没有响应体,仅传输状态行和标题部分
- OPTIONS:询问支持的请求方法,用来跨域请求
- TRACE: 回显服务器收到的请求,主要⽤于测试或诊断
- CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信
1.2 常见的HTTP状态码
- 2XX 成功
200 OK 请求被正常处理
204 No Content 请求已成功处理,但无资源返回
206 Partial Content 进行范围请求,服务器只对请求的部分资源执行GET方法 - 3××重定向
301 Moved Parmanently 永久重定向 请求的资源已被分配了新的URL
302 Found 临时重定向 请求的资源被临时定位到新的URL
303 See Other 资源存在着另一个 URL,应使用 GET 方法获取资源
304 Not Modified 浏览器缓存相关,发送附带条件请求时,条件不满足时返回,与重定向无关 - 4××客户端错误
400 Bad Request 请求报文语法有误
401 Unauthorized 用户认证失败
403 Forbidden 服务器拒绝请求
404 Not Found 服务器没有找到请求的资源 - 5××服务器错误
500 服务器内部错误
502 错误网关
503 服务器正忙
1.3 GET 和 POST请求的区别
Post 和 Get 是 HTTP 请求的两种方法
- get 是从服务器上获取数据(比如说请求一个网页的资源)
post 是向服务器传送数据(比如注册用户这一类的操作) - get请求的数据会暴露在地址栏中,而post请求则不会
get请求的数据会附在URL后面,post的数据放在HTTP包体 - 安全性问题:post的安全性比get的高
- get请求传输数据量小,post请求传输数据量大
1.4 HTTP请求 / 响应报文是什么样的
请求报⽂由4部分组成
- 请求⾏:请求⽅法字段、URL字段、HTTP协议版本字段, ⽤空格分隔
- 请求头部: 关键字/值对组成,每⾏⼀对, ⽤英⽂冒号:分隔
- 空⾏
- 请求体: post put等请求携带的数据
响应报文由4部分组成
- 响应⾏:由网络协议版本,状态码和状态码的原因短语组成
- 响应头:响应部⾸组成
- 空⾏
- 响应体:服务器响应的数据
1.5 HTTP1.0 和 HTTP1.1 区别 HTTP1.1 和 HTTP2.0 区别
HTTP 1.0和 HTTP 1.1 有以下区别
- 连接方面:http1.0 默认使用非持久连接,每次请求都需要重新建立TCP连接;需要使用keep-alive参数来告知服务器端要建立一个长连接;http1.1 默认使用持久连接,多个http请求复用同一个TCP连接,相较于1.0减少了连接和关闭的延迟,提高了效率。
- 节约带宽:http1.0存在一些浪费带宽的现象,http1.1在请求头引入了range头域,允许只请求资源的某个部分
- HOST域:http 1.1新增了host字段,用来指定服务器的域名
- 缓存处理:HTTP1.1加入了缓存处理(强缓存/协商缓存)新的字段如Cache-Control,支持断点传输
- http1.1相对于http1.0新增了很多请求方法,如 PUT、HEAD、OPTIONS 等
HTTP 1.1 和 HTTP 2.0 的区别
- 二进制协议: HTTP2 采用二进制数据帧传输,取代了 HTTP1.x 的文本格式,二进制格式解析更高效,帧的概念是它实现多路复用的基础
- 多路复用:HTTP2 实现多路复用代替了HTTP1.x的序列和阻塞机制,同一个TCP连接并发处理多个请求,避免了队头阻塞问题。
实现原理:HTTP2引入了一个二进制分帧层,客户端和服务端进行传输时,数据会先经过二进制分帧层处理,转化为一个个带有请求ID的帧,这些帧可以乱序发送,然后再根据每个帧头部的流标识符重新组装 - 头部压缩:HTTP1.1不支持header数据的压缩,HTTP2.0可以对header的数据进行压缩,提高网络传输速度
- 服务器推送:HTTP2.0允许服务器未经请求,主动向客户端发送资源,免得客户端再次发送请求到服务器端获取,降低延迟
1.6 HTTP缓存(强缓存协商缓存)
哪些资源可以被缓存——静态资源(js、css、img)
HTTP缓存策略分为两种:强缓存和协商缓存,根据响应的 header 内容来决定
强缓存:直接从浏览器缓存过的本地读取资源,不会去请求服务器;
Expires 控制缓存过期,已被Cache-Control代替
协商缓存:在使用本地的缓存之前,先向服务器发一个请求,看当前浏览器缓存是否过期,如果没过期:返回304,使用本地资源,如果过期就去请求最新资源
1.7 当在浏览器中输入网址并按下回车发生什么
- 解析URL: 使用的传输协议和请求资源的路径
- DNS域名解析:DNS将域名解析为IP地址
- 浏览器通过IP地址找到服务器,建立TCP连接(三次握手)
- TCP三次握手结束后,开始发送HTTP请求
- 服务器处理请求,并返回HTTP响应报文
- 浏览器拿到响应文本HTML后,解析渲染页面
- 当数据传送完毕后,断开TCP连接(四次挥手)
1.8 HTTP 协议和 HTTPS 区别(必考)
HTTP(超文本传输协议)
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,被用于在 Web 浏览器和网站服务器之间传递信息。因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(超文本传输安全协议)
HTTPS 经由 HTTP 进行通信,利用 SSL/TLS 来加密数据包。HTTPS 提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
区别
- HTTP 明文传输,数据都是未加密的,安全性较差; HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好
- HTTP和HTTPS连接方式完全不同,端口也不同,HTTP协议端口是80,HTTPS协议端口是443
- HTTP 页面响应速度比 HTTPS 快,因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包
- HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以, HTTPS 比 HTTP 要更耗费服务器资源
- HTTPS协议需要CA申请证书,费用较高,而HTTP协议不需要
2. HTTPS协议
2.1 什么是HTTPS协议
HTTP超文本传输协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险;
HTTPS超文本传输安全协议:经由HTTP进行通信,利用SSL/TLS来加密数据包,协议TLS/SSL具有身份验证、信息加密和完整性校验的功能;
HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性;
加密:明文+密钥 -> 密文
解密:密文+密钥 -> 明文
加密方式在整体上分为两大类:对称加密和非对称加密
对称加密:指的是明文在加密和暗文在解密过程中都使用同一个密钥
非对称加密:一般使用两个密钥,一个是称为公钥,另一个叫做私钥。私钥就可以对密文解密也可以对明文进行加密,公钥也一样。一般情况来说客户端可以获得公钥,而服务器一般使用私钥。
2.2 对称加密 / 非对称加密(SSL/TLS)
TLS/SSL的工作原理
TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash、对称加密、非对称加密
TLS/SSL(安全传输层协议) = 散列函数hash + 对称加密 + 非对称加密
- 基于散列函数验证信息的完整性
常见的散列函数有MD5、SHA1、SHA256 - 对称加密算法采用协商的秘钥对数据加密
对称加密的优势就是信息传输使用一对一,需要共享相同的密码 - 非对称加密实现身份认证和秘钥协商
秘钥成对出现,一般称为公钥(公开)和私钥(保密),公钥加密的信息只有私钥可以解开,私钥加密的信息只能公钥解开
非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密的速度慢。
常见的非对称加密算法有RSA、ECC、DH等
2.3 数字证书CA
因为对称加密的效率比非对称加密高很多, 因此只是在开始阶段协商密钥的时候使用非对称加密, 后续的传输仍然使用对称加密。https采用 非对称加密+对称加密
结合的方式 来进行加密
但是如果客户端获取的公钥是黑客伪造的,那么其后续的加密就没有用了。
为了解决这一问题:通常在客户端和服务器建立的时候,服务器给客户端返回一个数字证书,该证书里面就包含公钥,也包含了网站的信息。
这个方法主要是认证中心的可靠性,一般浏览器里会内置一些顶层的认证中心的证书,相当于我们自动信任了他们,只有这样才能保证数据的安全。
总结HTTPS传输过程
- 客户端先从服务器获取到证书,证书中包含公钥,然后将证书进行校验
- 客户端生成一个对称密钥,用证书中的公钥进行加密,发送给服务器
- 服务器得到这个请求后用私钥进行解密,得到该密钥
- 客户端以后发出后续的请求,都使用这个对称密钥进行加密
- 服务器收到这个密文也用这个密钥进行解密
2.4 HTTPS的缺点
(1)除了和TCP连接,发送HTTP请求外,还必须和SSL通信,因此通信慢;
(2)SSL必须进行加密处理,在服务器和客户端都需要进行加密和解密的运算处理,因此耗费更多硬件资源,过程复杂;
(3)申请SSL证书需要费用
3. DNS域名解析的过程
DNS (域名系统)提供的是一种主机名到 IP 地址的转换服务
作用: 将域名解析为IP地址,客户端向DNS服务器发送域名查询请求,DNS服务器告知客户端Web服务器的 IP 地址
- 首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
- 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
- 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
- 本地DNS服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
- 本地DNS服务器向权威域名服务器发送请求,域名服务器返回对应的结果
- 本地DNS服务器将返回结果保存在缓存中,便于下次使用
- 本地DNS服务器将返回结果返回给浏览器
4. 网络模型
4.1 OSI七层模型
- 应用层:HTTP(超文本传输协议),HTTPS,FTP(文件传输协议)、SMTP(简单邮件传输协议)
- 传输层:TCP UDP
- 网络层:IP协议层
4.2 TCP/IP参考模型
- 物理层通过物理手段把电脑连接起来
- 数据链路层则对比特流的数据进行分组
- 网络层来建立主机到主机的通信
- 传输层建立端口到端口的通信
- 应用层最终负责建立连接,数据格式转换,最终呈现给用户
5. TCP与UDP
TCP和UDP是OSI模型中的传输层中的协议
- TCP
TCP是一种面向连接的传输层协议,在传输数据之间必须先建立连接,数据传输结束后要释放链接。TCP提供可靠传输,它的可靠性体现在传输数据之前会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传输完断开连接。
TCP采用大小可变的滑动窗口
进行流量控制,窗口大小的单位是字节,这里说的窗口大小其实就是每次传输的数据大小。
- UDP(用户数据报协议)
UDP是面向无连接的,不需要在发送数据前进行三次握手建立连接,远程主机在收到UDP报文之后,不需要给出任何确认,虽然不可靠,但是高效,可用于即时通信
5.1 TCP与UDP区别
- TCP 面向连接,UDP是 面向无连接(发送数据前不需要建立链接)
- TCP可靠传输(数据顺序和正确性),使用流量控制和拥塞控制;UDP仅提供最基本的数据传输能力,无法保证可靠
- TCP只能是一对一通信,UDP支持一对一、一对多、多对一和多对多的交互通信
- TCP面向字节流,UDP面向报文
- TCP数据传输慢,UDP数据传输快
- TCP适用于要求可靠传输的应用(文件传输、远程登录);UDP适用于实时应用(视频会议、语音直播)
5.2 三次握手
TCP三次握手是客户端和服务器建立连接的方式,目的是为了使二者能够建立连接,便于后续的数据交互传输。
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态
-
第一次握手:客户端发送带有 SYN 标志的
连接请求数据包
给服务端,请求发送后,客户端便进入 SYN-SEND 状态等待服务器确认 -
第二次握手:服务端收到客户端syn包并确认,同时服务端发送带有 SYN+ACK 标志的
连接请求和应答数据包
给客户端,发送完成后服务器进入 SYN-RECEIVED 状态 -
第三次握手:客户端收到服务器的SYN+ACK包,并发送带有 ACK 标志的
应答数据包
给服务端,发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,建立链接成功。 -
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
-
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
-
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常
为什么要三次握手,而不是两次握手/四次握手(重点)
- 阻止历史重复连接(主要原因)
- 同步双方的初始序列号
- 才可以避免重复建立连接
5.3 四次挥手
刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求:
- 第一次挥手: 若客户端认为数据发送完成,则它需要向服务端发送连接释放请求
- 第二次挥手:服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端
- 第三次挥手:服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态
- 第四次挥手: 客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续2MSL时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED状态。当服务端收到确认应答后,也便进入 CLOSED 状态
为什么握手要3次,挥手要4次?
- 因为TCP是双工传输模式,不区分客户端和服务端,连接的建立是双向的过程。三次握手确认双方的接收能力和发送能力都正常,如果只有两次,无法做到双向连接的建立
- 因为TCP的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代表不能再向对方发送数据,连接处于的是半释放的状态。
6. 进程和线程
当我们启动某个程序时,操作系统会给该程序创建一块内存(当程序关闭时,该内存空间就会被回收),用来存放代码、运行中的数据和一个执行任务的主线程,这样的一个运行环境就叫进程。
而线程是依附于进程的,在进程中使用多线程并行处理能提升运算效率,进程将任务分成很多细小的任务,再创建多个线程,在里面并行分别执行
6.1 进程和线程的区别
进程可以看做独立应用,线程不能
- 根本区别:进程是CPU资源分配的最小单位,线程是CPU调度的最小单位。一个程序至少有一个进程,一个进程至少有一个线程。同一进程中的多个线程之间可以并发执行
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源
- 资源开销:进程切换比线程切换的开销要大。线程可以看做轻量级的进程,线程切换开销较小
- 包含关系:线程不能独立于进程而存在,通常一个进程都有若干个线程
- 不同进程间数据很难共享,同一进程下不同线程间数据很易共享
进程之前的通信方式
- 管道通信
- 消息队列通信
- 信号量通信
- 共享内存通信
- 套接字通信
6.2 死锁
死锁:多个进程在执行过程中,由于竞争资源而造成阻塞的现象,若无外力作用,它们都将无法继续执行
产生死锁的原因:竞争不可剥夺资源 、竞争临时资源、进程推进顺序不当
产生死锁的条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件
预防死锁方法:
- 资源一次性分配:一次性分配所有资源,这样就不会再有请求了(破坏请求条件)
- 只要有一个资源得不到分配,其他资源也不给了(破坏请保持条件)
- 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,进程则按照这些号码去请求获取资源(破坏环路等待条件)
7. WebSocket
WebSocket的出现,使得浏览器具备了实时双向通信的能力。
它最大的特点是:服务器可以向客户端主动推送消息,客户端也可以主动向服务器推送消息。
WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。基于TCP传输协议,并复用HTTP的握手通道。
浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。
优点
支持双向通信,更灵活,更高效,可扩展性更好。
更好的二进制支持