ssh远程连接
远程登录命令使用 ssh 命令可以安全地远程登录到另一台 Linux/Unix 服务器。基本格式如下: 1ssh [用户名@]主机地址 [-p 端口号] 常用示例 使用默认端口(22)登录:ssh root@192.168.1.100 指定其他端口:ssh admin@example.com -p 2222 仅执行一条命令后退出:ssh user@host 'ls -l' 常见选项 选项 说明 -p <port> 指定远程服务器的端口(默认22) -i <keyfile> 使用指定的私钥文件进行身份验证 -l <username> 指定登录用户名(等价于 user@ 语法) -v 显示详细调试信息(可加多个 v 增加详细度) -C 压缩传输数据 -X 启用 X11 图形界面转发 -N 不执行远程命令(常用于端口转发) 首次登录提示第一次连接到某台主机时,ssh 会提示您确认远程主机的指纹: 12The authenticity of host '...' c...
AI_AI领域名词
LLMLarge Language Model,大语言模型,简称大模型。 市面上的大模型基本上都是基于 Transformer 架构设计的。 Token大模型处理数据的最基本单元。 通过 Tokenizer 来进行编码(将输入切分成 Token,然后映射成 Token ID)和解码(将 Token ID 映射成 Token)。 1 个 Tolen,约等于 0.75 个单词,约等于 1.5~2 个汉字。 输入的Token通常比输出Token要贵好几倍,看不同厂商。 Context上下文,大模型每次处理任务时接收到的信息总和(对话历史,用户问题,输出的 Token,工具列表,System Prompt等 )。 大模型的临时记忆体。 Context Window上下文窗口,大模型的 Context 最多能够存储的 Token 数量。 通过 RAG 可以减少文件无关信息对上下文窗口占用。 Prompt提示词。 User Prompt 用户给大模型下达的具体指令或问题。 System Prompt 系统给大模型下达的具体指令或问题。 现在的大部分的产品,不仅仅是个LLM了,基本都进化成 A...
常用网络地址结构
sockaddr通用地址结构。 1234struct sockaddr { sa_family_t sa_family; char sa_data[14];}; 通常不直接使用,而是作为函数参数类型。 例如: 1bind(sockfd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)); sockaddr_inIPv4 地址结构。 1234567#include <netinet/in.h>struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr;}; 常用示例: 1234sockaddr_in addr{};addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = INADD...
C++中的Socket_API
以下主要以 Linux C++ 为例。 常用头文件123456789#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <cstring>#include <iostream> socket()创建套接字。 1int socket(int domain, int type, int protocol); 常用参数: 1int fd = socket(AF_INET, SOCK_STREAM, 0); 含义: 参数 说明 AF_INET IPv4 SOCK_STREAM TCP 0 自动选择协议 UDP: 1int fd = socket(AF_INET, SOCK_DGRAM, 0); bi...
服务器并发模型
服务器需要同时处理多个客户端连接,常见并发模型如下。 单线程阻塞模型一个线程处理一个连接。 流程: 1234accept()recv()send()close() 缺点: 同一时间只能服务一个客户端 并发能力很弱 适合: 学习 简单测试 多进程模型每个连接创建一个子进程处理。 12主进程 accept()子进程处理客户端 优点: 进程隔离性好 一个连接崩溃不影响其他连接 缺点: 进程创建销毁开销大 进程间通信复杂 典型场景: 早期 Apache prefork 模型 多线程模型每个连接创建一个线程处理。 优点: 编程相对简单 比多进程轻量 缺点: 线程数量过多时上下文切换开销大 需要注意线程安全 简单示意: 123456789101112131415161718192021#include <thread>void handleClient(int clientfd) { char buf[1024]; while (true) { ssize_t n = recv(clientfd, bu...
协议基础
TCP 协议TCP 是面向连接、可靠的传输层协议。 特点: 面向连接 可靠传输 有序传输 面向字节流 有流量控制 有拥塞控制 适合: HTTP/HTTPS 文件传输 数据库连接 邮件传输 TCP 三次握手建立连接需要三次握手: 1234客户端 服务端 | -------- SYN -------------> | | <----- SYN + ACK ---------- | | -------- ACK -------------> | 目的: 确认双方收发能力正常 协商初始序列号 TCP 四次挥手关闭连接通常需要四次挥手: 12345主动关闭方 被动关闭方 | -------- FIN -------------> | | <------- ACK -------------- | | <------- FIN -------------- | | -------- ACK ------------->...
IO模型
网络 IO 的本质: 等待数据准备好,并将数据从内核缓冲区拷贝到用户缓冲区。 常见 IO 模型: 阻塞 IO 非阻塞 IO IO 多路复用 信号驱动 IO 异步 IO 阻塞 IO默认情况下,Socket 是阻塞的。 例如调用 recv() 时: 如果没有数据,线程会阻塞等待 有数据后才返回 示例: 12char buffer[1024];ssize_t n = recv(sockfd, buffer, sizeof(buffer), 0); 如果没有数据,程序会停在 recv()。 优点: 编程简单 缺点: 一个线程只能处理一个连接 并发能力差 非阻塞 IO可以将 Socket 设置为非阻塞。 如果没有数据,recv() 不会阻塞,而是立即返回错误。 1234567#include <fcntl.h>#include <unistd.h>void setNonBlocking(int fd) { int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags...
Socket基础
什么是 SocketSocket 可以理解为网络通信的端点。 对于 TCP 通信来说,一个连接通常由四元组唯一确定: 1源 IP、源端口、目的 IP、目的端口 例如: 12客户端:192.168.1.100:50000服务器:192.168.1.10:8080 Socket 类型常见 Socket 类型: 类型 说明 对应协议 SOCK_STREAM 面向连接、可靠、字节流 TCP SOCK_DGRAM 无连接、不可靠、数据报 UDP SOCK_RAW 原始套接字 IP/ICMP TCP Sokcet 通信流程服务端流程123456socket()bind()listen()accept()recv()/send()close() 客户端流程1234socket()connect()send()/recv()close() TCP 服务端示意12345678910111213客户端 服务端 | | | connect | |--...
网络编程基础
什么是网络编程网络编程是指不同主机上的程序通过网络进行数据交换的编程技术。 常见场景: 浏览器访问网页 客户端连接服务器 聊天程序 文件传输 游戏服务器 RPC / HTTP 服务 网络通信的本质: 两个进程通过操作系统提供的网络接口进行数据收发。 在 Linux / Unix 系统中,网络通信通常通过 Socket API 完成。 网络通信基本要素一次网络通信通常需要以下信息: 要素 说明 IP 地址 标识网络中的一台主机 端口号 标识主机上的一个进程或服务 协议 规定通信规则,例如 TCP、UDP Socket 操作系统提供的网络通信接口 例如: 1192.168.1.10:8080 表示: IP 地址:192.168.1.10 端口号:8080 IP 地址IP 地址用于标识网络中的设备。 常见类型: 类型 示例 IPv4 192.168.1.1 IPv6 fe80::1 IPv4 是 32 位地址,通常用点分十进制表示。 端口号端口号用于标识一台主机上的具体应用程序。 范围: 范围 含义...
异步机制
异步不需要等待当前任务完成,就可以继续执行后续任务的处理方式。 asyncstd::async用于异步执行任务。它返回一个std::future对象,可以通过future.get()获取结果。 示例: 1234567891011121314#include <iostream>#include <future>int add(int a, int b) { return a + b;}int main() { std::future<int> result = std::async(add, 3, 4); std::cout << result.get() << std::endl; return 0;} 输出: 17 async 的启动策略std::async 有两种常用启动策略: 12std::launch::asyncstd::launch::deferred std::launch::async立即创建异步任务,通常会在新线程中执行。 123a...



