http/https
HTTP(超文本传输协议)作为Web通信的核心协议,具有简单,灵活易于扩展,无状态,明文传输,不安全的特点。 简单:基本报文格式是head+body的形式,头部信息也是key-value的简单文本形式,易于理解。 灵活和易于扩展:http工作在第七层应用层,https在http和tcp之间加入了ssl/tls的安全传输层,http把tcp换成了udp HTTP/1.0新机制: 基本请求-响应模型:HTTP/1.0定义了客户端向服务器发送请求并接收响应的基本机制,支持GET、POST和HEAD方法。 头部字段:引入了请求和响应的头部字段(如Content-Type、Content-Length),用于传递元数据。 状态码:定义了状态码(如200 OK、404 Not...
从浏览器输入url并按下回车之后...
浏览器输入URL后发生了什么当在浏览器中输入一个URL(如 https://www.example.com)并按下回车后,浏览器会执行一系列复杂的过程,将用户请求的资源加载并呈现在屏幕上。以下是详细步骤,使用Markdown格式,结合上下文确保清晰且技术准确。 1. 解析URL URL结构:URL(Uniform Resource Locator)由协议(如 https)、域名(如 www.example.com)、端口(默认 HTTPS 为 443)、路径(如 /path)、查询参数(如 ?key=value)等组成。 浏览器行为: 解析输入的URL,检查合法性。 若无协议前缀(如输入 example.com),浏览器可能自动补全为 https://example.com 或尝试搜索。 清理URL(如去除多余空格,规范化编码)。 示例:输入 example.com → 解析为 https://example.com/。 2. 检查缓存 浏览器缓存: 浏览器检查本地缓存(内存缓存、磁盘缓存)是否有请求资源的有效副本。 缓存策略(如...
TCP和UDP
期末月叠加面试真是嘎嘎上压力,周二快手一面,呜呜呜,我要当手孝子。 我们一般说网络有七层,是指OSI模型,从下到上依次为: 物理层 (Physical Layer) 数据链路层 (Data Link Layer) 网络层 (Network Layer) 传输层 (Transport Layer) 会话层 (Session Layer) 表示层 (Presentation Layer) 应用层 (Application...
几种排序
常见排序算法的时间复杂度和空间复杂度以下是常见排序算法的时间复杂度和空间复杂度的总结,列出了最佳、平均和最坏情况下的时间复杂度,以及空间复杂度。所有复杂度以大 O 表示法表示。 排序算法 最佳时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 ( O(n) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 是 选择排序 ( O(n^2) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 否 插入排序 ( O(n) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 是 希尔排序 ( O(n \log n) ) 取决于步长序列(如 ( O(n^{1.3}) )) ( O(n^2) ) ( O(1) ) 否 归并排序 ( O(n \log n) ) ( O(n \log n) ) ( O(n \log n) ) ( O(n) ) 是 快速排序 ( O(n \log n) ) ( O(n \log n) ) ( O(n^2) ) ( O(\log n)...
死锁
死锁:定义、必要条件及避免方法蚂蚁一面没过QAQ,不知道是存储岗对学历要求比较高还是怎么样,唉,反正确实项目这一块回答的确实不好,等下周的腾讯和快手吧 1. 死锁的定义死锁(Deadlock)是指多个进程或线程因互相等待对方持有的资源而无法继续执行,导致所有相关进程/线程永久阻塞的状态。 类比:类似多个线程在访问跳表或B+树时,各自持有部分节点锁并等待对方释放,形成循环等待。 2. 死锁产生的四个必要条件死锁发生需要以下四个条件同时满足(缺一不可): 互斥条件(Mutual Exclusion): 资源(如锁、文件)一次只能被一个进程/线程独占。 示例:互斥锁(Mutex,上下文回答)保护跳表节点,同一时间仅一个线程可操作。 类比:B+树节点加锁,禁止并发修改。 持有并等待条件(Hold and...
select,poll,epoll
1. 阻塞与非阻塞 (Blocking vs Non-Blocking) **阻塞 (Blocking)**: 操作在完成之前会暂停调用者的执行。例如,在阻塞I/O中,调用read()或write()时,线程会等待直到操作完成或超时。 特点:简单但效率较低,适合单线程或低并发场景。 示例:阻塞socket的recv()调用会等待数据到达。 **非阻塞 (Non-Blocking)**: 操作立即返回,无论是否完成。如果数据或资源不可用,通常返回错误码(如EAGAIN)或部分结果。 特点:适合高并发场景,但需要开发者处理未完成的情况。 示例:非阻塞socket的recv()会立即返回,若无数据则返回错误码。 2. 异步与同步 (Asynchronous vs Synchronous) **同步...
c++17/20新特性
C++17 和 C++20 新特性 C++17 新特性C++17(2017 年发布)引入了许多实用功能,改进语言的表达力和标准库的可用性。 语言特性 结构化绑定(Structured Bindings) 允许解构 tuple、pair 或结构体到多个变量。 示例:12std::pair<int, std::string> p{1, "hello"};auto [id, value] = p; // id=1, value="hello" 用途:简化多返回值处理。 if 和 switch 初始化语句 在 if/switch 中初始化变量,限制作用域。 示例:123if (auto it = map.find(key); it != map.end()) { return it->second;} 用途:代码更紧凑,减少作用域污染。 内联变量(Inline Variables) 允许在头文件中定义内联静态变量。 示例:1inline static int...
缓存穿透
什么是缓存穿透?缓存穿透是指攻击者或异常请求频繁查询缓存和后端数据库中都不存在的数据,导致每次请求都直接穿透缓存,命中数据库,增加数据库压力,可能导致系统性能下降甚至崩溃。 产生原因 恶意攻击:攻击者故意请求不存在的 key(如随机生成的 ID)。 业务逻辑问题:用户查询的数据在系统中不存在(如查询无效商品 ID)。 缓存失效:热点数据未及时缓存,导致请求直接访问数据库。 影响 数据库负载激增,响应变慢。 系统吞吐量下降,可能引发雪崩效应。 如何解决缓存穿透?以下是常见的解决方案,结合实际场景选择使用: 缓存空对象 方法:当查询的数据在数据库中不存在时,在缓存中存储一个空对象(如 null 或空字符串),并设置较短的过期时间。 优点:简单有效,减少对数据库的直接访问。 缺点:可能占用缓存空间,需设置合理过期时间。 示例(伪代码):12345678value = cache.get(key)if value is None: value = db.query(key) if value is None: cache.set(key,...
内存泄漏
内存泄漏是什么?内存泄漏(Memory Leak)是指程序在分配内存后,由于某些原因未能正确释放,导致这部分内存无法被再次使用,直到程序结束或操作系统回收。内存泄漏会逐渐消耗系统资源,可能导致程序性能下降甚至崩溃。 如何避免内存泄漏?以下是一些常见的避免内存泄漏的方法: 使用 RAII(资源获取即初始化): RAII 是 C++ 中一种重要的资源管理技术,通过将资源(如动态分配的内存)绑定到对象的生命周期,确保资源在对象销毁时自动释放。 使用智能指针(如 std::unique_ptr、std::shared_ptr)管理动态内存,避免手动调用 delete。12345#include <memory>void safe_function() { std::unique_ptr<int> ptr = std::make_unique<int>(10); // 自动释放 // 无需手动 delete,ptr 离开作用域时自动销毁} 规范内存管理: 确保每个 new 都有对应的 delete,每个...
红黑树
红黑树介绍红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,在插入和删除操作时通过特定的规则保持树的平衡,从而保证高效的查找、插入和删除操作。其时间复杂度通常为 ( O(\log n) ),适用于需要频繁动态更新的场景。 红黑树的性质红黑树在普通二叉搜索树(BST)的基础上增加了颜色属性(红或黑),并通过以下五条性质保持平衡: 节点颜色:每个节点要么是红色,要么是黑色。 根节点:根节点始终是黑色。 红色节点约束:红色节点的子节点必须是黑色(即红色节点不能连续)。 黑色路径等价:从根节点到每个叶子节点(或 NULL 节点)的路径上,黑色节点数量相同(称为黑色高度)。 叶子节点:所有叶子节点(通常是 NULL 节点)视为黑色。 这些性质确保红黑树的高度不会超过 ( 2 \log (n+1) ),从而保证高效的操作。 红黑树的操作 查找: 与普通二叉搜索树相同,根据键值比较沿树向下搜索,时间复杂度为 ( O(\log n)...




