高频面试题中的HTTP(四)
HTTP版本的区别
TCP的三次握手
- 客户端发送连接请求报文段
SYN
。 - 服务器收到客户端的连接请求报文段
SYN
后,如果同意建立连接,则会发送一个带有SYN
和ACK
响应报文。 - 客户端收到服务器的响应后,对其进行确认并同意继续连接,服务器收到这个包含
ACK
的确认后,就完成了三次握手,双方可以开始进行数据传输了。
以 boss 投简历为例,第一步,向 hr 打招呼;第二步,hr 收到消息并且有意向,就会回应;第三步,收到 hr 的消息之后去发送简历;
追问
为什么是三次握手?
确保双方都存在,并且能够发送和接收数据,如果只有两次握手,就没有办法确认双方的序列号以及彼此是否都已经准备好接收数据。
为什么不是四次或更多次握手?
在建立连接时并不需要更多的确认步骤。三次握手已经足够完成以下任务:
- 确认双方都准备好建立连接。
- 确认双方的序列号同步。
- 确保双方的通信可靠。
如果第二次握手失败会怎么样?
可能发生以下几种情况:
- 超时:客户端A在规定时间内没有收到服务器端B的
SYN/ACK
报文段,即超过了连接建立的超时时间。这可能是由于网络延迟、丢包或者服务器端未正常响应等问题导致的。 - 拒绝:服务器端B可能选择拒绝连接请求,例如,基于某些安全策略、负载均衡机制或者连接数限制等原因。
- 重传:客户端A可能会尝试重新发送第一次握手的连接请求,以期望能够重新建立连接。
- 超时:客户端A在规定时间内没有收到服务器端B的
TCP四次挥手
客户端向服务器发送连接释放请求(FIN)报文段。客户端希望关闭连接,并停止发送数据。客户端进入
FIN_WAIT_1
状态。服务器收到连接释放请求后,发送确认(ACK)报文段作为响应,确认收到了客户端的关闭请求。服务器进入
CLOSE_WAIT
状态,客户端进入FIN_WAIT_2
状态。服务器完成自己未发送的数据的发送后,发送连接释放请求(FIN)报文段给客户端,表示服务器也希望关闭连接。服务器进入
LAST_ACK
状态。客户端收到服务器的连接释放请求后,发送确认(ACK)报文段作为响应,确认收到了服务器的关闭请求。客户端进入
TIME_WAIT
状态。此时,服务器等待最后一个ACK的确认。在经过一段时间(通常是两倍的报文段最大生存时间,即2MSL)后,客户端关闭连接,结束
TIME_WAIT
状态。最后一个ACK被发送到服务器。
在四次挥手完成后,TCP连接正式关闭,客户端和服务器都进入了CLOSED状态。
需要注意的是,这里的挥手过程中,每个报文段都需要对方进行确认。同时,客户端和服务器都需要维护一些状态来跟踪连接的关闭过程,以保证可靠的连接释放。
TCP使用四次挥手(Four-Way Handshake)来终止连接,而不是两次、三次或更多次,主要是因为在 TCP 连接终止的过程中,双方都需要确保数据能够可靠地完成传输,同时保证双方都能干净地关闭连接。
追问
为什么是四次挥手?
在TCP连接的关闭过程中,每一方都需要通知对方自己已经完成数据的传输,并且准备好关闭连接。由于TCP是全双工的通信协议,即每一方都可以独立发送和接收数据,因此每一方必须独立地关闭自己的发送方向。
- 第一次挥手(主动关闭方发送
FIN
):- 客户端(或主动方)发送一个
FIN
报文段,表示它已经完成数据发送,准备关闭连接。这个报文段是一个结束数据流的请求。 - 客户端进入FIN_WAIT_1状态,等待服务器确认。
- 客户端(或主动方)发送一个
- 第二次挥手(被动关闭方确认
FIN
):- 服务器收到客户端的
FIN
报文段,表示客户端已经完成发送数据。服务器会响应一个ACK
报文段,确认客户端的FIN
。 - 此时,客户端确认自己的发送方向已经关闭(可以进行数据的清理工作),但服务器可能仍然需要继续发送数据,因此客户端进入FIN_WAIT_2状态。
- 服务器收到客户端的
- 第三次挥手(被动关闭方发送
FIN
):- 服务器在完成数据发送后,向客户端发送一个
FIN
报文段,表示服务器也准备关闭连接。此时,服务器进入LAST_ACK状态,等待客户端确认。
- 服务器在完成数据发送后,向客户端发送一个
- 第四次挥手(主动关闭方确认
FIN
):- 客户端收到服务器的
FIN
报文段后,回复一个ACK
报文段,表示客户端确认服务器的关闭请求。此时,客户端进入TIME_WAIT状态,等待足够的时间确保服务器收到了ACK
报文段,然后完全关闭连接。 - 服务器收到客户端的确认后,关闭连接。
- 客户端收到服务器的
- 第一次挥手(主动关闭方发送
为什么不能是两次挥手?
两次挥手会导致数据的丢失或连接未能完全断开。在四次挥手的过程中,每一方都能够确保自己完成了数据的发送,并且完全理解对方的状态。没有充分的确认步骤会导致以下问题:
- 如果只使用两次挥手,可能会导致某一方的数据未完全发送或未完全接收。
- 如果没有明确的关闭过程,另一方可能无法确认数据是否全部传输完成。
为什么不是五次或更多次挥手?
增加挥手次数无法进一步提高协议的效率或可靠性。并不会带来更多的好处,反而可能会增加不必要的延迟和复杂度。四次挥手已经涵盖了必要的确认和关闭操作:
- 每次挥手都有明确的目的。
- 任何额外的挥手都不会提升可靠性或数据完整性,反而会导致不必要的通信开销。
HTTP和HTTPS的区别
安全性:
HTTP
是明文传输协议,数据在传输过程中不经过加密处理,容易被窃听和篡改。HTTPS
则通过使用SSL/TLS
协议对数据进行加密,确保传输过程中的安全性。默认端口:
HTTP
默认使用端口80进行通信。HTTPS
默认使用端口443进行通信。证书要求:
HTTP
不需要使用证书。HTTPS
使用SSL
(Secure Sockets Layer)或TLS
(Transport Layer Security)证书来验证服务器的身份,并建立安全连接。
HTTPS加密过程或执行过程
① 证书验证阶段 浏览器发起HTTPS
请求 服务端返回HTTPS
证书 客户端验证证书是否合法,如果不合法则提示告警
② 数据传输阶段 当证书验证合法后,在本地生成随机数 通过公钥加密随机数,并把加密后的随机数传输到服务端 服务端通过私钥对随机数进行解密 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
HTTPS中的SSL证书做了什么
身份验证: SSL
证书由可信任的数字证书颁发机构(CA)签发,用于验证服务器的身份。证书中包含了服务器的公钥以及与之相关的信息,确保客户端连接到的是预期的服务器而非恶意伪造的服务器。
数据加密: SSL
证书中的公钥用于对数据进行加密,并且只有服务器拥有与该证书关联的私钥才能解密数据。这样,即使在传输过程中数据被截获,也无法被解密读取。
数据完整性: 在SSL
握手过程中,服务器会生成一个消息摘要,并使用私钥对其进行签名。客户端收到数据后可以使用证书中的公钥来验证签名的有效性,确保数据在传输过程中没有被篡改。
安全连接建立: 通过SSL
证书,客户端和服务器可以协商出一种加密算法和密钥,用于在之后的通信过程中进行加密和解密,确保传输的数据保持机密性和完整性。
总结起来,HTTPS
使用SSL
证书实现了数据加密、身份验证和数据完整性保护,从而提供了更高的安全性,适用于需要保护敏感信息(如个人信息、密码等)的网站和应用程序。
前端攻击
XSS攻击
说明:在网页中注入JavaScript代码,从而在受害者的浏览器上执行恶意操作 解决:过滤用户输入输出及浏览器参数,避免将用户输入内容直接作为html输出到页面
CSRF攻击
说明:攻击者可以通过伪造请求,发送恶意请求到受信任的网站,欺骗用户进行非预期的操作 解决:使用验证码来增加人为干预,并校验当前运行环境的域名信息
数据窃取
说明:攻击者通过窃取浏览器的Cookie信息或利用恶意广告注入恶意脚本来窃取网页中的敏感数据 解决:使用https协议,并对传输的敏感参数加密
中间人攻击
说明:攻击者会在通信过程中插入自己作为中间人的位置,使其能够拦截、篡改或窃取通信数据 解决:使用vpn,生物认证
上传文件攻击
说明:文件名攻击,上传的文件采用上传之前的文件名,可能造成:客户端和服务端字符码不兼容,导致文件名乱码问题;文件名包含脚本,从而造成攻击。 解决:对上传文件名转义或者生成新文件名,隐藏文件真实路径,限制文件大小
七层网络模型
- 物理层:负责传输比特流,对应物理介质和网络设备(如网线、集线器)。
- 数据链路层:负责可靠地传输数据帧,对应网桥、交换机等设备。
- 网络层:负责确定数据的路径和地址,对应路由器、防火墙等设备。
- 传输层:负责提供端到端的可靠数据传输,对应传输控制协议(TCP)和用户数据报协议(UDP)等协议。
- 会话层:负责建立、管理和终止会话连接。
- 表示层:负责数据格式转换、数据加密等操作。
- 应用层:提供各种应用服务,例如HTTP、FTP、DNS等。
HTTP、TCP和WebSocket之间的区别
特性 | HTTP | TCP | WebSocket |
---|---|---|---|
协议层级 | 应用层 | 传输层 | 应用层 |
连接方式 | 无状态,短连接,每个请求完成后,连接会被关闭 | 面向连接的协议,长连接 | 长连接,支持全双工通信 |
数据传输方式 | 请求-响应模式,客户端发起请求,服务端响应 | 数据以流的方式传输,不关心数据的格式和内容 | 双向通信,客户端和服务端双方建立连接后都可主动发送数据 |
资源消耗 | 每次请求需要建立和关闭连接,资源消耗较高 | 连接持续存在,资源消耗低 | 连接持续存在,资源消耗低 |
实时性 | 不支持实时通信 | 本身不具备实时性,基于它实现的协议可以实现实时通信 | 支持高效的实时通信 |
使用场景 | Web 浏览器请求网页资源、API等 | 底层协议,用于传输数据 | 低延迟、实时更新的场景,实时聊天、在线游戏、股票行情等 |
协议头 | 协议头较大,包含大量元信息,请求参数、User-Agent等 | 协议头较小 | 协议头较小,额外元数据少 |
可靠性 | 依赖于 TCP 的可靠性,本身并不负责重传数据或处理丢包等问题 | 提供可靠的数据传输,通过三次握手、四次挥手等 | 基于TCP,提供可靠传输 |
状态保持 | 无状态,需要通过 Cookie 或 Session 实现 | 有状态 | 有状态 |