Server Name Indication(SNI),HTTP/TLS握手过程解析
Server Name Indication(SNI)是一种TLS扩展,用于在TLS握手过程中传递服务器的域名信息。在未使用SNI之前,客户端在建立TLS连接时只能发送单个IP地址,并且服务器无法知道客户端请求的具体域名。这导致服务器需要使用默认证书进行握手,无法正确选择合适的证书。
使用SNI扩展后,客户端在发送ClientHello消息时会包含所请求的服务器的域名。服务器根据该域名来选择对应的证书进行握手,从而实现了多个域名共享同一个IP地址并使用不同证书的能力。
SNI对于虚拟主机或者CDN等场景特别有用,因为这些场景下,多个网站可能共享同一个IP地址。通过使用SNI,服务器能够正确地选择与域名匹配的证书,提高了安全性和灵活性。
SNI产生解决什么问题
Server Name Indication(SNI)的产生背景与互联网发展和IPv4地址短缺有关。
在互联网发展初期,每个网站通常拥有自己独立的IP地址。但随着网站数量的迅速增长和IPv4地址资源的有限,IP地址短缺问题变得日益严重。
为了解决IPv4地址短缺问题,一种解决方案是引入虚拟主机技术。虚拟主机是指在同一台物理服务器上托管多个不同域名的网站。通过共享同一个IP地址,多个网站能够减少IP地址的使用,并降低运维成本。
然而,这种虚拟主机技术在使用TLS(Transport Layer Security)协议时遇到了问题。TLS协议是用于加密和保护网络通信的协议,它在握手过程中需要使用正确的证书来验证服务器身份。但在使用虚拟主机时,服务器无法根据传统的握手方式正确选择合适的证书,因为无法获知客户端请求的具体域名。
为了解决这个问题,SNI扩展被引入TLS协议中。它允许客户端在握手时发送所请求的服务器域名信息,使服务器能够正确选择并使用对应的证书,实现了多个域名共享同一个IP地址并使用不同证书的能力。SNI的引入为虚拟主机和CDN等场景提供了更好的支持,进一步促进了IPv4地址资源的有效利用。
抓包分析http握手过程
触发http请求
curl www.baidu.com
tcpdump抓包:
tcpdump -i any port 80 -nnnvvvv -w http.pcap
HTTP (Hypertext Transfer Protocol) 的握手过程如下:
-
1.建立TCP连接:客户端通过向服务器发送一个SYN包来发起与服务器的TCP连接。
-
2.服务器回应:服务器接收到客户端的SYN包后,返回一个SYN-ACK包,表示同意建立连接。
-
3.客户端确认:客户端接收到服务器的SYN-ACK包后,发送一个ACK包给服务器,表示连接已建立成功。
-
4.发送HTTP请求:客户端与服务器建立了TCP连接后,客户端可以发送HTTP请求。HTTP请求包括HTTP方法(GET, POST等)、URI(Uniform Resource Identifier)和HTTP协议版本等信息。
-
5.服务器响应:服务器接收到HTTP请求后,根据请求的内容进行处理,并返回HTTP响应。HTTP响应包括响应状态码(例如200表示成功,404表示未找到等)、响应头和响应体等信息。
-
-
6.关闭连接:客户端接收到服务器的HTTP响应后,根据需要继续发送其他请求,或者关闭TCP连接。
这是一个简化的HTTP握手过程,实际上还有更多的细节和可选项,例如在建立TCP连接时可能需要进行三次握手以确保连接的可靠性,还有可能使用持久连接(Keep-Alive)机制来减少握手的次数等。HTTP握手过程中的这些步骤保证了客户端和服务器之间的通信顺利进行,并确保数据在网络传输时的可靠性和完整性。
抓包分析TLS握手过程
触发https请求
curl -k --insecure "https://www.baidu.com"
tcpdump -i any port 443 -nnnvvvv -w https.pcap
WireShark抓包验证SNI:
TLS握手过程是一个复杂的过程,包括以下步骤:
- 1.客户端发送ClientHello报文:客户端发送一个ClientHello报文,该报文包含客户端支持的协议版本、会话ID、密码组和压缩方法。客户端提交的ClientHello所包含的密码组是客户支持的密码算法列表(按优先级降序排列),压缩方法是客户支持的压缩方法列表。
- 2.服务器返回ServerHello报文:服务器发送一个ServerHello报文,该报文包含服务器建议的协议版本、服务器选择的密码组和压缩方法,以及两个随机数:ClientHello.random和ServerHello.random。
- 3.服务器返回CA证书和请求客户端证书:服务器发送自己的证书(Certificate),Certificate 报文包含一个X.509证书或者一条证书链。除了匿名DH之外的密钥交换方法都需要发送Certificate报文。如果服务器需要被认证的话,服务器会发送自己的证书。同时,服务器可能会发送一个ServerKeyExchange报文,例如当服务器没有自己的证书或者证书仅用于签名时。
- 4.客户端提交证书并发送ClientKeyExchange报文:客户端将自己的证书上报给服务器,同时会发送一个ClientKeyExchange报文,该报文包含密钥协商后的秘钥给服务器。
- 5.客户端验证服务器的证书:客户端会验证服务器的证书的有效性。如果服务器的证书是有效的,客户端会发送一个ChangeCipherSpec报文和一个EncryptedHandshake消息。
- 6.服务器发送ChangeCipherSpec报文和EncryptedHandshake消息:服务器也会发送ChangeCipherSpec报文和EncryptedHandshake消息,表示握手协商已经完成。
- 7.应用层面交互:完成握手协商后,客户端和服务器会开始进行应用层面的交互,通过之前协商的秘钥来加密通信内容。
以上就是TLS握手过程的详细步骤。
Linux C/C++解析 Server Name Indication(SNI)字段
这是一个类似tcpdump的程序,用于在实时或捕获的流量中打印TLS SNI和HTTP/1.1主机字段。
char *tls_ContentType(uint8_t n)
{switch (n) {/* 20*/case SSL3_RT_CHANGE_CIPHER_SPEC:return "change_cipher_spec";/* 21 */case SSL3_RT_ALERT:return "alert";/* 22 */case SSL3_RT_HANDSHAKE:return "handshake";/* 23 */case SSL3_RT_APPLICATION_DATA:return "application_data";default:return "UNKNOWN";}return "";
}char *tls_AlertLevel(uint8_t n)
{switch(n) {/* 1 */case SSL3_AL_WARNING:return "warning";/* 2 */case SSL3_AL_FATAL:return "fatal";default:return "UNKNOWN";}return "";
}char *tls_AlertDescription(uint8_t n)
{switch(n) {/* 0 */case SSL3_AD_CLOSE_NOTIFY:return "close_notify";/* 10 */case SSL3_AD_UNEXPECTED_MESSAGE:return "unexpected_message";/* 20 */case SSL3_AD_BAD_RECORD_MAC:return "bad_record_mac";case 21:return "decryption_failed_RESERVED";case 22:return "record_overflow";case 30:return "decompression_failure";case 40:return "handshake_failure";case 41:return "no_certificate_RESERVED";case 42:return "bad_certificate";case 43:return "unsupported_certificate";case 44:return "certificate_revoked";case 45:return "certificate_expired";case 46:return "certificate_unknown";case 47:return "illegal_parameter";case 48:return "unknown_ca";case 49:return "access_denied";case 50:return "decode_error";case 51:return "decrypt_error";default:return "UNKNOWN";}return "";
}char *tls_HandshakeType(uint8_t n)
{switch(n) {/* 0 */case SSL3_MT_HELLO_REQUEST:return "hello_request";/* 1 */case SSL3_MT_CLIENT_HELLO:return "client_hello";/* 2 */case SSL3_MT_SERVER_HELLO:return "server_hello";/* 11 */case SSL3_MT_CERTIFICATE:return "certificate";/* 12 */case SSL3_MT_SERVER_KEY_EXCHANGE:return "server_key_exchange";/* 13 */case SSL3_MT_CERTIFICATE_REQUEST:return "certificate_request";/* 14 */case SSL3_MT_SERVER_DONE:return "server_hello_done";/* 15 */case SSL3_MT_CERTIFICATE_VERIFY:return "certificate_verify";/* 16 */case SSL3_MT_CLIENT_KEY_EXCHANGE:return "client_key_exchange";/* 20 */case SSL3_MT_FINISHED:return "finished";default:return "UNKNOWN";}return "";
}
...
int tls_set_callback_handshake_clienthello_servername(int (*handler)(uint8_t *, uint16_t));
int tls_process_Handshake_ClientHello_Extensions_ServerName();
int tls_process_Handshake_ClientHello_Extensions();
int tls_process_Handshake_ClientHello();
uint32_t tls_process_record(uint8_t *payload, uint32_t payload_length);
int http_set_callback_request_host(int (*handler)(uint8_t *host_name, uint16_t host_name_length));
int http_init();
uint16_t http_process_request(uint8_t *payload, uint16_t payload_length);
void http_cleanup();
int sni_handler (uint8_t *host_name, uint16_t host_name_length);int main (int argc, char *argv[])
{
...while ((i = getopt(argc, argv, "hf:pi:r:w:")) != -1) {switch(i) {case 'h':fprintf(stderr,"Use: %s [-h] [-f bpf] [-p] -i interface [-w dump.pcap]\n", argv[0]);fprintf(stderr,"Use: %s [-h] [-f bpf] [-p] -r trce.pcap [-w dump.pcap]\n", argv[0]);return -1;break;case 'f':bpf_s = optarg;opt_flags |= OPT_BPF;break;case 'p':opt_flags |= OPT_PROMISCUOUS;break;case 'i':device_name = optarg;opt_flags |= OPT_DEVICE;break;case 'r':trace_fname = optarg;opt_flags |= OPT_TRACE;break;case 'w':dump_fname = optarg;opt_flags |= OPT_DUMP;break;default:break;}}...fprintf(stdout, "[*] PID: %u\n", getpid());if (opt_flags & OPT_DEVICE) {fprintf(stdout, "[*] Device: '%s'\n", device_name);fprintf(stdout, "[*] Promiscuous: %d\n", PROMISCUOUS);if (!(pcap_handle =pcap_open_live(device_name, SNAPLEN, PROMISCUOUS, PCAP_TIMEOUT,errbuf))) {fprintf(stderr, "[FATAL] %s\n", errbuf);return -1;}}if (opt_flags & OPT_TRACE) {fprintf(stdout, "[*] Trace: '%s'\n", trace_fname);if (!(pcap_handle =pcap_open_offline(trace_fname, errbuf))) {fprintf(stderr, "[FATAL] %s\n", errbuf);return -1;}}...if (!(opt_flags & OPT_BPF)) {bpf_s = bpf_default;opt_flags |= OPT_BPF;}fprintf(stdout, "[*] BPF: '%s'\n", bpf_s);if (pcap_compile(pcap_handle, &bpf, BPF, BPF_OPTIMIZE,PCAP_NETMASK_UNKNOWN) == -1) {fprintf(stderr, "[FATAL] Couldn't parse filter. %s\n",pcap_geterr(pcap_handle));pcap_close(pcap_handle);return -1;}if (pcap_setfilter(pcap_handle, &bpf) == -1) {fprintf(stderr, "[FATAL] Couldn't install filter. %s\n",pcap_geterr(pcap_handle));pcap_close(pcap_handle);return -1;}pcap_freecode(&bpf);pcap_dumper_handle = NULL;if (opt_flags & OPT_DUMP) {fprintf(stdout, "[*] Dump: '%s'\n", dump_fname);if (!(pcap_dumper_handle = pcap_dump_open(pcap_handle, dump_fname))) {fprintf(stderr, "[WARNING] Couldn't create dump file. %s\n",pcap_geterr(pcap_handle));}}
...tls_set_callback_handshake_clienthello_servername(&sni_handler);http_set_callback_request_host(&sni_handler);http_init();act.sa_handler = signal_handler;sigemptyset (&act.sa_mask);act.sa_flags = 0;if (sigaction(SIGINT, &act, NULL)) {perror("sigaction");fprintf(stderr,"[WARNING] Failed to set signal handler for SIGINT.\n");}if (sigaction(SIGTERM, &act, NULL)) {perror("sigaction");fprintf(stderr,"[WARNING] Failed to set signal handler for SIGTERM.\n");}if (sigaction(SIGSEGV, &act, NULL)) {perror("sigaction");fprintf(stderr,"[WARNING] Failed to set signal handler for SIGSEGV.\n");}fprintf(stderr, "Capturing ...\n");if (pcap_loop(pcap_handle, -1, &my_pcap_handler, NULL) == -1) {fprintf(stderr, "[FATAL] pcap_loop failed. %s\n",pcap_geterr(pcap_handle));}if (!(opt_flags & OPT_TRACE)) {if (pcap_stats(pcap_handle, &ps) == -1) {fprintf(stderr, "pcap_stats failed. %s\n", pcap_geterr(pcap_handle));} else {fprintf(stderr, "%u packets received\n", ps.ps_recv);fprintf(stderr, "%u packets dropped\n", ps.ps_drop + ps.ps_ifdrop);}}pcap_close(pcap_handle);http_cleanup();if (pcap_dumper_handle) {pcap_dump_close(pcap_dumper_handle);fprintf(stderr, "Written %s\n", dump_fname);if (!(opt_flags & OPT_DUMP)) {free(dump_fname);}}...
}
If you need the complete source code, please add the WeChat number (c17865354792)
curl触发SNI字段解析
curl -k --insecure "https://www.baidu.com"
curl www.baidu.com
该程序从TLS握手客户端Hello消息中提取服务器名称指示(SNI)字段(RFC 4366),并从HTTP/1.1请求中提取主机请求头字段(RFC 2616)。
它接受一个网络接口作为输入来监控其流量(可选地以混杂模式),或者接受一个PCAP文件作为输入来读取。默认情况下,它使用BPF以目标端口为80或443的TCP数据包为目标,但如果相应配置,它将处理其他端口上的TLS和HTTP数据包以及UDP数据包。捕获的流量可以保存到PCAP文件中。
总结
SNI,即服务器名称指示,是TLS协议的扩展。它允许在握手过程开始时通过客户端告诉服务器正在连接的主机名称,从而解决一个服务器拥有多个域名的情况。
在TLS握手信息中并没有携带客户端要访问的目标地址,导致当一台服务器有多个虚拟主机,且每个主机的域名不一样,使用了不一样的证书时,不知道和哪台虚拟主机进行通信。而SNI允许Web服务器通过SSL或TLS握手的扩展在单个IP地址上托管多个站点,从而使得HTTPS网站具有唯一的TLS证书,即使它们位于共享IP地址上。使用SNI时,服务器的主机名包含在TLS握手中,这使得HTTPS网站具有唯一的TLS证书,即使它们位于共享IP地址上也是如此。
Welcome to follow WeChat official account【程序猿编码】
参考:RFC 4366、RFC 2616
相关文章:

Server Name Indication(SNI),HTTP/TLS握手过程解析
Server Name Indication(SNI)是一种TLS扩展,用于在TLS握手过程中传递服务器的域名信息。在未使用SNI之前,客户端在建立TLS连接时只能发送单个IP地址,并且服务器无法知道客户端请求的具体域名。这导致服务器需要使用默认…...

react项目实现文件预览,比如PDF、txt、word、Excel、ppt等常见文件(腾讯云cos)
使用腾讯云文档预览,需要开通文档预览功能,该功能需要收费的。 使用限制 如果需要图片预览、视频或音频可以使用获取下载链接。 页面代码 <button onClick() > {handleClick(myself/文档.xlsx)}>预览</button><div style{{ height:…...

ES SearchAPI----Query DSL语言
文章目录 Getting Startedmatch_all查询全部sort排序from\size分页_source指定字段 match匹配查询match_phrase短语匹配multi_match多字段匹配range范围查询bool复合查询must必须匹配,可贡献得分must_not必须不匹配,可贡献得分should可有可无,…...
【STM32】HAL库——串口中断只接收到两个字符
【STM32】HAL库——串口中断只接收到两个字符 一、问题描述二、解决方法三、原因分析 一、问题描述 环境:STM32CubeMX(6.7.0)MDK-ARM(V5.36.0.0)STM32F103C8T6 使用XCOM发送字符串(总共8个字符),单片机进行解析为ModBus协议失败…...
页面html结构导出为word或pdf
一、使用场景和原理 需要将当前页面(一般详情页面)或者dom容器中的内容保存/截图,并且导出为word或者pdf 导出word:获取dom结构直接转化为word导出 导出pdf:用canvas生成当前页面或者dom范围的快照,参考截图功能,然后将生成的canvas转为pdf内…...
Object.prototype.toString.call() 和 instanceOf 和 Array.isArray() 详解
解析: 理解 Object.prototype.toString.call(), instanceof, 和 Array.isArray() 是 JavaScript 中重要的类型检查工具。以下是一个较为详细的解释和示例代码,帮助你理解它们的工作原理和使用场景 Object.prototype.toString.call(): Object.prototyp…...

自学(黑客技术)方法——网络安全
如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…...

CVE-2023-46227 Apache inlong JDBC URL反序列化漏洞
项目介绍 Apache InLong(应龙)是一站式、全场景的海量数据集成框架,同时支持数据接入、数据同步和数据订阅,提供自动、安全、可靠和高性能的数据传输能力,方便业务构建基于流式的数据分析、建模和应用。 项目地址 h…...
MySQL几种方法的数据库备份
MySQL几种方法的数据库备份_mysql备份的几种方式-CSDN博客 MySQL有几个方法来备份 最近博客一直想写点。可是不知道写什么,感觉自己近期的知识没有什么添加,今天想到了一篇能够写的博客。曾经试过依据data目录备份MySQL。可是从来没有成功过。前几天帮助…...

CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集
CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集 CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集安装DockerGitLabGitLab-Runner阿里云容器仓库 GitLab-CIJava微服务的GitLab-CI应用 CI/CD:GitLab-CI 自动化集成/部署 JAVA微服…...

Flask 上传文件,requests通过接口上传文件
这是一个使用 Flask 框架实现文件上传功能的示例代码。该代码定义了两个路由: /upload:处理文件上传请求。在该路由中,我们首先从请求中获取上传的文件,然后将文件保存到本地磁盘上,并返回一个字符串表示上传成功。 /…...

kvm webvirtcloud 如何添加直通物理机的 USB 启动U盘
第一步:查看USB设备ID 在物理机上输入 lsusb 命令 rootubuntu:/media/usb1# lsusb Bus 002 Device 002: ID 0781:5581 SanDisk Corp. Ultra Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2514 Microchip Technolo…...
html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法
html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法 首先明确我们的目标, 就是a标签包裹的内容, 都能点击后以后直接跳转 可以通过更改html结构和css解决: <div v-for"(item, index) in newsData" :key"index" class"flexcol">&…...
Halcon转OpenCV实例--保险丝颜色识别(附源码)
导 读 本文主要介绍Halcon转OpenCV实例--保险丝颜色识别(附源码)。 实例来源 实例来源于Halcon例程color_fuses.hdev--classify fuses by color 下面是Halcon实例代码和实现效果: * color_fuses.hdev: classify fuses by colordev_update_window (off)* ***** step: set up …...

制造业中的微小缺陷检测——应用场景分析与算法选择(YoloV8/CANet)
一、缺陷检测任务 缺陷检测的任务通常可以分为三个主要阶段,包括缺陷分类、缺陷定位和缺陷分割。 1.缺陷分类 缺陷分类是检测过程的第一步,目的是将检测到的缺陷区域分类为不同的类别,通常是根据缺陷的性质或类型进行分类。分类的类别包括…...

支持多校 微信课表小程序源码 排课小程序源码 支持导入课表 情侣课表 背景设置
练手Lab课程表小程序源码是一个基于thinkphp系统进行开发的前后端分离系统。 源码功能介绍 1、情侣功能 2、情侣间留言 3、情侣间互相设置课程表背景 4、自己日、周课程表背景设置 5、教务系统课程表导入 6、导入别人分享的课表 7、导入别人分享的单课 8、多校支持 9…...

谷歌计划从Chrome119起测试IP隐私保护功能
目前,谷歌正为Chrome浏览器测试一项新的“IP保护”功能。因为该公司认为用户IP地址一旦被黑客滥用或秘密跟踪,都可能导致用户隐私信息泄露。 而这项功能可通过代理服务器屏蔽用户的IP地址,以增强用户的隐私性,这样就可以尽量在确…...

【技能树笔记】网络篇——练习题解析(九)
目录 前言 一、OSPF双栈 1.1 OSPFv3 LSA 1.2 OSPFv3 二、ISIS双栈 2.1 ISISv6 2.2 ISIS高级特性 三、BGP双栈 四、PIM双栈 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filot…...

c++ qt连接操作sqlite
qt客户端编程,用到数据库的场景不多,但是部分项目还是需要数据库来保存同步数据,客户端用到的数据库,一般是sqlite。 Qt提供了数据库模块,但是qt本身的数据库模块并不好用,会有各种问题, 建议大家不要,可以自己封装数据库的操作。本篇博客介绍qt连接操作sqlite。 sqlit…...

Qt之自定义QStringListModel设置背景色和前景色
一.效果 二.实现 QStringListModel里只实现了Qt::EditRole和Qt::DisplayRole,不能直接设置背景色和前景色,所以我们要继承QStringListModel,重写其中的data和setData方法,使其支持Qt::ForegroundRole和Qt::BackgroundRole。 QHStringListModel.h #ifndef QHSTRINGLISTMO…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...