目录
一、三次握手
二、为什么是三次握手而不是两次握手
三、四次挥手
四、挥手为什么需要四次
五、websocket
1、是什么
2、原理
3、websocket与http的关系
4、特点
六、http结构
七、HTTP头都有哪些字段
八、http1.0和http1.1,还有http2有什么区别
九、https和http有什么区别
十、https的实现原理
十一、indexDB与localStorage的区别
十二、服务端渲染和客户端渲染的区别
十三、JWT(Json Web Token)
十四、tcp 和udp有什么区别
十五、tcp 是如何保证可靠传输的
十六、为什么 TCP 要进行流量控制
十七、TCP 为什么会重传
十八、TCP的四种拥塞控制算法
十九、tcp 的四元组、五元组、七元组
一、三次握手
指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小
信息。
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SENT
状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD
的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
二、为什么是三次握手而不是两次握手
三次握手才能确认双方的接收与发送能力是否正常,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
三、四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次挥手。TCP 连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。
刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:
- 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
- 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
- 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
四、挥手为什么需要四次
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
五、websocket
1、是什么
- WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
- 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
- Websocket是一个持久化的协议
2、原理
- websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
- 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
- websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"
3、websocket与http的关系
相同点:
- 都是基于tcp的,都是可靠性传输协议
- 都是应用层协议
不同点:
- WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的
- WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接
联系:
- WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的
4、特点
- 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
- HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)
六、http结构
请求行 请求头 空行 请求体
- 请求行包括 http版本号,url,请求方式
- 响应行包括版本号,状态码,原因
七、HTTP头都有哪些字段
- 请求头
- cache-control 是否使用缓存
- Connection:keep-alive 与服务器的连接状态
- Host 主机域
- 返回头
- cache-control
- etag 唯一标识,缓存用的
- last-modified最后修改时间
八、http1.0和http1.1,还有http2有什么区别
1、Http0.9只支持 get请求
2、http1.0增加了 POST,HEAD,OPTION,PUT,DELETE 等
- HEAD请求:和get请求差不多,但是没有body,用来检查资源是否有效,不需要消耗更多的带宽去请求这个url
- OPTION请求:预检请求,判断是否支持跨域(CORS)
- PUT一般是用来更改资源,post是增加资源
3、http1.1增加了长连接 keep-alive、增加了 host 域、更节约带宽了、还有缓存中的 max-age(之前是 expire)
- 强缓存在 http1.0用的是Expire, 在1.1中用的是Max-age,为什么换了呢,因为 Expire 记录的是一个时间点,有可能服务端和客户端的时间不一致,后来直接改成了一个时长就完美解决问题了
4、http2.0增加了服务器推送、多路复用、头部压缩、以及更接近二进制了
5、http3.0增加了 QUIC 协议,是基于 udp 来完成建立连接的
九、https和http有什么区别
- http无状态无连接,而且是明文传输,不安全,默认连接80端口
- https 是有不可否认性的,可以保证对方身份的真实性,默认端口是443端口,加密传输,而且会保证数据的完整性
十、https的实现原理
- 首先客户端向服务端发送一个随机值和一个客户端支持的加密算法,并连接到443端口。
- 服务端收到以后,会返回另外一个随机值和一个协商好的加密算法,这个算法是刚才发送的那个算法的子集
- 随后服务端会再次发送一个 CA 证书,这个 CA 证书实际上就是一个公钥,包含了一些信息(比如颁发机构和有效时间等)
- 客户端收到以后会验证这个 CA 证书,比如验证是否过期,是否有效等等,如果验证未通过,会弹窗报错。
- 如果验证成功,会生成一个随机值作为预主密钥,客户端使用刚才两个随机值和这个预主密钥组装成会话密钥;再使用刚才服务端发来的公钥进行加密发送给服务端;这个过程是一个非对称加密(公钥加密,私钥解密)
- 服务端收到以后使用私钥解密,随后得到那两个随机值和预主密钥,随后再组装成会话密钥。
- 客户端在向服务端发起一条信息,这条信息使用会话秘钥加密,用来验证服务端时候能收到加密的信息
- 服务端收到以后使用刚才的会话密钥解密,在返回一个会话密钥加密的信息,双方收到以后 SSL 建立完成;这个过程是对称加密(加密和解密是同一个)
十一、indexDB与localStorage的区别
indexDB类似于数据类似于数据库的概念,异步存储,而且支持事务(提供error
、abort
和complete
三个事件,不会出现失败后只改写了一部分的情况)
十二、服务端渲染和客户端渲染的区别
服务端渲染(SSR Server Site Rendering)
- 有利于 SEO,首屏加载快,但是重复请求次数多,开发效率低,服务器压力大
- 渲染的时候返回的是完整的 html 格式
- 应用场景:可能被搜索到的
客户端渲染(CSR Client Site Rendering)
- 不利于 SEO,首屏加载慢,前后端分离开发,交互速度快、体验好
- 渲染的时候返回的是 json 数据格式,由浏览器完成渲染
- 应用场景:app 内部"嵌套"的 h5页面
十三、JWT(Json Web Token)
在没有 JWT 之前,验证客户端的方式就是通过 token。JWT出现后,可以把 token 保存在客户端。
JWT 相当于把数据转换成 JSON 对象,这个特殊的 JSON 对象分为三部分:头部、负载、签名,他们之间分别用.
区分开
- 头部(header)
- 保存的是JWT 的元数据,表明所使用的 hash 算法,以 JSON 对象的方式存储,然后转换成 Base64URL 的格式
- 负载(payload)
- 也是 JSON 对象格式,用来存放自己的数据
- 签名(Signature)
- 确保消息的完整性
十四、tcp
和udp
有什么区别
连接方面
- tcp面向连接,udp不需要连接
- tcp需要三次握手四次挥手请求连接
可靠性
- tcp是可靠传输;一旦传输过程中丢包的话会进行重传
- udp是不可靠传输,但会最大努力交付
工作效率
- UDP实时性高,比TCP工作效率高
- 因为不需要建立连接,更不需要复杂的握手挥手以及复杂的算法,也没有重传机制
是否支持多对多
- TCP是点对点的
- UDP支持一对一,一对多,多对多
首部大小
- tcp首部占20字节
- udp首部占8字节
十五、tcp 是如何保证可靠传输的
-
校验和
- 数据传输的过程中,每一个数据段都有一个16位的编号,将这些编号加起来并取反得出一个校验和,看收到后是否和之前的一致
-
序列号和确认应答
- 每次发送数据的时候,服务端都会返回一个确认应答以及将要发送的序列号
-
超时重传、滑动窗口、拥塞控制
十六、为什么 TCP 要进行流量控制
为了解决发送方和接收方的速率不一致问题,如果发送方的速率过快的话,接收方处理不过来,只能放在缓存区,缓存区满了,就只能丢包了。所以需要进行流量控制
十七、TCP 为什么会重传
TCP 传输是一应一答的,如果中间丢包了的话,那么就会处于僵持状态,所以在发送发会设置一个定时器,一段时间(这个时间应该略大于一个发送来回的时间)如果没有收到对方ACK
确认的话,就会重新发送数据,这就是超时重传
十八、TCP的四种拥塞控制算法
1.慢开始
2.拥塞控制
3.快重传
4.快恢复
十九、tcp 的四元组、五元组、七元组
-
四元组:
- 源 IP地址,目标 ip 地址,源端口,目标端口
-
五元组:
- 源 IP 地址,目标 IP 地址,协议号,源端口,目标端口
-
七元组:
- 源 IP 地址,目标 IP 地址,协议号,源端口,目标端口,服务类型以及接口索引