HTTP之常见问答

1:HTTP/1.1 如何优化?

:尽量避免发送 HTTP 请求;通过缓存技术,使用请求的 Etag 参数来处理判断缓存过期等问题,类似304状态码就是告诉客户端,缓存有效还能继续使用

:在需要发送 HTTP 请求时,考虑如何减少请求次数;减少重定向请求次数(使用代理服务器,如nginx)、合并请求、延迟发送请求按需访问资源

:减少服务器的 HTTP 响应的数据大小(无损压缩、有损压缩);
2:HTTPS RSA算法 握手解析 (使用 RSA 密钥协商算法的最大问题是不支持前向保密)HTTPS ECDHE算法支持前向保密

而且可以在第三次握手之后,就发送加密应用数据,节省了 1 RTT
3:HTTPS 如何优化? 分析性能损耗

硬件优化 选择支持 AES-NI 特性的 CPU 这个特性可以在硬件级别优化 AES 对称加密算法,加快应用数据的加解密

软件优化 把软件升级成较新的版本,比如将 Linux 内核 2.X 升级成 4.X,将 openssl 1.0.1 升级到 1.1.1,因为新版本的软件不仅会提供新的特性,而且还会修复老版本的问题

会话复用 Session ID 和 Session Ticket,再次重连 HTTPS 时,只需要 1 RTT 就可以恢复会话,TLS1.3 使用 Pre-shared Key 会话重用技术,只需要 0 RTT 就可以恢复会话

这些会话重用技术虽然好用,但是存在一定的安全风险,它们不仅不具备前向安全,而且有重放攻击的风险,所以应当对会话密钥设定一个合理的过期时间

协议优化 密钥交换算法应该选择 ECDHE 算法、 将 TLS1.2 升级 TLS1.3,因为 TLS1.3 的握手过程只需要 1 RTT,而且安全性更强

证书优化 选用 ECDSA 证书,而非 RSA 证书,因为在相同安全级别下,ECC 的密钥长度比 RSA 短很多,这样可以提高证书传输的效率
4:既然有 HTTP 协议,为什么还要有 RPC?

总结

:纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。

:RPC 本质上不算是协议,而是一种调用方式,而像 gRPC 和 Thrift 这样的具体实现,才是协议,它们是实现了 RPC 调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时 RPC 有很多种实现方式,不一定非得基于 TCP 协议。

:从发展历史来说,HTTP 主要用于 B/S 架构,而 RPC 更多用于 C/S 架构。但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC 协议进行通讯。

:RPC 其实比 HTTP 出现的要早,且比目前主流的 HTTP/1.1 性能要更好,所以大部分公司内部都还在使用 RPC。

:HTTP/2.0 在 HTTP/1.1 的基础上做了优化,性能可能比很多 RPC 协议都要好,但由于是这几年才出来的,所以也不太可能取代掉 RPC。
5:既然有 HTTP 协议,为什么还要有 WebSocket?

总结

:TCP 协议本身是全双工的,但我们最常用的 HTTP/1.1,虽然是基于 TCP 的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的 WebSocket 协议。

:在 HTTP/1.1 里,只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。

:对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用 WebSocket 协议。

:WebSocket 和 socket 几乎没有任何关系,只是叫法相似。

:正因为各个浏览器都支持 HTTP协 议,所以 WebSocket 会先利用HTTP协议加上一些特殊的 header 头进行握手升级操作,升级成功后就跟 HTTP 没有任何关系了,之后就用 WebSocket 的数据格式进行收发数据。
6:网络粘包的"问题"

网络粘包问题是指在数据传输过程中,发送方将多个数据包连续发送到接收方,接收方在接收到数据时,可能会将多个数据包合并在一起接收,导致数据的解析出现错误。这种问题通常发生在TCP传输协议中,因为TCP是面向连接的协议,发送方和接收方之间会维护一个数据传输的连接。

造成网络粘包问题的原因有多种,其中包括网络延迟、数据发送速率过快、接收方处理数据的速度跟不上等。在数据发送方发送连续的数据包时,由于网络延迟或其他原因,接收方可能无法及时接收到所有数据包,从而导致数据包的累积。当接收方接收到数据时,会将多个数据包合并在一起进行处理,这就造成了网络粘包问题。

网络粘包问题会影响数据的解析和处理,可能导致接收方无法正确理解发送方发送的数据。为了解决网络粘包问题,可以使用一些方法,比如在数据包中添加消息长度信息,接收方根据长度信息对数据包进行解析;或者使用特定的分隔符来分割数据包,接收方根据分隔符来拆分数据包。

总之,网络粘包问题是在数据传输过程中可能出现的一种问题,会影响数据传输的正确性和可靠性。需要通过合适的方法和技术来解决这个问题。

相关推荐
小林熬夜学编程12 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Hacker_Fuchen14 分钟前
天融信网络架构安全实践
网络·安全·架构
上海运维Q先生17 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
ProtonBase27 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
fantasy_arch10 小时前
CPU性能优化-磁盘空间和解析时间
网络·性能优化
njnu@liyong11 小时前
图解HTTP-HTTP报文
网络协议·计算机网络·http
ZachOn1y12 小时前
计算机网络:应用层 —— 应用层概述
计算机网络·http·https·应用层·dns
是Dream呀12 小时前
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
网络·python·神经网络
kaixin_learn_qt_ing13 小时前
了解RPC
网络·网络协议·rpc
安全小王子13 小时前
Kali操作系统简单介绍
网络·web安全