当前位置: 首页 > news >正文

【Linux网络】应用层协议HTTP

  🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12891150.html

9efbcbc3d25747719da38c01b3fa9b4f.gif

目录

HTTP 协议

认识 URL

urlencode 和 urldecode

HTTP 协议请求与响应格式 

HTTP 常见 Header

 关于 connection 报头

 HTTP 的状态码

 HTTP 的方法

HTTP 常见方法

部分http代码


前言

    💬 hello! 各位铁子们大家好哇。

             今日更新了Linux网络http的内容
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

HTTP 协议

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。

在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。

HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

认识 URL

平时我们俗称的 "网址" 其实就是说的 URL

 

域名会被我们客户端的应用自动转换成ip地址,叫做地址转化,也称DNS。

上面的url中,没有端口号,这里的端口号默认被忽略了,他们会默认绑定某个知名端口,所以显示上会被忽略。当浏览器发起请求时,会自动拼接端口号。

域名后面是路径,可以表示文件的唯一性。

域名表示唯一一台主机,路径表示主机上唯一的文件资源,二者结合就可以表示互联网中唯一的一个文件资源!

所以,URL也称为统一资源定位符。        

urlencode 和 urldecode

像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

转义的规则如下:

将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足4 位直接处理),每2位做一位,前面加上%,编码成%XY 格式 

这种对特殊字符进行编码处理的操作叫做urlencode。

urldecode 就是 urlencode 的逆过程;

HTTP 协议请求与响应格式 

Http请求

  • 首行: [方法] + [url] + [版本]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度; 

HTTP 响应

  •  首行: [版本号] + [状态码] + [状态码解释]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.

HTTP 常见 Header

  • Content-Type: 数据类型(text/html 等)
  • Content-Length: Body 的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能 

 关于 connection 报头

HTTP 中的 Connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态

核心作用:

  • 管理持久连接:Connection 字段还用于管理持久连接(也称为长连接)。持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接,以便在同一个连接上发送多个请求和接收多个响应。

持久连接(长连接):

  • HTTP/1.1:在 HTTP/1.1 协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复用同一个连接。
  • HTTP/1.0:在 HTTP/1.0 协议中,默认连接是非持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显式设置 Connection: keep-alive

语法格式:

  • Connection: keep-alive:表示希望保持连接以复用 TCP 连接。
  • Connection: close:表示请求/响应完成后,应该关闭TCP 连接 

 HTTP 的状态码

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)

以下是仅包含重定向相关状态码的表格:

 HTTP 状态码 301(永久重定向)和 302(临时重定向)都依赖Location 选项。以下是关于两者依赖 Location 选项的详细说明:

HTTP 状态码 301(永久重定向):

  • 当服务器返回 HTTP 301 状态码时,表示请求的资源已经被永久移动到新的位置。
  • 在这种情况下,服务器会在响应中添加一个 Location 头部,用于指定资源的新位置。这个 Location 头部包含了新的 URL 地址,浏览器会自动重定向到该地址

例如,在 HTTP 响应中,可能会看到类似于以下的头部信息:

HTTP/1.1 301 Moved Permanently\r\n

Location: https://www.new-url.com\r\n

HTTP 状态码 302(临时重定向):

  • 当服务器返回 HTTP 302 状态码时,表示请求的资源临时被移动到新的位置。
  • 同样地,服务器也会在响应中添加一个 Location 头部来指定资源的新位置。浏览器会暂时使用新的 URL 进行后续的请求,但不会缓存这个重定向。

总结:无论是 HTTP 301 还是 HTTP 302 重定向,都需要依赖Location 选项来指定资源的新位置。这个 Location 选项是一个标准的 HTTP 响应头部,用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。

 HTTP 的方法

其中最常用的就是 GET 方法和 POST 方法

HTTP 常见方法

GET 方法

  • 用途:用于请求 URL 指定的资源。
  • 示例:GET /index.html HTTP/1.1
  • 特性:指定资源经服务器端解析后返回响应内容 

POST 方法

  • 用途:用于传输实体的主体,通常用于提交表单数据。
  • 示例:POST /submit.cgi HTTP/1.1
  • 特性:可以发送大量的数据给服务器,并且数据包含在请求体中 

总结:

GET一般用来获取静态资源,也可以通过url向服务器传递参数。

POST可以通过 http request 的正文来进行参数传递 

url传递参数,参数的体量一定不大,正文可以很大。

POST方法,比GET方法传参更私密,但都不安全。

HEAD 方法

  • 用途:与 GET 方法类似,但不返回报文主体部分,仅返回响应头。
  • 示例:HEAD /index.html HTTP/1.1
  • 特性:用于确认 URL 的有效性及资源更新的日期时间等。

DELETE 方法

  • 用途:用于删除文件,是 PUT 的相反方法。
  • 示例:DELETE /example.html HTTP/1.1
  • 特性:按请求 URL 删除指定的资源

OPTIONS 方法

  • 用途:用于查询针对请求 URL 指定的资源支持的方法。
  • 示例:OPTIONS * HTTP/1.1
  • 特性:返回允许的方法,如 GET、POST 等。

部分http代码

#pragma once#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include<functional>
#include <fstream>
#include <unordered_map>const static std::string base_sep = "\r\n";
const static std::string line_sep = ": ";
const static std::string prefixpath = "wwwroot"; // web根目录
const static std::string homepage = "index.html";
const static std::string httpversion = "HTTP/1.0";
const static std::string spacesep = " ";
const static std::string suffixsep = ".";
const static std::string html_404 = "404.html";
const static std::string arg_sep = "?";class HttpRequest
{
private:std::string GetLine(std::string &reqstr){auto pos = reqstr.find(base_sep);if (pos == std::string::npos)return std::string();std::string line = reqstr.substr(0, pos);reqstr.erase(0, line.size() + base_sep.size());return line.empty() ? base_sep : line;}void ParseReqLine(){std::stringstream ss(_req_line); // cin >>ss >> _method >> _url >> _version;//a/b/c.html or /login?user=XXX&passwd=1234 /registerif(strcasecmp(_method.c_str(),"GET")==0){auto pos=_url.find(arg_sep);if(pos!=std::string::npos){_body_text=_url.substr(pos+arg_sep.size());_url.resize(pos);}}_path += _url;if (_path[_path.size() - 1] == '/'){_path += homepage;}// wwwroot/index.html// wwwroot/image/1.pngauto pos = _path.rfind(suffixsep);if (pos != std::string::npos){_suffix = _path.substr(pos);}else{_suffix = ".default";}}void ParseReqHeader(){for (auto &header : _req_headers){auto pos = header.find(line_sep);if (pos == std::string::npos)continue;std::string k = header.substr(0, pos);std::string v = header.substr(pos + line_sep.size());if (k.empty() || v.empty())continue;_headers_kv.insert(std::make_pair(k, v));}}public:HttpRequest() : _blank_line(base_sep), _path(prefixpath){}void Deserialize(std::string &reqstr){// 基本的反序列化_req_line = GetLine(reqstr);std::string header;do{header = GetLine(reqstr);if (header.empty())break;else if (header == base_sep)break;_req_headers.push_back(header);} while (true);if (!reqstr.empty()){_body_text = reqstr;}// 再进一步反序列化ParseReqLine();ParseReqHeader();}std::string Url(){LOG(DEBUG, "Client Want url %s\n", _url.c_str());return _url;}std::string Path(){LOG(DEBUG, "Client Want path %s\n", _path.c_str());return _path;}std::string Suffix(){return _suffix;}std::string Method(){LOG(DEBUG, "Client request method is %s\n", _method.c_str());return _method;}std::string GetRequestBody(){LOG(DEBUG, "Client request method is %s, args: %s, request path: %s\n", _method.c_str(),_body_text.c_str(),_path.c_str());return _body_text;}void Print(){std::cout << "---------------------------" << std::endl;std::cout << "###" << _req_line << std::endl;for (auto &header : _req_headers){std::cout << "@@@" << header << std::endl;}std::cout << "***" << _blank_line;std::cout << ">>>" << _body_text << std::endl;std::cout << "Method:" << _method << std::endl;std::cout << "Url:" << _url << std::endl;std::cout << "Version:" << _version << std::endl;for (auto &header_kv : _headers_kv){std::cout << ")))" << header_kv.first << "->" << header_kv.second << std::endl;}}~HttpRequest(){}private:// 基本的httprequest的格式std::string _req_line;std::vector<std::string> _req_headers;std::string _blank_line;std::string _body_text;// 更具体的属性字段,需要进一步反序列化std::string _method;std::string _url;std::string _path;std::string _suffix; // 资源后缀std::string _version;std::unordered_map<std::string, std::string> _headers_kv;
};class HttpResponse
{
public:HttpResponse() : _version(httpversion), _blank_line(base_sep){}void AddCode(int code, const std::string &desc){_status_code = code;_desc = desc;}void AddHeader(const std::string &k, const std::string &v){_headers_kv[k] = v;}void AddBodyText(const std::string body_text){_resp_body_text = body_text;}std::string Serialize(){// 1.构建状态行_status_line = _version + spacesep + std::to_string(_status_code) + spacesep + _desc + base_sep;// 2.构建应答报头for (auto &header : _headers_kv){std::string header_line = header.first + line_sep + header.second + base_sep;_resp_headers.push_back(header_line);}// 3.空行和正文// 4.正式序列化std::string responsestr = _status_line;for (auto &line : _resp_headers){responsestr += line;}responsestr += _blank_line;responsestr += _resp_body_text;return responsestr;}~HttpResponse(){}private:// httpresponse base 属性std::string _version;int _status_code;std::string _desc;std::unordered_map<std::string, std::string> _headers_kv;// 基本的httprequest的格式std::string _status_line;std::vector<std::string> _resp_headers;std::string _blank_line;std::string _resp_body_text;
};using func_t=std::function<HttpResponse(HttpRequest&)>;class HttpServer
{
public:std::string GetFileContent(const std::string &path){std::ifstream in(path, std::ios::binary);if (!in.is_open())return std::string();in.seekg(0, in.end);int filesize = in.tellg(); // 告诉我你的rw偏移量是多少in.seekg(0, in.beg);std::string content;content.resize(filesize);in.read((char *)content.c_str(), filesize);in.close();return content;}public:HttpServer(){_mime_type.insert(std::make_pair(".html", "text/html"));_mime_type.insert(std::make_pair(".jpg", "image/jpeg"));_mime_type.insert(std::make_pair(".png", "image/png"));_mime_type.insert(std::make_pair(".default", "text/html"));_code_to_desc.insert(std::make_pair(100, "Continue"));_code_to_desc.insert(std::make_pair(200, "OK"));_code_to_desc.insert(std::make_pair(201, "Created"));_code_to_desc.insert(std::make_pair(301, "Moved Permanently"));_code_to_desc.insert(std::make_pair(302, "Found"));_code_to_desc.insert(std::make_pair(404, "Not Found"));}// #define TESTstd::string HandlerHttpRequest(std::string &reqstr) // req曾经被客户端序列化过{
#ifdef TESTstd::cout << "--------------------------------" << std::endl;std::cout << reqstr;std::string responsestr = "HTTP/1.1 200 OK\r\n";responsestr += "Content-Type: text/html\r\n";responsestr += "\r\n";responsestr += "<html><h1>hello Linux, hello bite!</h1></html>";return responsestr;
#elsestd::cout << "--------------------------------" << std::endl;std::cout << reqstr;std::cout << "--------------------------------" << std::endl;HttpRequest req;HttpResponse resp;req.Deserialize(reqstr);// req.Method();if (req.Path() == "wwwroot/redir"){//处理重定向std::string redir_path="https://www.qq.com";resp.AddCode(301,_code_to_desc[301]);resp.AddHeader("Location",redir_path);}else{// 最基本的上层处理,处理静态资源std::string content = GetFileContent(req.Path());if (content.empty()){std::string content = GetFileContent("wwwroot/404.html");resp.AddCode(404, _code_to_desc[404]);resp.AddHeader("Content-Length", std::to_string(content.size()));resp.AddHeader("Content-Type", _mime_type[".html"]);resp.AddBodyText(content);}else if(!req.GetRequestBody().empty()){if(IsServiceExists(req.Path())){resp=_service_list[req.Path()](req);}}else{resp.AddCode(200, _code_to_desc[200]);resp.AddHeader("Content-Length", std::to_string(content.size()));resp.AddHeader("Content-Type", _mime_type[req.Suffix()]);resp.AddHeader("Set-Cookie","username=zhangsan");// resp.AddHeader("Set-Cookie","passwd=12345");resp.AddBodyText(content);}}return resp.Serialize();
#endif}void InsertService(const std::string &servicename,func_t f){std::string s=prefixpath+servicename;_service_list[servicename]=f;}bool IsServiceExists(const std::string &servicename){auto iter=_service_list.find(servicename);if(iter==_service_list.end()) return false;else return true;}~HttpServer(){}private:std::unordered_map<std::string, std::string> _mime_type;std::unordered_map<int, std::string> _code_to_desc;std::unordered_map<std::string, func_t> _service_list;
};

相关文章:

【Linux网络】应用层协议HTTP

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目录 HTTP 协议 认识 URL urlencode 和 urldecode HTTP 协议请求与响应格式 H…...

高并发架构及场景解决方案

高并发 一、什么是高并发&#xff1f; 高并发是指系统在短时间内能够同时处理大量用户请求或任务的能力&#xff0c;是衡量分布式系统、互联网应用性能的重要指标之一。它的核心目标是确保系统在高负载下仍能稳定、高效运行&#xff0c;同时提供良好的用户体验。 1、高并发系…...

[ linux-系统 ] 常见指令2

1. man 指令 语法&#xff1a;man [选项] 命令 功能&#xff1a;查看联机手册获取帮助。 选项说明-k根据关键字搜索联机帮助。num只在第num章节找。-a显示所有章节的内容。 man是 Unix 和类 Unix 系统中的一个命令&#xff0c;用于查看操作系统和软件的手册页面&#xff08;ma…...

Spring AI快速入门

一、引入依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> <dependencyManagement><dependencies><dependency><groupId>o…...

TCP数据报

三次握手&#xff08;Three-Way Handshake&#xff09; 是 TCP 协议中用于建立可靠连接的过程。通过三次握手&#xff0c;客户端和服务器能够确认彼此的存在&#xff0c;并且同步各自的初始序列号&#xff0c;为后续的数据传输做好准备。三次握手确保了双方在正式传输数据前能…...

JS循环-for循环嵌套

打印5行5列星星 效果图 代码&#xff1a; // 打印出5行5列的星星for(i 1 ; i < 5 ; i ) {// 外层控制打印行for(j 1 ; j < 5 ; j ) {// 内层控制每行打印几个document.write(⭐)}document.write(<br>)} 打印侧三角 效果图 代码&#xff1a; for(i 1 ; i &l…...

【技术追踪】通过潜在扩散和先验知识增强时空疾病进展模型(MICCAI-2024)

向扩散模型中引入先验知识&#xff0c;实现疾病进展预测&#xff0c;扩散模型开始细节作业了~ 论文&#xff1a;Enhancing Spatiotemporal Disease Progression Models via Latent Diffusion and Prior Knowledge 代码&#xff1a;https://github.com/LemuelPuglisi/BrLP 0、摘…...

Linux/AndroidOS中进程间的通信线程间的同步 - 内存映射

前言 如何使用 mmap()系统调用来创建内存映射。内存映射可用于 IPC 以及其他很多方面。 1 概述 mmap()系统调用在调用进程的虚拟地址空间中创建一个新内存映射。映射分为两种。 文件映射&#xff1a;文件映射将一个文件的一部分直接映射到调用进程的虚拟内存中。一旦一个文…...

单例模式的实现方法

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这种模式在需要控制对资源&#xff08;如配置对象、线程池、缓存等&#xff09;的访问时特别有用。 一、单例模…...

laravel 12 监听syslog消息,并将消息格式化后存入mongodb

在Laravel 12中实现监听Syslog消息并格式化存储到MongoDB&#xff0c;需结合日志通道配置、Syslog解析和MongoDB存储操作。以下是具体实现方案&#xff1a; 一、环境配置 安装MongoDB扩展包 执行以下命令安装必要的依赖&#xff1a; composer require jenssegers/mongodb ^4.0确…...

如何在使用 docker-compose 命令时指定 COMPOSE_PROJECT_NAME ?

1.默认值 COMPOSE_PROJECT_NAME 环境变量的默认值并非 docker。在没有显式设置 COMPOSE_PROJECT_NAME 时&#xff0c;其默认值是运行 docker-compose 命令所在目录的基础名称&#xff08;也就是当前工作目录去掉路径后的文件夹名称&#xff09;。 以下为你详细说明&#xff1…...

在命令行终端中快速打开npm包官网

命令 npm home 命令用于快速打开指定 npm 包的官网。例如&#xff0c;npm home react 会尝试打开 React 库的官方网站。 npm home PACKAGE_NAME 该命令会首先查找指定包的 package.json 文件中的 homepage 字段&#xff0c;如果存在&#xff0c;则打开该字段指定的网址。 {&…...

鸿蒙NEXT开发动画(风格的弹性缩放加载动画组件)

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件&#xff0c;代码如下&#xff1a; // 接口定义&#xff08;必须放在使用前&#xff09; /*** 关键帧动画整体配置参数*/ interface KeyframeAnimationConfig {iterations: number;delay: number; }/*** 单个关键帧动画项*/…...

【MongoDB篇】MongoDB的事务操作!

目录 引言第一节&#xff1a;什么是事务&#xff1f; (ACID 原则)第二节&#xff1a;MongoDB 的演进&#xff1a;多文档 ACID 事务的到来&#xff01;&#x1f389;第三节&#xff1a;事务的“玩法”——如何执行一个事务&#xff1f;&#x1f4bb;&#x1f91d;第四节&#xf…...

Android第六次面试总结之Java设计模式篇(一)

一、单例模式在 Android 面试中的核心考点 1. Android 中如何安全实现单例&#xff1f;需注意哪些坑&#xff1f;&#xff08;字节跳动、美团面试真题&#xff09; 解答&#xff1a; Android 中实现单例需重点关注 Context 泄漏、线程安全 和 反射 / 序列化攻击。 推荐实现&…...

关于论文中插入公式但是公式相对于段落的位置偏上应该如何调整备份

因为mythtype之前插入到word里面出现了一些问题就给删掉了&#xff0c;本来要是word里面内联mythtype的话直接&#xff0c;点击mythtype的格式化就可以了&#xff0c; 也就是这个佬的视频介绍链接 然后现在试了试普通word里面的方法&#xff0c;这个是比较有用的 然后看这个例…...

[java八股文][Java并发编程面试篇]并发安全

juc包下你常用的类&#xff1f; 线程池相关&#xff1a; ThreadPoolExecutor&#xff1a;最核心的线程池类&#xff0c;用于创建和管理线程池。通过它可以灵活地配置线程池的参数&#xff0c;如核心线程数、最大线程数、任务队列等&#xff0c;以满足不同的并发处理需求。Exe…...

【东枫科技】代理英伟达产品:智能网卡

文章目录 对比详细&#xff1a;NVIDIA ConnectX-7 适配器详细&#xff1a;NVIDIA ConnectX-6 Lx 以太网智能网卡详细&#xff1a;NVIDIA ConnectX-6 Dx 以太网智能网卡详细&#xff1a;NVIDIA ConnectX-6 InfiniBand 适配器 对比 详细&#xff1a;NVIDIA ConnectX-7 适配器 为最…...

eNSP中路由器OSPF协议配置完整实验和命令解释

本实验使用三台华为路由器&#xff08;R1、R2和R3&#xff09;相连&#xff0c;配置OSPF协议实现网络互通。拓扑结构如下&#xff1a; 实验IP规划 R1: GE0/0/0: 192.168.12.1/24 (Area 0)Loopback0: 1.1.1.1/32 (Area 0) R2: GE0/0/0: 192.168.12.2/24 (Area 0)GE0/0/1: 192.…...

解锁健康生活:全新养身指南

健康养身不是遥不可及的目标&#xff0c;而是由一个个小习惯编织成的生活方式。当我们将这些健康理念融入日常&#xff0c;就能为身体注入源源不断的活力。​ 从 “吃” 开始守护健康。尝试制作 “营养碗”&#xff0c;底层铺满羽衣甘蓝、生菜等绿叶蔬菜&#xff0c;中间搭配水…...

win11 怎样把D盘空间分给C盘一点

如下所示&#xff0c;我的C盘甚至已经爆红了&#xff0c;打算D盘清理一些空间给C盘。 首先附上链接&#xff0c;这是我在b站看的教程&#xff0c;虽然跟着视频没成功&#xff0c;但是结合评论区大神们的建议&#xff0c;尝试了好几种方法&#xff0c;最终自己摸索成功了。 【怎…...

Apache Doris与StarRocks对比

## 历史背景 Apache Doris源自百度的Palo项目,于2017年开源,2018年贡献给Apache基金会,并于2022年从Apache孵化器毕业成为顶级项目。StarRocks则是由原Apache Doris团队的一部分成员在2020年分支出来成立的独立项目,最初称为DorisDB,后更名为StarRocks。这两个项目虽然有…...

OSCP - Proving Grounds - NoName

主要知识点 linux命令注入SUID find提权 具体步骤 从nmap开始搜集信息&#xff0c;只开放了一个80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …...

2025年OpenAI重大架构调整:资本与使命的再平衡

目录 前言 一、调整核心&#xff1a;三重架构的重构 1.1 控制权的重新锚定 1.2 营利部门的角色转型 1.3 资金池的重新配置 二、调整动因&#xff1a;三重矛盾的破解 2.1 资金需求与融资限制的冲突 2.2 商业竞争与使命纯度的博弈 2.3 内部治理与外部监管的张力 三、产…...

【quantity】0 README.md文件

PhysUnits 物理单位库 Type-safe physical quantities with dimensional analysis 带量纲分析的类型安全物理量库 A Rust library for safe unit operations / Rust实现的类型安全单位计算库 Core Design / 核心设计 1. Dimension / 量纲 /// Base SI dimensions / 国际单…...

[python] str

一、移除字符串中所有非字母数字字符 使用正则表达式 import re string_value "alphanumeric123__" cleaned_string re.sub(r[\W_], , string_value) # 或 r[^a-zA-Z0-9] print(cleaned_string) # 输出: alphanumeric123使用**str.isalnum()**方法 string_v…...

iOS与HTTPS抓包调试小结

最近在做一个多端 SDK 网络请求兼容性的测试&#xff0c;期间遇到一些 HTTPS 请求抓不到、iOS 抓包失效等问题&#xff0c;趁机整理一下我平时抓包时用到的几个工具和技巧&#xff0c;也顺便记录一下对比体验。 一、传统工具的局限 最早用的是 Charles 和 Fiddler&#xff0c…...

AI基础知识(02):机器学习的任务类型、学习方式、工作流程

03 机器学习(Machine Learning)的任务类型与学习方式 广义的机器学习主要是一个研究如何让计算机通过数据学习规律,并利用这些规律进行预测和决策的过程。这里的Machine并非物理意义上的机器,可以理解为计算机软硬件组织;Learning可以理解为一个系统或平台经历了某些过程…...

2025年大风灾害预警升级!疾风气象大模型如何筑起安全防线?

近年来,全球极端天气事件频发,大风灾害正成为威胁城市安全、交通运输和公共设施的重要隐患。据气象部门预测,2025年我国大风天气将更加频繁,局部地区可能出现超强阵风,对高空作业、电力设施、交通运输等领域构成严峻挑战。面对这一趋势,传统的气象预警方式已难以满足精准…...

Docker手动重构Nginx镜像,融入Lua、Redis功能

核心内容&#xff1a;Docker重构Nginx镜像&#xff0c;融入Lua、Redis功能 文章目录 前言一、准备工作1、说明2、下载模块3、Nginx配置文件3、Dockerfile配置文件3、准备工作全部结束 二、构建镜像三、基于镜像创建容器三、lua脚本的redis功能使用总结 前言 ⁣⁣⁣⁣ ⁣⁣⁣⁣…...

Spring Boot Starter简介-笔记

1. Starter简介 Spring Boot Starter 是 Spring Boot 框架的核心组件之一&#xff0c;它通过预定义的依赖集合和自动化配置机制&#xff0c;极大简化了 Spring 应用的开发和部署。 Spring Boot Starter 的核心功能 自动化配置&#xff08;Auto-Configuration&#xff09; Spr…...

关系型数据库与非关系型数据库深度对比:从设计哲学到应用场景的全解析

关系型数据库与非关系型数据库深度对比:从设计哲学到应用场景的全解析 引言 在数字化浪潮中,数据库技术始终扮演着基础核心角色。本文将通过技术架构、应用场景等维度,深入剖析关系型数据库(RDBMS)与非关系型数据库(NoSQL)的本质差异。我们将以MySQL、MongoDB、Redis等…...

论文速读:《CoM:从多模态人类视频中学习机器人操作,助力视觉语言模型推理与执行》

论文链接&#xff1a;https://arxiv.org/pdf/2504.13351 项目链接&#xff1a;https://chain-of-modality.github.io/ 0. 简介 现代机器人教学的一个重要方向是让机器人通过观看人类的视频演示&#xff0c;自动学习并执行复杂的物理操作任务&#xff0c;比如拧瓶盖、插插头、打…...

系统思考:选择大于努力

在今年的伯克希尔哈撒韦股东大会上&#xff0c;94岁高龄的股神巴菲特再次以他的智慧和幽默&#xff0c;给年轻人留下了三句关于人生的黄金建议。让我印象最深刻的是&#xff1a;“选择和谁一起走&#xff0c;比怎么走更重要。” 这一句话让我反思了许多——人生的轨迹不单单是…...

【HTML5】显示-隐藏法 实现网页轮播图效果

【HTML5】显示-隐藏法 实现网页轮播图效果 实现思路&#xff1a;先将所有图片在页面中设置好&#xff0c;然后给放置图片的元素li添加display&#xff1a;none属性将其隐藏&#xff0c;然后通过js获取到放置图片的元素li&#xff0c;再一个一个的给li元素添加display&#xff…...

Jenkins 改完端口号启动不起来了

让我们将 Jenkins 恢复到默认的 8080 端口&#xff0c;确保它能正常启动&#xff1a; 1. 修改 Jenkins 的配置文件&#xff1a; sudo nano /etc/default/jenkins 将内容修改为&#xff1a; HTTP_PORT8080 JENKINS_ARGS"--webroot/var/cache/jenkins/war --httpPort8080…...

招标专家随机抽选——设计讲解—未来之窗智能编程——仙盟创梦IDE

招标专家系统 专家评标系统是服务于各类招标评标活动的数字化平台。它依托先进信息技术&#xff0c;集专家库管理、随机抽取专家、在线评标等功能于一体。系统依据项目需求设定筛选条件&#xff0c;从庞大专家库中精准抽取合适专家。评标时&#xff0c;专家可在线查阅投标文件…...

Os 库报错指南 路径处理常见陷阱

平台分隔符差异 Windows用\&#xff0c;Unix用/ → 使用os.path.join()自动处理 路径解析错误 os.path.abspath()解析相对路径时依赖当前工作目录 路径规范化缺失 ../等符号链接需用os.path.normpath()规范化 # 不推荐 path dir\\file.txt # Windows风格 path dir/file.…...

GD32/STM32 ADC/DMA使用指南

首先我们对ADC及DMA的基础知识作一下简单介绍。 一、 GD32/STM32 ADC模块的核心要点 一&#xff09;、ADC基础特性 ‌12位逐次逼近型‌ GD32/STM32 ADC为12位分辨率&#xff0c;最大量化值为4095&#xff08;对应3.3V参考电压&#xff09;&#xff0c;支持0-3.3V模拟输入范…...

CSS Border 三角形阴影与多重边框的制作

CSS Border 三角形阴影与多重边框的制作 在现代网页设计中&#xff0c;CSS的强大功能让设计师和开发者能够创造出丰富多彩的视觉效果。本文将深入探讨如何利用CSS的border​属性制作三角形阴影以及多重边框效果。这些技巧不仅能提升页面的美观度&#xff0c;还能增强用户体验。…...

ES6/ES11知识点 续五

迭代器【Iterator】 ES6 中的**迭代器&#xff08;Iterator&#xff09;**是 JavaScript 的一种协议&#xff0c;它定义了对象如何被逐个访问。迭代器与 for…of、扩展运算符、解构赋值等语法密切相关。 &#x1f4d8; 迭代器工作原理 ES6 迭代器的工作原理基于两个核心机制…...

如何选择 边缘计算服务器

边缘计算服务器选型指南&#xff08;2025年更新版&#xff09; 一、明确应用场景需求 场景细分‌ 工业控制、自动驾驶等需‌毫秒级响应‌的场景&#xff0c;优先选择集成多核处理器&#xff08;如Xeon D系列&#xff09;和实时算法加速模块的机型&#xff0c;确保延迟≤50ms&…...

VMware如何安装?Ubuntu详细步骤

VMware如何安装&#xff1f;Ubuntu详细步骤如下&#xff1a; 在VMware中安装Ubuntu是一个常见的操作&#xff0c;适用于开发、测试或学习Linux的场景。以下是详细的实战步骤和注意事项&#xff0c;帮助你顺利完成安装。 准备工作 软件下载&#xff1a; VMware Workstation/Play…...

【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)高级用法

【Bootstrap V4系列】学习入门教程之 组件-卡片&#xff08;Card&#xff09;高级用法 一、Sizing 尺寸1.1 Using grid markup 使用网格标记1.2 Using utilities 使用实用程序1.3 Using custom CSS 使用自定义CSS 二、Text alignment 文本对齐方式三、Navigation 导航 一、Sizi…...

WiFi那些事儿(八)——802.11n

目录 802.11n 技术简介与测试项 一、802.11n 技术简介 &#xff08;一&#xff09;标准概述 &#xff08;二&#xff09;关键技术特性 1. MIMO&#xff08;多输入多输出&#xff09;技术 2. 信道绑定&#xff08;Channel Bonding&#xff09; 3. 帧聚合&#xff08;Fram…...

Transformer数学推导——Q56 推导动态残差门控(Dynamic Residual Gating)的权重更新公式

该问题归类到Transformer架构问题集——残差与归一化——残差连接。请参考LLM数学推导——Transformer架构问题集。 1. 引言 在深度学习的演进历程中&#xff0c;网络结构的创新始终围绕着如何更高效地处理信息、提升模型性能展开。动态残差门控&#xff08;Dynamic Residual…...

Kaggle——House Prices(房屋价格预测)简单实现

题目‌&#xff1a; 从Kaggle的“House Prices - Advanced Regression Techniques”数据集使用Pandas读取数据&#xff0c;并查看数据的基本信息。选择一些你认为对房屋价格有重要影响的特征&#xff0c;并进行数据预处理&#xff08;如缺失值处理、异常值处理等&#xff09;。…...

Vue项目Git提交流程集成

Vue项目Git提交流程集成 本教程将指导你如何在Vue项目中集成一个规范化的Git提交流程&#xff0c;包括代码规范检查、提交信息规范和自动化工具配置。 前置条件 Node.js 14.0 和 npm/yarn/pnpmVue项目&#xff08;Vue 2或Vue 3均可&#xff09;Git已初始化的仓库 一、规范化…...

使用 OpenSSL 吊销 Kubernetes(k8s)的 kubeconfig 里的用户证书

一.用 OpenSSL 依据已有的自签名 CA 注销签发的证书的步骤 1. 准备工作 你得有自签名 CA 的私钥&#xff08;通常是 .key 文件&#xff09;、CA 证书&#xff08;通常是 .crt 文件&#xff09;以及证书吊销列表&#xff08;CRL&#xff09;文件。若还没有 CRL 文件&#xff0c…...

kubeadm部署k8s

我在阿里云上部署的k8s master 4c/8g/40g rocky linux8.9 node1/node2 2c/4g/40g rocky linux8.9 安装docker (我安装的是v1.19.1版本&#xff0c;是旧版本&#xff0c;可以装新版本&#xff0c;docker的版本和kubeadm,kubectl,kubelet版本相同&#xff09; 1.所有…...