探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作

实验环境

IP角色
192.168.1.100客户端请求IP
192.168.1.100python 启动的HTTP服务
192.168.1.102nginx服务
192.168.1.103haproxy 服务

HTTP服务

这是一个简单的HTTP服务,主要打印HTTP报文用于分析客户端IP

#!/usr/bin/env python
# coding: utf-8import socket
from threading import Thread# 创建socket对象
sock_srv = socket.socket()# 绑定IP和port
sock_srv.bind(('0.0.0.0', 5001))# 开启服务
sock_srv.listen()# 定义一个函数, 处理来自客户端链接的处理
def socket_deal(conn: socket.socket, address: tuple):# 通过socket获取客户端的IP; 这里的客户端IP其实指的是TCP报文中的原始IP和原始Port# 就是上一个发起TCP发起的地址 print(address)# 打印HTTP的报文print(conn.recv(1024).decode())# 不做特殊处理,所有的请求均返回Hello Wordtemplate = """
HTTP/1.1 200 OK
Service: HTTP
Version: 1.1.2.2<h1>hello word</h1>"""conn.send(template.encode())# 关闭此次HTTP的请求conn.close()while True:# 接受Client的数据请求conn, address = sock_srv.accept()Thread(target=socket_deal, args=(conn, address)).start()

Nginx报文分析

nginx 4层代理

  • 配置启动4层代理, 并请求 http://192.168.1.102 并观察 101 的请求信息
stream {server {listen 80 ;proxy_pass 192.168.1.100:5001;  		# Python的HTTP服务# proxy_protocol on;					# 可选性, 4层携带真实IP}
}
  • 客户端请求4层转发,默认不传递客户端IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52842)# 得到HTTP的报文信息如下
GET / HTTP/1.1
Host: 192.168.1.102
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求4层转发,要求传递客户端IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52848)# 得到HTTP的报文信息如下,多了一行PROXY。其余信息不变
PROXY TCP4 192.168.1.100 192.168.1.102 55360 80
GET / HTTP/1.1
Host: 192.168.1.102
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

nginx 7层代理

  • 配置文件
server {                                                                           listen       80;                                                               server_name  localhost;                                                        location / {                                                                   proxy_pass http://192.168.1.100:8000/;                                                                         # proxy_set_header X-Forwarded-For $remote_addr;   # nginx 去掉注释请求携带客户端真实IP                                }                                                                              }
  • 客户端请求7层代理,默认不传递客户端IP真实IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52854)# 得到HTTP的报文信息如下.
GET / HTTP/1.0
Host: 192.168.1.100:5001
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求7层,要求传递客户端IP真实IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52858)# 得到HTTP的报文信息如下,多了一行PROXY。其余信息不变
GET / HTTP/1.0
Host: 192.168.1.100:5001
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
X-Forwarded-For: 192.168.1.100

分析NGINX获取客户端IP方法

方式修改header信息是否修改原始报文获取客户端IP方式
4层转发不带客户端IP不修改不修改服务端可以获取上一层发起请求的socket 源IP, 但不是客户端真实IP
4层转发携带客户端IP不修改原始报文前增加PROXY格式内容通过PROXY内容可以获取客户端IP
7层转发不带客户端IP不修改nginx重新封装HTTP报文服务端 socket 获取
7层转发携带客户端IPnginx 通过增加header信息传递客户端IPnginx重新封装HTTP报文通过nginx封装的报文获取XFF
  1. 7层代理会对报文进行重新封装,封装过程中可以通过增加XFF的header传递客户端IP。

  2. 4层转发不会修改报文。在不修改HTTP报文前提下,前置补充代理信息, 格式: PROXY TCP 客户端IP 代理端IP 客户端端口 代理端端口

Haproxy 代理分析

Haproxy 4层代理

  • 配置
defaultsmode                    tcpfrontend  main *:80default_backend             appbackend appbalance     roundrobinserver  app1 192.168.1.100:5001 check # 不携带真实IP# server  app1 192.168.1.100:5001 send-proxy check  # 携带真实IP
  • 客户端请求4层转发,默认不要求传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 56790)# 这个信息和NGINX 4层信息一样
GET / HTTP/1.1
Host: 192.168.1.103
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求4层转发,要求传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 58410)# 与Nginx 4层带真实IP一样, 报文之前增加了PROXY信息
PROXY TCP4 192.168.1.100 192.168.1.103 57871 80
GET / HTTP/1.1
Host: 192.168.1.103
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

Haproxy 7层代理

  • 配置
defaultsmode                    httpoption forwardfor       except 127.0.0.0/8   # 默认携带客户端IP,frontend  main *:80default_backend             appbackend appbalance     roundrobinserver  app1 192.168.1.100:5001 check 
  • 客户端请求7层代理,默认传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 53178)# 与Nginx 7层带客户端IP一样, 报文包含X-Forwarded-For
GET /favicon.ico HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.1.103/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
X-Forwarded-For: 192.168.1.100
Connection: close
  • 客户端请求7层代理,注释不传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 53576)# 与Nginx 7层不传递客户端IP一样, 报文包含没有X-Forwarded-For
GET / HTTP/1.1
Host: 192.168.1.103
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

分析Haproxy获取客户端IP方法

其实和nginx一样

方式修改header信息是否修改原始报文获取客户端IP方式
4层转发不带客户端IP不修改不修改服务端可以获取上一层发起请求的socket 源IP, 但不是客户端真实IP
4层转发携带客户端IP不修改原始报文前增加PROXY格式内容通过PROXY内容可以获取客户端IP
7层转发不带客户端IP不修改nginx重新封装HTTP报文服务端 socket 获取
7层转发携带客户端IPnginx 通过增加header信息传递客户端IPnginx重新封装HTTP报文通过nginx封装的报文获取XFF

案例小结

上述操作主要是完成: Nginx和Haproxy两款服务分别完成: 4层转发和7层代理。 携带IP与不携带客户端IP配置上的区别和报文展示

转发方式传递方式特点
7层代理增加HTTP报文的header信息X-Forwarded-For, 进行传递客户端IP在原始报文进行修改
4层代理在HTTP报文前方附加一层PROXY信息, 进行传递客户端IP不修改原始报文,在报文前方附加数据

在这里插入图片描述

附伪代码获取客户端IP

#!/usr/bin/env python
# coding: utf-8
import socket
from threading import Thread# 创建socket对象
sock_srv = socket.socket()# 绑定IP和port
sock_srv.bind(('0.0.0.0', 5001))# 开启服务
sock_srv.listen()# 简单的Response结构
def response(content, status, msg, conn):template = """
HTTP/1.1 %d %s
Service: HTTP
Version: 1.1.2.2
Content-Type: text/html; charset=UTF-8
Connection: close%s  """ % (status, msg, content)return conn.send(template.encode())# 定义一个函数, 处理来自客户端链接的处理
def socket_deal(conn: socket.socket, address: tuple):try:# 通过socket获取客户端的IP; 这里的客户端IP其实指的是TCP报文中的原始IP和原始Port# 就是上一个发起TCP发起的地址_client_ip, _client_port = addressdata = conn.recv(1024).decode()# 打印HTTP的报文_data_lines = data.splitlines()# 代理模式_proxy_type = "可能HTTP代理"# header 信息收集extend_data = ["header信息", ]for line in _data_lines:# 如果4层传递客户端IP,会得到如下信息。if line.startswith('PROXY'):# PROXY TCP4 192.168.1.100 192.168.1.102 55360 80_, protocol, _c_ip, _p_ip, _c_port, _p_port = line.split()if protocol != 'TCP4':response("PROXY ERROR", 500, "PROXY_ERROR", conn)else:_proxy_type = "TCP代理"_client_ip = _c_ip# 有时候报文只收到PROXY信息, 就需要第二次接收报文信息if len(_data_lines) == 1:socket_deal(conn, (_c_ip, _c_port))return# 如果一次性收完报文信息则继续处理else:continueif ":" not in line:# 不是K:V 形式,那不是header。 可能是post数据, 也可能是HTTP协议。 此处忽略continue# 拿到header信息header_key, header_value = [item.strip() for item in line.split(":", 1)]if header_key == 'X-Forwarded-For':_client_ip = header_value# header 信息入库extend_data.append(":".join((header_key, header_value)))content = ["真实的客户端IP可能是" + _client_ip, "<br />"]content.extend(extend_data)response("<br />".join(content), 200, 'ok', conn)except Exception as e:print(e)finally:# 关闭此次HTTP的请求conn.close()while True:# 接受Client的数据请求conn, address = sock_srv.accept()Thread(target=socket_deal, args=(conn, address)).start()

实践: NGINX与HAProxy结合使用。

准备环境

IP角色标记说明
192.168.1.100客户端请求IPclient浏览器请求4层转发到后端HTTP服务
192.168.1.102NGINX实现提供4层转发NGINX-PROXY转发到104服务器
192.168.1.103Haproxy提供4层转发HAProxy4层转发到102的7层
192.168.1.104NGINX 7层服务NGINX-HTTP代表HTTP服务器。直接返回,并观察日志
  1. 启动一台NGINX HTTP服务器,扮演正常访问的网站。 代号NGINX-HTTP
  2. 另启动一台NGINX服务器,实现四层转发功能到NGINX HTTP服务器,代号NGINX-PROXY
  3. 启动一台HAProxy服务器,实现四层转发功能到NGINX HTTP服务器,代号HAProxy
  4. 在客户端分别访问NGINX-PROXY和HAProxy, 并采集NGINX-HTTP的日志
  5. 在NGINX-PROXY和HAProxy交叉请求CURL,并携带Header信息: X-FORWARDED-FOR, 并采集NGINX-HTTP的日志
  6. PROXY-PROTOCOL, 是四层转发开启携带真实IP补充协议,该协议补充在HTTP报文之前 参考文档

NGINX-HTTP服务器

  • HTTP服务主要配置
  • 因为4层转发携带了真实IP后, NGINX收到的不再是一个纯粹的HTTP报文。 所以需要在NGINX服务开启如下设置。 参考文档

http {# r:访问IP, 也就是代理端IP。 # P: PROXY-PROTOCOL的IP,也就是4层转发携带的补充报文的IP,也就是客户端IP。 # xff: 藏在Header中的X-Forwarded-For的IP。log_format  proxy_protocol_log  'r: $remote_addr p: $proxy_protocol_addr xff: $http_x_forwarded_for';server {access_log logs/proxy_protocol_access.log proxy_protocol_log;	# 观察IP: 访问IP,代理IP,XFFerror_log logs/proxy_protocol_error.loglisten       80 ;               		# 接收HTTP报文走80端口                                        listen       8000 proxy_protocol;     	# PROXY PROTOCOL 走8000端口,PROTOCOL 是通过四层转发获取真实IP的补充协议               server_name  localhost;   location / {root html;index index.html;}}
}

NGINX-PROXY服务器

关键配置

stream {server {listen 80 ;proxy_protocol on; 	# 需要开启使用PROXY PROTOCOL协议。proxy_pass 192.168.35.253:8000;}
}

浏览器访问, NGINX-HTTP(192.168.1.104)输出日志信息

tail logs/proxy_protocol_access.log
r: 192.168.33.250 p: 192.168.33.254 xff: -

CURL访问,NGINX-HTTP(192.168.1.104)输出日志信息

tail logs/proxy_protocol_access.log
r: 192.168.33.250 p: 192.168.35.252 xff: 192.168.1.199

HAProxy服务器

关键配置

defaultsmode  tcpbackend appbalance     roundrobinserver  app1 192.168.35.253:8000 send-proxy  	# send-proxy 开启支持PROXY-PROTOCOL

浏览器访问, NGINX-HTTP(192.168.1.104)输出日志信息

tail -f logs/proxy_protocol_access.log
r: 192.168.35.252 p: 192.168.33.254 xff: -

CURL访问,NGINX-HTTP(192.168.1.104)输出日志信息

tail -f logs/proxy_protocol_access.log
r: 192.168.35.252 p: 192.168.33.250 xff: 192.168.1.199

再次小结

我们尝试结合常见配置结构进行验证。 可以初步发现

  1. 4层转发携带客户端IP是需要使用PROPXY-PROTOCOL协议支持。客户端IP会补充在这个协议内
  2. 作为4层转发端,因为4层转发不修改报文,所以在HTTP报文前添加PROPXY-PROTOCOL信息。
    • 4层转发服务器需要开启 protocol 支持发送PROXY-PROTOCOL+HTTP的混淆报文结构
    • 4层目标服务器需要开启 protocol 支持接收PROXY-PROTOCOL+HTTP的混淆报文结构
  3. 使用补充PROXY-PROTOCL后,HTTP的报文不在是一个纯粹的报文结构,所以作为服务网端NGINX开启了两种模式
    • listen 80; 支持处理普通HTTP请求,
    • listen 80 protocol; 支持处理PROXY-PROTOCOL + HTTP报文的形式。这也是四层代理携带IP的特有形式
  4. 在选择HTTP服务器时,需要考虑HTTP服务是否支持PROXY-PROTOCOL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368292.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java-数据结构与算法-02-数据结构-02-链表

文章目录 1. 概述2. 单向链表3. 单向链表&#xff08;带哨兵&#xff09;4. 双向链表&#xff08;带哨兵&#xff09;5. 环形链表&#xff08;带哨兵&#xff09;6. 习题E01. 反转单向链表-Leetcode 206E02. 根据值删除节点-Leetcode 203E03. 两数相加-Leetcode 2E04. 删除倒数…

C++必修:深入理解继承与虚继承

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 继承的概念与定义 1.1. 继承的概念 继承(inheritance)机制是面向对象程序设计…

上位机网络通讯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…

昇思学习打卡-5-基于Mindspore实现BERT对话情绪识别

本章节学习一个基本实践–基于Mindspore实现BERT对话情绪识别 自然语言处理任务的应用很广泛&#xff0c;如预训练语言模型例如问答、自然语言推理、命名实体识别与文本分类、搜索引擎优化、机器翻译、语音识别与合成、情感分析、聊天机器人与虚拟助手、文本摘要与生成、信息抽…

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道&#xff0c;…

实验九 存储过程和触发器

题目 创建并执行一个无参数的存储过程proc_product1&#xff0c;通过该存储过程可以查询商品类别名称为“笔记本电脑”的商品的详细信息&#xff1a;包括商品编号、商品名称、品牌、库存量、单价和上架时间信息 2、创建并执行一个带输入参数的存储过程proc_product2&#xff…

(PC+WAP)高端大气的装修装潢公司网站模板

(PCWAP)高端大气的装修装潢公司网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于装修公司网站、装潢公司网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;(PCWAP)&#xff0c;同一个后台&#xff0c;数据即…

设计模式-代理模式和装饰者模式

二者都是结构型的设计模式. 1.代理模式 1.1定义 为其他对象提供一种代理以控制对这个对象的访问. 代理从code实现方面分为静态代理和动态代理两种&#xff1b; 从适用范围来看,分为远程代理,虚拟代理,保护代理,智能引用几种. 远程代理:为某个对象在不同的内存地址空间提供…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

爬虫是什么?

目录 1.什么是互联网爬虫&#xff1f; 2.爬虫核心? 3.爬虫的用途? 4.爬虫分类&#xff1f; 5.反爬手段&#xff1f; 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

sql-语句

文章目录 SQL语句的学习sql是什么sql的内置命令sql的种类sql mode库&#xff0c;表属性介绍&#xff1a;字符集&#xff0c;存储引擎列的数据类型&#xff1a;数字&#xff0c;字符串&#xff0c;时间列的约束DDL: 数据定义语言库表 Online DDL(ALGORITHM) *DML :数据操纵语言资…

Build a Large Language Model (From Scratch)附录E(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

养老院人员定位系统如何实现

养老院人员定位系统应反应养老公寓情况、增加老人安全防范级别、加强安全保障措施&#xff0c;部署物联网设备及配套集成平台软件&#xff0c;实时定位人员信息及时反应老人救助行为&#xff0c;实现与视频、门禁一卡通等自动化监管设施联合动作&#xff0c;提高应急响应速度和…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界&#xff1a;智能助手不再驻留在云端&#xff0c;而是驻留在你的手机上&#xff0c;无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff1b;这是小型语言模型 (SLM) 的前景&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变我们与…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代&#xff0c;视频已成为信息传递和娱乐消遣的重要媒介。然而&#xff0c;视频带来的愉悦体验背后&#xff0c;是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间&#xff0c;上传和下载也变得异常缓慢。那么&#xff0c;如何才能有效压缩视频&#xff0c;…

The Plant Cell:DAP-seq技术助力揭示MdWRKY75调控苹果耐热性的分子机制

2024年6月12日&#xff0c;西北农林科技大学作物抗逆与高效生产全国重点实验室/园艺学院苹果抗逆与品质改良创新团队马锋旺教授/李超课题组在植物学知名期刊The Plant Cell&#xff08;影响因子10&#xff09;在线发表了题为“The MdHSC70-MdWRKY75 module mediates basal appl…

图书电商引入实在Agent:自动化运营提效80%,节省人天1000+

某知名教辅图书品牌深耕中小学教辅图书领域&#xff0c;是中国最具影响力的教育出版策划与发行集团之一&#xff0c;以丰富的图书品类&#xff0c;满足了小学、初中、高中各年龄段读者多元化的阅读需求。 2023年&#xff0c;该品牌在运营、客服等多部门超60个场景中部署实在Ag…

学习LLM的随笔

1、信息量、信息熵、交叉熵和困惑度 注&#xff1a;因为真实分布的概率为1&#xff0c;所以在分类任务中交叉熵可以简化为上述形式。 &#xff08;1&#xff09;信息熵&#xff1a;信息熵中使用 l o g 2 ( p ( x ) ) log_2(p(x)) log2​(p(x)) 来表示对 x x x 编码需要的…

找不到msvcr110.dll是怎么回事?彻底解决msvcr110.dll丢失的方法

当您的电脑提示遇到msvcr110.dll丢失时&#xff0c;您知道如何解决此问题吗&#xff1f;事实上&#xff0c;解决此类dll文件丢失的问题相对较为简单。只要我们深入了解msvcr110.dll丢失的具体情况&#xff0c;便可轻松解决此问题。以下为您介绍msvcr110.dll修复方法。 一&#…