2025-03-20-01

This commit is contained in:
kaku 2025-03-20 08:03:42 +08:00
parent 718ebd1d54
commit 181f2da899
3 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,16 @@
## 说一下程序的内存分区?
内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示
![1742371178414.jpg](https://img.picui.cn/free/2025/03/19/67da796af3c36.jpg)
**栈**:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
**堆**:就是那些由 `new`分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个`new`就要对应一个 `delete`。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
**自由存储区**如果说堆是操作系统维护的一块内存那么自由存储区就是C++中通过new和delete动态分配和释放对象的抽象概念。需要注意的是自由存储区和堆比较像但不等价。
**全局/静态存储区**全局变量和静态变量被分配到同一块内存中在以前的C语言中全局变量和静态变量又分为初始化的和未初始化的在C++里面没有这个区分了它们共同占用同一块内存区在该区定义的变量若没有初始化则会被自动初始化例如int型变量自动初始为0。
**常量存储区**:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改。
**代码区**:存放函数体的二进制代码。

45
技术/计网/HTTP.md Normal file
View File

@ -0,0 +1,45 @@
## HTTP常用的状态码有哪些
### **1. 信息性状态码1xx**
表示请求已被接收,继续处理。
- **100 Continue**:客户端应继续发送请求,后续请求将被处理。
### **2. 成功状态码2xx**
表示请求已成功被服务器接收、理解并接受。
- **200 OK**:请求成功,返回了请求的数据。
- **201 Created**:请求成功并且服务器创建了新的资源。
- **204 No Content**:请求成功,但响应中没有内容。
### **3. 重定向状态码3xx**
表示需要进一步操作以完成请求。
- **301 Moved Permanently**:请求的资源已永久移动到新位置。
- **302 Found**:请求的资源临时移动到新位置。
- **304 Not Modified**:资源未修改,可使用缓存版本。
### **4. 客户端错误状态码4xx**
表示客户端请求有误或无法完成。
- **400 Bad Request**:请求无效,服务器无法理解。
- **401 Unauthorized**:请求需要身份验证。
- **403 Forbidden**:服务器拒绝请求,即使身份验证通过也可能无权限访问。
- **404 Not Found**:请求的资源不存在。
- **405 Method Not Allowed**请求方法如GET、POST等不被允许。
### **5. 服务端错误状态码5xx**
表示服务器在处理请求时发生错误。
- **500 Internal Server Error**:服务器内部错误,无法完成请求。
- **502 Bad Gateway**:服务器作为网关或代理时,从上游服务器收到无效响应。
- **503 Service Unavailable**:服务器暂时无法处理请求(可能是过载或维护)。
- **504 Gateway Timeout**:服务器作为网关或代理时,未能及时从上游服务器获得响应。
![HTTP状态码](https://cdn.xiaolincoding.com//picgo/1716787749083-7ae2de46-8e84-492e-8ba4-a1521e533e08.webp)
## HTTP返回状态301 302分别是什么
3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向说明请求的资源已经不存在了需改用新的 URL 再次访问。
- 「302 Found」表示临时重定向说明请求的资源还在但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location指明后续要跳转的 URL浏览器会自动重定向新的 URL。
## http 502和 504 的区别?
- 502 Bad Gateway作为网关或者代理工作的服务器尝试执行请求时从上游服务器接收到无效的响应。
- 504 Gateway Time-out作为网关或者代理工作的服务器尝试执行请求时未能及时从上游服务器收到响应。
举一个例子,假设 nginx 是代理服务器收到客户端的请求后将请求转发到后端服务器tomcat 等)。
当nginx收到了无效的响应时就返回502。
当nginx超过自己配置的超时时间还没有收到请求时就返回504错误。

45
技术/计网/TCP.md Normal file
View File

@ -0,0 +1,45 @@
## 三次握手的具体流程
TCP三次握手的流程如下
1. **第一次握手**
客户端发送SYN同步序列号报文SYN=1seq=x到服务器请求建立连接并进入`SYN_SENT`状态。
2. **第二次握手**
服务器收到SYN报文后回复SYN+ACK报文SYN=1ACK=1seq=yack=x+1确认客户端的请求并进入`SYN_RCVD`状态。
3. **第三次握手**
客户端收到SYN+ACK后发送ACK报文ACK=1seq=x+1ack=y+1给服务器双方进入`ESTABLISHED`状态,连接建立完成。
**核心作用**通过三次交互双方同步初始序列号ISN并验证双向通信能力确保数据可靠传输。
![三次握手](https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4/%E7%BD%91%E7%BB%9C/TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.drawio.png)
## TCP为什么要三次握手 两次不行吗 四次不行吗
TCP 三次握手的设计是为了在可靠性和效率之间取得平衡。以下详细解释为什么两次握手不行,四次握手也没必要:
### 1. **为什么两次握手不行?**
两次握手无法确保双方的通信能力都被验证,可能导致历史连接或无效连接的问题:
- **无法防止历史连接的建立**:如果只有两次握手,客户端发送 SYN 请求后,服务器直接返回 ACK 确认并进入连接状态。但如果这个 SYN 是一个延迟的历史请求,客户端可能已经不再需要这个连接,导致服务器浪费资源。
- **无法可靠同步双方序列号**TCP 需要通过握手过程同步双方的初始序列号ISN。两次握手只能保证一方的序列号被确认而另一方的序列号可能未被正确接收和确认这会影响数据传输的可靠性。
### 2. **为什么四次握手没必要?**
四次握手虽然也能完成连接建立,但它是冗余的:
- 在 TCP 握手过程中,服务器收到客户端的 SYN 请求后,会同时发送自己的 SYN 和对客户端 SYN 的 ACK 确认。这两个动作可以合并为一次操作SYN+ACK从而将四次握手优化为三次握手。
- 四次握手增加了不必要的网络开销,降低了连接建立的效率。
### 3. **三次握手的优点**
三次握手是理论上最少且最高效的连接建立方式,能够满足以下需求:
- **双向通信能力验证**:通过三次握手,客户端和服务端都能确认对方的发送和接收能力正常。
- **序列号同步**三次握手确保双方的初始序列号ISN都被正确接收和确认从而支持后续可靠的数据传输。
- **避免无效连接**:第三次握手(客户端发送 ACK可以确保客户端也认可了连接的建立避免了因历史请求或网络异常导致的无效连接。
### 总结
- **两次握手不可靠**:无法验证双方的通信能力和同步序列号,可能导致资源浪费和数据传输问题。
- **四次握手不高效**:可以通过优化将 SYN 和 ACK 合并,减少一次交互。
- **三次握手最佳**:既能保证可靠性,又能提高效率,是最优的设计选择。
# 嫑biao