2025-03-20-01
This commit is contained in:
parent
718ebd1d54
commit
181f2da899
16
技术/操作系统/程序.md
Normal file
16
技术/操作系统/程序.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
## 说一下程序的内存分区?
|
||||||
|
内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示
|
||||||
|

|
||||||
|
|
||||||
|
**栈**:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
|
||||||
|
|
||||||
|
**堆**:就是那些由 `new`分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个`new`就要对应一个 `delete`。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
|
||||||
|
|
||||||
|
**自由存储区**:如果说堆是操作系统维护的一块内存,那么自由存储区就是C++中通过new和delete动态分配和释放对象的抽象概念。需要注意的是,自由存储区和堆比较像,但不等价。
|
||||||
|
|
||||||
|
**全局/静态存储区**:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量和静态变量又分为初始化的和未初始化的,在C++里面没有这个区分了,它们共同占用同一块内存区,在该区定义的变量若没有初始化,则会被自动初始化,例如int型变量自动初始为0。
|
||||||
|
|
||||||
|
**常量存储区**:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改。
|
||||||
|
|
||||||
|
**代码区**:存放函数体的二进制代码。
|
||||||
|
|
45
技术/计网/HTTP.md
Normal file
45
技术/计网/HTTP.md
Normal 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返回状态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
45
技术/计网/TCP.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
## 三次握手的具体流程
|
||||||
|
|
||||||
|
|
||||||
|
TCP三次握手的流程如下:
|
||||||
|
|
||||||
|
1. **第一次握手**
|
||||||
|
客户端发送SYN(同步序列号)报文(SYN=1,seq=x)到服务器,请求建立连接,并进入`SYN_SENT`状态。
|
||||||
|
|
||||||
|
2. **第二次握手**
|
||||||
|
服务器收到SYN报文后,回复SYN+ACK报文(SYN=1,ACK=1,seq=y,ack=x+1),确认客户端的请求,并进入`SYN_RCVD`状态。
|
||||||
|
|
||||||
|
3. **第三次握手**
|
||||||
|
客户端收到SYN+ACK后,发送ACK报文(ACK=1,seq=x+1,ack=y+1)给服务器,双方进入`ESTABLISHED`状态,连接建立完成。
|
||||||
|
|
||||||
|
**核心作用**:通过三次交互,双方同步初始序列号(ISN)并验证双向通信能力,确保数据可靠传输。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## TCP为什么要三次握手 两次不行吗 四次不行吗
|
||||||
|
TCP 三次握手的设计是为了在可靠性和效率之间取得平衡。以下详细解释为什么两次握手不行,四次握手也没必要:
|
||||||
|
|
||||||
|
### 1. **为什么两次握手不行?**
|
||||||
|
两次握手无法确保双方的通信能力都被验证,可能导致历史连接或无效连接的问题:
|
||||||
|
- **无法防止历史连接的建立**:如果只有两次握手,客户端发送 SYN 请求后,服务器直接返回 ACK 确认并进入连接状态。但如果这个 SYN 是一个延迟的历史请求,客户端可能已经不再需要这个连接,导致服务器浪费资源。
|
||||||
|
- **无法可靠同步双方序列号**:TCP 需要通过握手过程同步双方的初始序列号(ISN)。两次握手只能保证一方的序列号被确认,而另一方的序列号可能未被正确接收和确认,这会影响数据传输的可靠性。
|
||||||
|
|
||||||
|
### 2. **为什么四次握手没必要?**
|
||||||
|
四次握手虽然也能完成连接建立,但它是冗余的:
|
||||||
|
- 在 TCP 握手过程中,服务器收到客户端的 SYN 请求后,会同时发送自己的 SYN 和对客户端 SYN 的 ACK 确认。这两个动作可以合并为一次操作(SYN+ACK),从而将四次握手优化为三次握手。
|
||||||
|
- 四次握手增加了不必要的网络开销,降低了连接建立的效率。
|
||||||
|
|
||||||
|
### 3. **三次握手的优点**
|
||||||
|
三次握手是理论上最少且最高效的连接建立方式,能够满足以下需求:
|
||||||
|
- **双向通信能力验证**:通过三次握手,客户端和服务端都能确认对方的发送和接收能力正常。
|
||||||
|
- **序列号同步**:三次握手确保双方的初始序列号(ISN)都被正确接收和确认,从而支持后续可靠的数据传输。
|
||||||
|
- **避免无效连接**:第三次握手(客户端发送 ACK)可以确保客户端也认可了连接的建立,避免了因历史请求或网络异常导致的无效连接。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
- **两次握手不可靠**:无法验证双方的通信能力和同步序列号,可能导致资源浪费和数据传输问题。
|
||||||
|
- **四次握手不高效**:可以通过优化将 SYN 和 ACK 合并,减少一次交互。
|
||||||
|
- **三次握手最佳**:既能保证可靠性,又能提高效率,是最优的设计选择。
|
||||||
|
|
||||||
|
# 嫑(biao)
|
||||||
|
嬲
|
Loading…
x
Reference in New Issue
Block a user