文章目录
- 33 | 关于 Linux 网络,你必须知道这些(上)
- 设计高并发架构需要考虑什么?
- 如何理解分布式?
- 如何理解云计算?
- 如何理解微服务?
- TCP/IP网络分层模型是什么?每一层的功能是什么?
- 网络接口层如何实现MAC寻址?
- 网络接口层如何实现错误侦测?
- 应用程序在TCP/IP每一层的封装格式是什么?
- 什么是MTU?
- Linux内核中的网络栈是什么?
- 应用程序通过系统调用和套接字进行交互如何实现?
- Linux网络收发流程是什么?
- 34 | 关于 Linux 网络,你必须知道这些(下)
- 哪些指标可以用来衡量 Linux 的网络性能?
- 35 | 基础篇:C10K 和 C1000K 回顾
- 如何理解epoll?
- 如何理解 epoll 通知应用程序文件描述符状态改变的水平模式?
- 如何理解 epoll 通知应用程序文件描述符状态改变的边缘模式?
- 如何理解异步IO?
- 多路IO复用的两种工作模式是什么?
- 如何理解多队列网卡?
- 如何理解中断负载均衡?
- 如何理解CPU 绑定?
- 如何理解RPS/RFS(软中断负载均衡到多个 CPU 核上)?
- 如何理解将网络包的处理卸载(Offload)到网络设备(如 TSO/GSO、LRO/GRO、VXLAN OFFLOAD)?
- 如何解决C1000K问题?
- 如何用 DPDK 解决C10M问题?
- 如何理解 DPDK 的大页优化?
- 如何用 XDP 解决C10M问题?
- 如何理解IDS(入侵检测系统)?
- 如何理解DDoS 防御?
- 如何理解cilium 容器网络插件?
- 36 | 套路篇:怎么评估系统的网络性能?
- 如何测试网络层的 PPS?
- 如何测试传输层 TCP 和 UDP 的性能?
- 如何测试应用层HTTP的性能?
- 模拟用户的请求负载测试性能的工具wrk
- 模拟用户的请求负载测试性能的工具TCPCopy
- 模拟用户的请求负载测试性能的工具Jmeter
- 模拟用户的请求负载测试性能的工具 LoadRunner
- 37 | 案例篇:DNS 解析时快时慢,我该怎么办?
- 如何理解服务发现?
- 如何理解分布式数据库?
- 如何理解DNS为应用提供了动态服务发现?
- 如何理解DNS为应用提供了全局负载均衡?
- DNS服务器如何进行域名解析?
- DNS解析不稳定,可能是由于什么原因导致的?
- 如何用dnsmasq实现DNS缓存服务?
- 常见DNS优化方法有哪些?
- 38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
33 | 关于 Linux 网络,你必须知道这些(上)
设计高并发架构需要考虑什么?
1.微服务。
- 应用拆分。
- 低耦合,服务独立部署、扩展、发布和维护。
- Docker
- Kubernetes
2.服务缩扩容。
3.服务无状态设计。
- 每次请求独立,不相互依赖。
- 多个相同请求可以发送到任意相同的服务处理。
4.负载均衡。
- Nginx
- HAProxy
5.异步编程。
消息队列:RabbitMQ,Kafka。
6.缓存。
- Redis。
- Memcached。
7.优化服务性能。
提升数据结构和算法性能,提高请求处理速度。
8.优化数据库。
- 读写分离。
- 使用NoSQL。
- 数据库分片。
- 索引优化。
9.API网关。
- 客户端 —API网关 — 服务端。
- 简化客户端逻辑,为客户端提供统一交互接口。
- 屏蔽后端服务的复杂性和细节。
10.CDN。
- 多个地理位置的服务器上缓存,用户访问时选择最近的服务器向用户提供服务。
- 分布式网络框架
11.限流和熔断。
12.监控,运维与自动化。
如何理解分布式?
相对于单体架构,应用程序拆分为多个服务,服务独立部署、扩展、发布和维护。
如何理解云计算?
通过互联网提供计算资源与服务(包括硬件和软件)。
IaaS:基础设施即服务。
- 提供虚拟化计算资源(服务器,存储空间,网络,操作系统等),用户无需购买和维护物理硬件,租用这些资源。
- Amazon EC2 , Google Compute Engine。
PaaS:平台即服务。
- 提供IaaS + 应用程序开发环境、测试、部署和维护所需的软件环境。
- Heroku, Google App Engine。
SaaS:软件即服务。
- 通过互联网提供应用程序作为服务,用户可以直接使用这些应用程序,无需安装或维护任何软件。
- Google Workspace、Microsoft 365。
如何理解微服务?
应用程序拆分为小型独立的服务。
每个服务处理应用程序的特定业务,支持独立开发、部署和扩展。
通过HTTP、REST或消息队列协同实现应用程序功能。
特点:
- 单一职责。
- 独立部署。
- 技术多样化:不同服务可以使用不同的技术栈。
- 易于扩展:根据需要扩展特定服务,而不是整个应用程序。
- 去中心化:每个服务有自己的数据库并独立的组织和管理数据的关系。
优势:
- 故障隔离。
- 灵活性和敏捷性:不同服务独立开发、快速迭代和部署。
- 更好的利用资源:根据需要缩扩容单独服务。
需要解决的问题:
- 高效可靠的服务间通信。
- 数据一致性。
- 分布式系统的复杂性,管理和监控多个独立的服务。
TCP/IP网络分层模型是什么?每一层的功能是什么?
应用层:为用户提供一组应用程序,HTTP,FTP,DNS等。
传输层:应用程序(通过IP + 端口唯一标识)之间的通信,TCP,UDP等。
网络层:物理机(通过IP唯一标识)之间的通信,网络包的封装、寻址和路由。IP,ICMP等。
网络接口层:网络帧在物理链路(网线,网卡,交换机等)上的传输,MAC寻址,错误侦测等。
网络接口层如何实现MAC寻址?
每个网卡有全球唯一的MAC地址,制造时烧录在硬件中,通常固定不变。
数据链路层封装IP网络包为网络帧,包括帧头和帧尾,帧头包含目的MAC地址和源MAC地址。
目的IP地址在本网络,对应MAC地址未知,进行ARP地址解析协议:
- 主机发送ARP请求广播到本地所有设备,询问哪个设备拥有目的IP。
- 网络上的所有设备都会接收这个ARP请求,但只有目标IP地址对应的设备会响应这个ARP请求,告诉主机其MAC地址。
- 发送方接收到ARP响应后,会将MAC地址存入本地的ARP缓存中,以便将来使用。
知道了目的MAC地址,网络接口层就可以在帧中设置这个地址,并通过物理媒介将帧发送出去。如果设备在同一局域网内,帧直接被目标机器接收。如果设备不在同一局域网内,帧将被发送到网关(通常是路由器),由网关负责进一步的传输。
接收端,网络接口层检查传入帧的目的MAC地址是否与接口卡的MAC地址匹配。如果匹配,帧被接受并向上传递给上层(网络层),否则帧被丢弃。
交换机在数据链路层使用MAC地址转发网络帧。
路由器在网络层使用IP地址转发IP网络包。
局域网中使用MAC地址将帧转发到设备。
网络接口层如何实现错误侦测?
应用程序在TCP/IP每一层的封装格式是什么?
什么是MTU?
网络层IP包不需要分片时,能够通过物理介质传输的最大字节数。
IP头 + TCP头 + 应用数据 > MTU,则在网络层进行分片。
举例:
MTU为1500字节,IP数据包为2000字节(20字节IP头 + 20字节TCP头 + 1960应用数据)
- 分片1(共·1500字节):IP头(20字节) + TCP头(20字节) + 应用数据(1460字节)。
- 分片2(共·520字节):IP头(20字节) + 应用数据 (500字节)。
总结:
- 第一个分片:IP头(20字节) + TCP头(20字节) + 应用数据(1460字节)。
- 其他分片:IP头(20字节) + 应用数据。
Linux内核中的网络栈是什么?
应用程序通过系统调用和套接字进行交互如何实现?
Linux网络收发流程是什么?
接收流程:
- 网络帧到达网卡。
- 网卡通过DMA将网络帧放在收包队列。
- 硬中断通知中断处理程序收到网络帧,为网络帧分配内核数据结构sk_buff并拷贝到sk_buff缓冲区。
- 硬中断结束,通知软中断。
- 软中断通知内核收到了新的网络帧,从sk_buff缓冲区取出网络帧,按照网络协议解析,并最终将应用数据拷贝到Socket接收缓存。
- 应用程序使用Socket接口读取数据。
发送流程和接收流程相反。
34 | 关于 Linux 网络,你必须知道这些(下)
哪些指标可以用来衡量 Linux 的网络性能?
带宽:链路的最大传输速率,单位通常为 b/s (比特 / 秒)。
吞吐量:
- 单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。
- 网络使用率 = 吞吐量 / 带宽。
延时:
- 从网络请求发出后,一直到收到远端响应,所需要的时间延迟。
- TCP建立连接所需要的时间。
- 数据包往返所需要的时间。
PPS:
- Packet Per Second(包 / 秒)的缩写,表示以IP网络包为单位的传输速率。
- 用来评估网络转发能力,交换机可以达到理论最大值,Linux服务器容易受包大小影响
并发连接数:TCP连接数。
丢包率:丢包百分比。
重传率:重新传输的网络包比例。
35 | 基础篇:C10K 和 C1000K 回顾
如何理解epoll?
- 多路复用:监控多个文件描述符(socket、pipes、files)以等待可用的非阻塞IO操作。
- 高效:事件通知机制,只关注有 I/O 事件发生的文件描述符,不需要轮询扫描整个集合。
- 用于处理大量并发的socket连接。
- 使用红黑树,在内核中管理文件描述符集合。
如何理解 epoll 通知应用程序文件描述符状态改变的水平模式?
- 应用程序可以随时检查文件描述符的状态,
- 文件描述符可以非阻塞地执行 I/O时,epoll_wait() 返回文件描述符触发通知。
- 应用程序根据文件描述符的状态,进行 I/O 操作。
问题:应用程序处理数据效率不高,会导致epoll_wait()调用频繁。
如何理解 epoll 通知应用程序文件描述符状态改变的边缘模式?
- 事件通知:只有在文件描述符的状态发生改变(从不可写变成可写,或从不可读变成可读),才通过epoll_wait() 发送一次通知。如果文件描述符两次epoll_wait()调用之间状态没有发生变化,epoll_wait()不会再次返回。
- IO操作:应用程序接收到通知后,检查文件描述符状态确定是否可以进行IO操作,应用程序应该尽可能多地读取或写入数据,确保不会错过任何事件,一旦状态变化被通知,除非再次状态变化,否则epoll不会再次通知应用程序。
- 一次性处理:应用程序通常一次性处理所有可用的数据避免数据丢失,epoll不会重复通知同一状态。
如何理解异步IO?
异步 I/O 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。在 I/O 完成后,系统会用事件通知(比如信号或者回调函数)的方式,告诉应用程序。这时,应用程序才会去查询 I/O 操作的结果。
非阻塞。
事件驱动。
并发性。
效率提供。
复杂度增加。
多路IO复用的两种工作模式是什么?
第一种:主进程 + 多个 worker 子进程。
- 主进程执行 bind() + listen() 后,创建多个子进程,管理子进程的生命周期。
- 在每个子进程中负责实际的请求处理,都通过 accept() 或 epoll_wait() ,来处理相同的套接字。
TUPIAN
主线程 + 多个 worker 子线程。
- 主线程负责套接字初始化和子线程状态的管理。
- 子线程则负责实际的请求处理。
- 可以进一步把 epoll_wait() 都放到主线程中,保证每次事件都只唤醒主线程,而子线程只需要负责后续的请求处理。
第二种:监听到相同端口的多进程模型。
- 所有的进程都监听相同的接口,并且开启 SO_REUSEPORT 选项,
- 由内核负责将请求负载均衡到这些监听进程中去。
Nginx的实现:
如何理解多队列网卡?
如何理解中断负载均衡?
如何理解CPU 绑定?
如何理解RPS/RFS(软中断负载均衡到多个 CPU 核上)?
如何理解将网络包的处理卸载(Offload)到网络设备(如 TSO/GSO、LRO/GRO、VXLAN OFFLOAD)?
如何解决C1000K问题?
并发处理100w个客户端连接请求。
- 构建在 epoll 的非阻塞 I/O 模型上。
- 从应用程序到 Linux 内核、再到 CPU、内存和网络等各个层次的深度优化。
- 借助硬件,来卸载那些原来通过软件处理的大量功能。
如何用 DPDK 解决C10M问题?
并发处理1000w个客户端连接请求。
跳过内核协议栈,直接由用户态进程通过轮询的方式,来处理网络接收。
如何理解 DPDK 的大页优化?
如何用 XDP 解决C10M问题?
网络包,在进入内核协议栈之前,就进行处理。
基于 Linux 内核的 eBPF 机制实现的。
如何理解IDS(入侵检测系统)?
如何理解DDoS 防御?
如何理解cilium 容器网络插件?
36 | 套路篇:怎么评估系统的网络性能?
如何测试网络层的 PPS?
Linux 内核自带的高性能网络测试工具 pktgen。
如何测试传输层 TCP 和 UDP 的性能?
iperf 或者 netperf。
如何测试应用层HTTP的性能?
ab、webbench
模拟用户的请求负载测试性能的工具wrk
模拟用户的请求负载测试性能的工具TCPCopy
模拟用户的请求负载测试性能的工具Jmeter
模拟用户的请求负载测试性能的工具 LoadRunner
37 | 案例篇:DNS 解析时快时慢,我该怎么办?
如何理解服务发现?
微服务架构中,应用程序和服务能够自动发现网络中可用的服务实例及地址的过程。
对于构建可扩展、灵活和自愈的系统至关重要。
如何理解分布式数据库?
将数据存储在物理上分散的多个位置和计算机上。
这些计算机可能位于同一地点(如同一数据中心)或分布在世界各地,它们通过网络互联。
1 . 数据分片:将数据分布到多个服务器,每个服务器存储一部分数据。多个服务器并行操作,提高查询性能。
2 . 复制:将数据副本存储在多个服务器上,提高数据的可用性和读取操作的性能。用户可以从最近的服务器或当前不忙的服务器读取数据,有助于数据备份和故障恢复。
3 . 一致性:所有数据在更新后最终保持一致。
强一致性:更新理解在所有副本上反映。
最终一致性:更新会在一段时间后在所有副本上反映。
中间过程反映。
4 . 分区容错(Partition Tolerance)
分布式数据库必须能够处理网络分区,即网络中断导致数据库的不同部分无法通信。理想的分布式数据库系统能够在保持一定程度的服务水平的同时,处理这种分区。
5 . 可扩展性(Scalability)
分布式数据库非常适合水平扩展,即通过添加更多的服务器来增加数据库的容量和性能。这使得它们非常适合处理大规模的数据和高并发的请求。
6 . 数据一致性模型
分布式数据库通常采用不同的一致性模型来平衡一致性、可用性和分区容忍之间的关系,如CAP定理(一致性、可用性、分区容忍性)和BASE(基本可用、软状态、最终一致性)。
如何理解DNS为应用提供了动态服务发现?
- 动态更新:DNS能动态更新记录,保证了应用程序总是能够通过DNS解析找到正确的服务实例。
- 负载均衡:通过DNS轮询(一种简单的负载均衡技术),请求可以在多个服务实例之间分发,从而提高了系统的可用性和扩展性。
- 服务注册和发现机制:在微服务架构中,服务实例在启动时可以向DNS服务器注册自己的域名和IP地址。当服务实例停止或不可用时,可以更新或删除相应的DNS记录。客户端应用程序通过查询DNS来发现可用的服务实例,实现动态服务发现。
- 使用SRV记录: DNS不仅可以解析域名到IP地址,还可以使用SRV记录来提供关于服务的额外信息,如端口号和协议。这让客户端能够发现不仅仅是服务实例的位置,还包括如何与服务实例进行通信的详细信息。
如何理解DNS为应用提供了全局负载均衡?
DNS服务器如何进行域名解析?
最近解析记录缓存命中,直接用缓存中的记录。
最近解析记录未命中,从顶级域名递归解析:
DNS解析不稳定,可能是由于什么原因导致的?
- DNS服务器本身有问题,响应慢且不稳定。
- 客户端到DNS服务器网络延迟比较大。
- DNS请求或响应包,被链路中的网络设备丢失。
如何用dnsmasq实现DNS缓存服务?
常见DNS优化方法有哪些?
- 对 DNS 解析的结果进行缓存。
- 对 DNS 解析的结果进行预取。
- 使用 HTTPDNS 取代常规的 DNS 解析。
- 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。