一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
网络协议系列 第1篇--网络分层,TCP/IP五层模型【掘金日新计划】
网络协议系列 第2篇--传输层工作原理【掘金日新计划】
网络协议系列 第3篇--TCP有哪些机制【掘金日新计划】
网络协议系列 第4篇--应用层HTTP发展史【掘金日新计划】
网络协议系列 第5篇--HTTPS原理【掘金日新计划】
网络协议系列 第6篇--网络协议串讲【掘金日新计划】
网络协议系列 第7篇--补充一些底层网络知识【掘金日新计划】
前言:每日革新自我、追求进步。积土而为山,积水而为海。这是系列的最后一篇,本篇将介绍网络协议里面的一些零碎的、但有必要了解的知识点。本系列由7篇文章组成,那也用7个问题来结束本系列吧。
周尛先森
网络协议虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我当年学习它的时候也废了挺大功夫。
网络分层、TCP协议、HTTPS中对称与非对称加密,除了了解“它是什么”,你是否有想过“为什么是它”?我认为理解了后者才真正理解了网络协议。
HTTP 的 keepalive 模式是什么样?
在没有 keepalive 模式下,每个 HTTP 请求都要建立一个 TCP 连接,并且使用一次之后就断开这个 TCP 连接。使用 keepalive 之后,在一次 TCP 连接中可以持续发送多份数据而不会断开连接,可以减少 TCP 连接建立次数,减少 TIME_WAIT 状态连接。然而,长时间的 TCP 连接容易导致系统资源无效占用,因而需要设置正确的 keepalive timeout 时间。当一个 HTTP 产生的 TCP 连接在传送完最后一个响应后,还需要等待 keepalive timeout 秒后,才能关闭这个连接。如果这个期间又有新的请求过来,可以复用 TCP 连接。
HTTPS 协议比较复杂,可以优化吗?
通过 HTTPS 访问的确复杂,至少经历四个阶段:DNS 查询、TCP 连接建立、TLS 连接建立,最后才是* HTTP 发送数据*。我们可以一项一项来优化这个过程。首先如果使用基于 UDP 的 QUIC,可以省略掉 TCP 的三次握手。至于 TLS 的建立,如果按文章中基于 TLS 1.2 的,双方要交换 key,经过两个来回,也即两个 RTT,才能完成握手。在 TLS 1.3 中,握手过程中移除了 ServerKeyExchange 和 ClientKeyExchange,DH 参数可以通过 key_share 进行传输。这样只要一个来回,就可以搞定 RTT 了。对于 QUIC 来讲,也可以这样做。当客户端首次发起 QUIC 连接时,会发送一个 client hello 消息,服务器会回复一个消息,里面包括 server config,类似于 TLS1.3 中的 key_share 交换。当客户端获取到 server config 以后,就可以直接计算出密钥,发送应用数据了。
如果权威 DNS 连不上,怎么办?
一般情况下,DNS 是基于 UDP 协议的。在应用层设置一个超时器,如果 UDP 发出没有回应,则会进行重试。DNS 服务器一般也是高可用的,很少情况下会挂。即便挂了,也会很快切换,重试一般就会成功。对于客户端来讲,为了 DNS 解析能够成功,也会配置多个 DNS 服务器,当一个不成功的时候,可以选择另一个来尝试。
CDN ?
CDN 和电商系统的分布式仓储系统一样,分为中心节点、区域节点、边缘节点,而数据缓存在离用户最近的位置。CDN 最擅长的是缓存静态数据,除此之外还可以缓存流媒体数据,这时候要注意使用防盗链。它也支持动态数据的缓存,一种是边缘计算的生鲜超市模式,另一种是链路优化的冷链运输模式。
VPN 是如何工作的?
VPN 可以将一个机构的多个数据中心通过隧道的方式连接起来,让机构感觉在一个数据中心里面,就像自驾游通过琼州海峡一样;完全基于软件的 IPsec VPN 可以保证私密性、完整性、真实性、简单便宜,但是性能稍微差一些;MPLS-VPN 综合和 IP 转发模式和 ATM 的标签转发模式的优势,性能较好,但是需要从运营商购买。
P2P 是什么?
资源开始并不集中地存储在某些设备上,而是分散地存储在多台设备上。下载一个文件可以使用 HTTP 或 FTP,这两种都是集中下载的方式,而 P2P 则换了一种思路,采取非中心化下载的方式;P2P 也是有两种,一种是依赖于 tracker 的,也即元数据集中,文件数据分散;另一种是基于分布式的哈希算法,元数据和文件数据全部分散。
粘包出现原因?
简单得说,在流传输中出现,UDP不会出现粘包,因为它有消息边界
粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。
为了避免粘包现象,可采取以下几种措施:
(1)对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
(2)对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
(3)由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。分包多发。
以上提到的三种措施,都有其不足之处。
(1)第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。
(2)第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。
(3)第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。
小结
最后,让我们一起加油吧!
都看到这了,不如顺手点个赞再走 ( *ˇωˇ* )