From 181f2da899371e5e044ff497b544517e303275e8 Mon Sep 17 00:00:00 2001 From: kaku Date: Thu, 20 Mar 2025 08:03:42 +0800 Subject: [PATCH] 2025-03-20-01 --- 技术/操作系统/程序.md | 16 +++++++++++++++ 技术/计网/HTTP.md | 45 +++++++++++++++++++++++++++++++++++++++++++ 技术/计网/TCP.md | 45 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 技术/操作系统/程序.md create mode 100644 技术/计网/HTTP.md create mode 100644 技术/计网/TCP.md diff --git a/技术/操作系统/程序.md b/技术/操作系统/程序.md new file mode 100644 index 0000000..4b3e1d8 --- /dev/null +++ b/技术/操作系统/程序.md @@ -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。 + +**常量存储区**:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改。 + +**代码区**:存放函数体的二进制代码。 + diff --git a/技术/计网/HTTP.md b/技术/计网/HTTP.md new file mode 100644 index 0000000..27ad3ee --- /dev/null +++ b/技术/计网/HTTP.md @@ -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错误。 \ No newline at end of file diff --git a/技术/计网/TCP.md b/技术/计网/TCP.md new file mode 100644 index 0000000..8bb8c71 --- /dev/null +++ b/技术/计网/TCP.md @@ -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)并验证双向通信能力,确保数据可靠传输。 + +![三次握手](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) +嬲 \ No newline at end of file