计算机网络
# http 和 https 的基本概念
http
: 是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。
https
:是以安全为目标的 HTTP 通道,即 HTTP 下 加入 SSL 层进行加密。其作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性。
# 对称加密
对称加密算法:就是加密和解密都是用的同一个密钥
# 非对称加密
对称加密算法:公钥加密,私钥解密
# http 和 https 的区别及优缺点
- http 是超文本传输协议,信息是明文传输,HTTPS 协议要比 http 协议安全,https 是具有安全性的 ssl 加密传输协议,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- http 协议的默认端口为 80,https 的默认端口为 443。
- http 的连接很简单,是无状态的。https 握手阶段比较费时,会使页面加载时间延长 50%,增加 10%~20%的耗电。
- https 缓存不如 http 高效,会增加数据开销。
- Https 协议需要 ca 证书,费用较高,功能越强大的证书费用越高。
- SSL 证书需要绑定 IP,不能再同一个 IP 上绑定多个域名,IPV4 资源支持不了这种消耗。
# https 证书的作用
CA 的全称是 Certificate Authority,证书认证机构,你必须让 CA 颁布具有认证过的公钥,才能解决公钥的信任问题。
存在一个数字签名的认证问题。因为私钥是自己的,公钥是谁都可以发布,所以必须发布经过认证的公钥,才能解决公钥的信任问题。
# https 协议的工作原理
客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤:
- 客户端使用 https url 访问服务器,则要求 web 服务器建立 ssl 链接。
- web 服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),传输给客户端。
- 客户端和 web 服务器端开始协商 SSL 链接的安全等级,也就是加密等级。
- 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
- web 服务器通过自己的私钥解密出会话密钥。
- web 服务器通过会话密钥加密与客户端之间的通信。
# TCP和UDP的区别
- TCP是面向链接的,而UDP是面向无连接的。
- TCP仅支持单播传输,UDP 提供了单播,多播,广播的功能。
- TCP的三次握手保证了连接的可靠性; UDP是无连接的、不可靠的一种数据传输协议,首先不可靠性体现在无连接上,通信都不需要建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收。
- UDP的头部开销比TCP的更小,数据传输速率更高,实时性更好。
# CP/IP如何保证数据包传输的有序可靠?
对字节流分段并进行编号然后通过 ACK 回复和超时重发这两个机制来保证。
- (1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区;
- (2)并为每个已发送的数据包启动一个超时定时器;
- (3)如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;
- (4)否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。
- (5)接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。
# TCP三次握手
第一次握手:建立连接时,客户端发送连接请求报文段,这个请求报文段是没有应用层数据的,并进入SYN_SENT状态,等待服务器确认;此时
SYN=1, seq=x(随机)
第二次握手:服务器为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,这个报文段是没有应用层数据的,服务器进入SYN_RECV状态;此时
SYN=1, ACK=1, seq=y(随机),ack=x+1
第三次握手:客户端为该tcp连接分配缓存和变量冰箱服务端返回去人的确认,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。此时
ACK=1,seq=x+1,ack=y+1
SYN: 是一个TCP控制位(同步位),表明是一个连接请求报文,或者是表明是一个接连接收报文。A和B主机要建立连接,就A先发一个报文,其中SYN=1,B收到之后也回复一个SYN=1的报文,代表接受连接 ACK: 是一个TCP控制位(确认位ACK),当ACK=1表示确认号有效,在连接建立之后所有传送的报文段都必须把ACK置为1 seq: 指的是序列号,为连接之后传送数据用的 ack:指的是对收到的报文段的确认,值是等待接收的数据包的序列号
SYN=1,不能携带数据,但要消耗一个序号,所以seq=x+1
# SYN泛洪攻击
发生在TCP三次握手的第一次过程中,攻击者发送SYN,服务器返回ACK后,攻击者就不对其进行确认,TCP接连就处于挂起状态,服务器收不到确认,就会重复发送ACK给攻击者,赵成服务器资源的浪费
# 为什么三次握手而不是两次握手
为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。
# TCP四次握手(连接释放)
# HTTP协议的主要特点
简单快速::每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url即可。
灵活:http协议的头部有一个
数据类型
,通过http协议,就可以完成不同数据类型的传输。无连接: 连接一次,就会断开,不会继续保持连接。
无状态:客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。有的时候,我们访问网站时,网站能记住我们的账号,这个是通过其他的手段(比如 session)做到的,并不是http协议能做到的。
# HTTP报文的组成部分
在回答此问题时,我们要按照顺序回答:
先回答的是,http报文包括:请求报文和响应报文。
再回答的是,每个报文包含什么部分。
最后回答,每个部分的内容是什么
# 请求报文包括
请求行:包括请求方法、请求的url、http协议及版本。
请求头:一大堆的键值对。
空行指的是:当服务器在解析请求头的时候,如果遇到了空行,则表明,后面的内容是请求体。
请求体:数据部分。
# 响应报文包括
状态行:http协议及版本、状态码及状态描述。
响应头
空行
响应体
# HTTP方法
包括:
GET:获取资源
POST:传输资源
put:更新资源
DELETE:删除资源
HEAD:获得报文首部
HTTP方法有很多,但是上面这五个方法,要求在面试时全部说出来,不要漏掉。
get 和 post 比较常见。
put 和 delete 在实际应用中用的很少。况且,业务中,一般不删除服务器端的资源。
head 可能偶尔用的到。
# get 和 post的区别
1、浏览器在回退时,get不会重新请求,但是post会重新请求。【重要】
2、get请求会被浏览器主动缓存,而post不会。【重要】
3、get请求的参数,会报保留在浏览器的历史记录里,而post不会。做业务时要注意。为了防止CSRF攻击,很多公司把get统一改成了post。
4、get请求在url中传递的参数有大小限制,基本是2kb,不同的浏览器略有不同。而post没有注意。
5、get的参数是直接暴露在url上的,相对不安全。而post是放在请求体中的。
# http状态码
http状态码分类:
常见的http状态码:
部分解释:
206的应用:
range
指的是请求的范围,客户端只请求某个大文件里的一部分内容。比如说,如果播放视频地址或音频地址的前面一部分,可以用到206。301:重定向(永久)。
302:重定向(临时)。
304:我这个服务器告诉客户端,你已经有缓存了,不需要从我这里取了。
400和401用的不多。403指的是请求被拒绝。404指的是资源不存在。
# HTTP的连接方式——持久连接和非持久连接
非持久连接
: 在TCP三次握手的第三次握手时发生,将HTTP请求作为第三次握手的数据部分发给服务器,服务器收到请求之后将HTTP相应报文传输给客户。如果再想传输,那么就需要重新建立TCP连接从头开始。
持久连接
:再需要请资源的时候就不需要建立新的TCP连接了
轮询:http1.0中,客户端每隔很短的时间,都会对服务器发出请求,查看是否有新的消息,只要轮询速度足够快,例如1秒,就能给人造成交互是实时进行的印象。这种做法是无奈之举,实际上对服务器、客户端双方都造成了大量的性能浪费。
长连接:HTTP1.1中,通过使用Connection:keep-alive进行长连接,。客户端只请求一次,但是服务器会将继续保持连接,当再次请求时,避免了重新建立连接。
注意,HTTP 1.1默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
- 持久连接的两种方式——非流水线和流水线
- 非流水线就是发一个,确认一个,才能再发下一个
- 流水线就是一个个连着发,然后多个确认
# 进程与线程的区别
# 单点登录
http://blog.alanwu.website/2020/03/03/singleSignOn/ (opens new window)
https://juejin.cn/post/6989020415444123662 (opens new window)
SSO即Single Sign On,是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录。 SSO一般都需要一个独立的认证中心(passport),子系统的登录均得通过passport,子系统本身将不参与登录操作,当一个系统成功登录以后,passport将会颁发一个令牌给各个子系统,子系统可以拿着令牌会获取各自的受保护资源,为了减少频繁认证,各个子系统在被passport授权以后,会建立一个局部会话,在一定时间内可以无需再次向passport发起认证。
# webSocket通信原理
- 客户端会先发送一个HTTP请求,包含一个Upgrade请求头来告诉服务端要升级为WebSocket协议
- 服务器就会返回101状态码并切换为WebSocket协议建立全双工连接,后续信息将会通过这个协议进行传输