返回顶部
首页 > 资讯 > 后端开发 > Python >pluto实现分析(3)
  • 682
分享到

pluto实现分析(3)

pluto 2023-01-31 01:01:58 682人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

  本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 严禁用于任何商业用途。msn: yfydz_no1@hotmail.com来源:Http://yfydz.cublog.cn 5.

 
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:Http://yfydz.cublog.cn

5. 系统一些主要数据结构

5.1 SA ID
 

// IP地址结构
typedef struct {
// V4和V6地址的联合
 uNIOn {
  struct sockaddr_in v4;
  struct sockaddr_in6 v6;
 } u;
} ip_address;

 
// 子网结构
typedef struct {
// 地址
 ip_address addr;
// 掩码位数
 int maskbits;
} ip_subnet;


#ifdef __KERNEL__
typedef __u32 ipsec_spi_t;
#else
typedef u_int32_t ipsec_spi_t;
#endif
// 包含3项: 目的地址, SPI和协议
typedef struct {  
        ip_address dst;  
        ipsec_spi_t spi; 
#  define SPI_PASS 256 
#  define SPI_DROP 257 
#  define SPI_REJECT 258 
#  define SPI_HOLD 259
#  define SPI_TRAP 260
#  define  SPI_TRAPSUBNET  261
 int proto;  
#  define SA_ESP 50 
#  define SA_AH 51 
#  define SA_IPIP 4 
#  define SA_COMP 108 
#  define SA_INT 61 
} ip_said;

5.2 连接(connection)

连接用于描述建立IPSec通道的连接信息, 参数直接的配置文件中配置, 连接可以是静态的, 也就是
两端地址等信息都是固定; 也可以是动态的, 也就是连接一方可以先不固定地址, 这时的连接只相当
于一个模板, 只有当真正有连接建立时再建立具体的连接实例。
struct connection {
// 连接名称
    char *name;
// 策略
    lset_t policy;
// IKE生命期
    time_t sa_ike_life_seconds;
// IPSEC连接生命期
    time_t sa_ipsec_life_seconds;
// 重协商间隔时间
    time_t sa_rekey_margin;
//
    unsigned long sa_rekey_fuzz;
// 重协商尝试次数
    unsigned long sa_keying_tries;
   
   
// DPD检查间隔时间
    time_t          dpd_delay;             
// DPD判断对方死亡时间,dpd_delay*dpd_tries
    time_t          dpd_timeout;           
// DPD对方死亡后判断操作
    enum dpd_action dpd_action;            
   
// 强制使用UDP封装(NAT穿越)
    bool               forceencaps;        
   
// 日志文件名称
    char              *log_file_name;      
// 日志文件流指针
    FILE              *log_file;           
    CIRCLEQ_ENTRY(connection) log_link;    
// 日志文件是否错误
    bool               log_file_err;       
// 安全策略路由
    struct spd_route spd;
   
// 实例序号, 有的连接是那种动态通配连接,开始时并没有明确的IP地址,只有连接时才建立实例
    unsigned long instance_serial;
// 策略优先权
    policy_prio_t prio;
// 实例初始化正确标志
    bool instance_initiation_ok; 
// 连接类型
    enum connection_kind kind;
// 网卡
    const struct iface_port *interface; 
// 是否已经初始化标志
    bool initiated;
// 与连接相关的状态的序列号
    so_serial_t 
 newest_isakmp_sa,
 newest_ipsec_sa;

#ifdef DEBUG
    lset_t extra_debugging;
#endif
   
// 地址协议族:V4, V6
    sa_family_t addr_family;  
// 通道内封装的地址的协议族
    sa_family_t tunnel_addr_family; 
// 下一策略
    struct connection *policy_next;
// 网关信息指针
    struct gw_info *gw_info;
// ESP使用算法名称
    char                *alg_esp;   
// IKE使用算法名称
    char                *alg_ike;   
// ESP算法信息
    struct alg_info_esp *alg_info_esp;
// IKE算法信息
    struct alg_info_ike *alg_info_ike;
// 主机对
    struct host_pair *host_pair;
// 主机对链表
    struct connection *hp_next; 
// 下一个连接
    struct connection *ac_next; 
// 证书信息   
    generalName_t *requested_ca; 
#ifdef XAUTH_USEPAM
// PAM认证句柄
    pam_handle_t  *pamh;  
#endif
};

// 安全策略路由结构
struct spd_route {
// 链表下一项
    struct spd_route *next;
// 本地和对方的端点信息
    struct end this;
    struct end that;
// 所有者
    so_serial_t eroute_owner;
// 路由状态类型
    enum routing_t routing; 
// 请求ID
    uint32_t reqid;
};

// 端点结构
struct end {
// 端点ID值,可为地址,也可以是一个字符串
    struct id id;
// 端点地址, 下一跳(网关)地址, 源地址
    ip_address
 host_addr,
 host_nexthop,
 host_srcip;
// 内部子网
    ip_subnet client;
// 一些标志
// 从DNS服务器获取key   
    bool key_from_DNS_on_demand;
// 存在子网
    bool has_client;
// 有通配子网
    bool has_client_wildcard;
// 有通配端口
    bool has_port_wildcard;
// 有通配ID
    bool has_id_wildcards;
// 启动停止命令文件
    char *updown;
// IKE端口
    u_int16_t host_port; 
// 指定了IKE端口
    bool      host_port_specific;
// 端口
    u_int16_t port;  
// 协议
    u_int8_t protocol;         
// 证书
    cert_t cert;  
// CA的名称
    chunk_t ca;   
// 属性表
    struct ietfAttrList *groups;
// smartcard
    smartcard_t *sc;  
#ifdef VIRTUAL_IP
// 虚拟IP(一般用于×××客户端)
    struct virtual_t *virt;
#endif
// 是XAUTH的服务器端
    bool xauth_server;
// 是XAUTH的客户端
    bool xauth_client;
// 是设置配置的服务器端, 可向客户端提供虚拟IP,DNS,WINS等参数
    bool modecfg_server;       
// 是设置配置的客户端
    bool modecfg_client;       
// 发送证书类型
    enum certpolicy sendcert;  
};

// ID结构
struct id {
// 类型
    int kind;  
// 地址
    ip_address ip_addr; 
// ID名称
    chunk_t name; 
   
};
 
5.2 状态(state)

状态是用于描述连接建立过程中的各种中间阶段,

struct state
{
// 状态序号
    so_serial_t        st_serialno;         
// 父状态序号
    so_serial_t        st_clonedfrom;       
// 状态使用数
    int                st_usage;
// 相关的连接指针
    struct connection *st_connection;         
// 与whack通信的接口描述符
    int                st_whack_sock;         
// 缓期的消息摘要
    struct msg_digest *st_suspended_md;       
// Oakley(主模式)转换属性参数
    struct oakley_trans_attrs st_oakley;
// AH协议信息
    struct ipsec_proto_info st_ah;
// ESP协议信息
    struct ipsec_proto_info st_esp;
// IP压缩协议信息
    struct ipsec_proto_info st_ipcomp;
#ifdef KLIPS
// 进入方向的SPI
    ipsec_spi_t        st_tunnel_in_spi;         
// 发出方向的SPI
    ipsec_spi_t        st_tunnel_out_spi;        
#endif
// 阶段2中使用的oakley组
    const struct oakley_group_desc *st_pfs_group;
// DOI解释域
    u_int32_t          st_doi;                
// 状况
    u_int32_t          st_situation;
// IPSEC SA策略
    lset_t             st_policy;             
// 对端地址
    ip_address         st_remoteaddr;         
// 对端的端口
    u_int16_t          st_remoteport;         
// 网卡   
    const struct iface_port *st_interface;    
// 本地地址和端口
    ip_address         st_localaddr;          
    u_int16_t          st_localport;          
// 消息ID
    msgid_t            st_msgid;              
// 消息ID
    msgid_t            st_msgid_phase15;      
    msgid_t            st_msgid_phase15b;     
   
// 使用的消息ID链表
    struct msgid_list  *st_used_msgids;       
 
// 发起方公共值
    chunk_t            st_gi;                 
// 发起方cookie
    u_int8_t           st_icookie[COOKIE_SIZE];
// 发起方时间
    chunk_t            st_ni;                 
 
// 接收方公共值
    chunk_t            st_gr;                 
// 接收方cookie
    u_int8_t           st_rcookie[COOKIE_SIZE];
// 接收方时间
    chunk_t            st_nr;                 

 
// 发送的包数
    chunk_t            st_tpacket;            
   
// 本地定义的协议和端口信息
    u_int8_t           st_myuserprotoid;      
    u_int16_t          st_myuserport;
 
// 接收的包数
    chunk_t            st_rpacket;            
   
// 对方的协议和端口信息
    u_int8_t           st_peeruserprotoid;    
    u_int16_t          st_peeruserport;

// 使用的密钥数
    u_int8_t           st_sec_in_use;     
// 本地秘密
    MP_INT             st_sec;            
// 本地秘密的备份
    chunk_t            st_sec_chunk;      
// 共享密钥
    chunk_t            st_shared;             
// 优先权
    enum crypto_importance st_import;         
   
// 对方的公钥
    struct pubkey     *st_peer_pubkey;
// 状态类型
    enum state_kind    st_state;              
// 重发数量
    u_int8_t           st_retransmit;         
// 重协商尝试次数
    unsigned long      st_try;                
                                              
// 有效时间
    time_t             st_margin;             
// 输出包数统计
    unsigned long      st_outbound_count;     
// 已经持续时间
    time_t             st_outbound_time;      
// 是否需要加密
    bool               st_calculating;        
// 阶段1的发起方进行哈希的SA载荷
    chunk_t            st_p1isa;              
// KEY ID
    chunk_t            st_skeyid;             
    chunk_t            st_skeyid_d;           
    chunk_t            st_skeyid_a;           
    chunk_t            st_skeyid_e;           
// 加密用的初始化向量
    u_char             st_iv[MAX_DIGEST_LEN]; 
// 老的初始化向量
    u_char             st_old_iv[MAX_DIGEST_LEN]; 
    u_char             st_new_iv[MAX_DIGEST_LEN];
// 阶段1的初始化向量
    u_char             st_ph1_iv[MAX_DIGEST_LEN];
// 各种初始化向量长度
    unsigned int       st_iv_len;
    unsigned int       st_old_iv_len;
    unsigned int       st_new_iv_len;
    unsigned int       st_ph1_iv_len;
// 加密密钥
    chunk_t            st_enc_key;            
// 状态链表的下一项和前一项
    struct state      *st_hashchain_next;     
    struct state      *st_hashchain_prev;     
// 内部参数
    struct {
// 接收到的错误数据包数
        unsigned int   st_malfORMed_received;
// 发送的错误数据包数
        unsigned int   st_malformed_sent;
// XAUTH客户端认证结束
 bool           st_xauth_client_done;
// XAUTH客户端认证尝试次数
 int            st_xauth_client_attempt;
// 模式配置服务器端处理结束
        bool           st_modecfg_server_done;
// 配置参数已经设置标志
        bool           st_modecfg_vars_set;
// 已经获得证书请求标志
 bool           st_Got_certrequest;
// 模式配置启动标志
        bool           st_modecfg_started;
// 密钥ID已经计算标志
 bool           st_skeyid_calculated;
// 对方支持DPD标志
 bool           st_dpd;                
// 本地是否使用DPD标志
 bool           st_dpd_local;       
// 是否已经在日志中记录了算法标志
 bool           st_logged_p1algos;     
// NAT穿越参数
 u_int32_t      st_nat_traversal;      
// NAT前的地址
 ip_address     st_nat_oa;
// NAT后的地址
 ip_address     st_natd;
    } hidden_variables;                       
// XAUTH用户名
    unsigned char *st_xauth_username;
   
// 上次DPD时间
    time_t              st_last_dpd;           
// DPD包序号
    u_int32_t           st_dpd_seqno;          
// 期待的DPD包序号
    u_int32_t           st_dpd_expectseqno;    
// 对方的DPD序号
    u_int32_t           st_dpd_peerseqno;      
// DPD事件
    struct event        *st_dpd_event;         
// 看到的提供者ID
    u_int32_t       st_seen_vendorid;  
// 不同IPSEC实现互连时的一些错误信息
    struct isakmp_quirks quirks;         
   
};
 

// Oakley(第一阶段/主模式)转换和属性结构
struct oakley_trans_attrs {
// 加密算法
    u_int16_t encrypt;  
// 密钥长度
    u_int16_t enckeylen; 
// 加密算法描述结构
    const struct encrypt_desc *encrypter; 
// 哈希算法
    oakley_hash_t hash;  
// 哈希算法描述结构
    const struct hash_desc *hasher; 
// 认证算法
    oakley_auth_t auth;  
#ifdef XAUTH
// XAUTH认证
    u_int16_t xauth;           
#endif
// Oakley组描述结构
    const struct oakley_group_desc *group; 
// 生存期, 时间限制
    time_t life_seconds; 
// 生存期, 数据量限制
    u_int32_t life_kilobytes; 
#if 0
// 伪随机函数算法
    u_int16_t prf;  
#endif
};
 

// IPSEC(第2阶段/快速模式)转换和属性结构
struct ipsec_trans_attrs {
// 转换ID
    u_int8_t transid; 
// SPI
    ipsec_spi_t spi; 
// 生存期, 时间限制
    time_t life_seconds;  
// 生存期, 数据量限制
    u_int32_t life_kilobytes; 
// 封装类型
    u_int16_t encapsulation;
// 认证类型
    ipsec_auth_t auth;           
// 密钥长度
    u_int16_t key_len;
// 密钥计算轮数
    u_int16_t key_rounds;
#if 0
    u_int16_t cmprs_dict_sz;
    u_int32_t cmprs_alg;
#endif
};


// IPSEC协议信息
struct ipsec_proto_info {
// 是否提供标志
    bool present; 
// IPSEC(第2阶段/快速模式)转换和属性结构
    struct ipsec_trans_attrs attrs;
// 本地SPI
    ipsec_spi_t our_spi;
// 密钥长度
    u_int16_t keymat_len; 
// 本地密钥
    u_char *our_keymat;
// 对方密钥
    u_char *peer_keymat;
};

// 事件结构
struct event
{
// 事件事件
    time_t          ev_time;
// 事件类型
    enum event_type ev_type;       
// 事件相关的状态结构
    struct state   *ev_state;      
// 事件链表的下一项
    struct event   *ev_next;       
};

5.4 内核接口相关结构


// pfkey协议信息
struct pfkey_proto_info {
// 协议
 int proto;
// 封装类型
 int encapsulation;
// 请求ID
 unsigned reqid;
};

// 内核SA结构
struct kernel_sa {
// 源地址
 const ip_address *src;
// 目的地址
 const ip_address *dst;
// 源子网
 const ip_subnet *src_client;
// 目的子网
 const ip_subnet *dst_client;
// SPI
 ipsec_spi_t spi;
// 协议
 unsigned proto;
// SA类型
 unsigned satype;
// 回放窗口
 unsigned replay_window;
// 请求ID
 unsigned reqid;

// 认证算法
 unsigned authalg;
// 认证算法密钥长度
 unsigned authkeylen;
// 认证密钥
 char *authkey;

// 加密算法
 unsigned encalg;
// 加密算法密钥长度
 unsigned enckeylen;
// 加密密钥
 char *enckey;

// 封装
 int encapsulation;
#ifdef NAT_TRAVERSAL
// NAT穿越的源端口,目的端口
 u_int16_t natt_sport, natt_dport;
// ID和类型
 u_int8_t transid, natt_type;
// NAT转换前原地址
 ip_address *natt_oa;
#endif
// SA ID
 const char *text_said;
};
 
// 内核操作结构
struct kernel_ops {
// 枚举类型
 enum {
// 内核不支持
         KERNEL_TYPE_NONE,
// 内核使用KLIPS实现IPSEC
  KERNEL_TYPE_KLIPS,
// 内核使用自带的native ipsec
  KERNEL_TYPE_linux,
 } type;
// 操作名称
 const char *opname;
// 是否存在进入方向的加密路由
 bool inbound_eroute;
// 使用有策略生存期限制
 bool policy_lifetime;
// 回放窗口
        int  replay_window;
 int *async_fdp;
// 初始化
 void (*init)(void);
// 登记
 void (*pfkey_reGISter)(void);
// 登记回应
 void (*pfkey_register_response)(const struct sadb_msg *msg);
// 队列处理
 void (*process_queue)(void);
// 处理消息
 void (*process_msg)(void);
// 原始加密路由处理
 bool (*raw_eroute)(const ip_address *this_host,
      const ip_subnet *this_client,
      const ip_address *that_host,
      const ip_subnet *that_client,
      ipsec_spi_t spi,
      unsigned int proto,
      unsigned int transport_proto,
      unsigned int satype,
      const struct pfkey_proto_info *proto_info,
      time_t use_lifetime,
      unsigned int op,
      const char *text_said);
// 增加SA
 bool (*add_sa)(const struct kernel_sa *sa, bool replace);
 bool (*grp_sa)(const struct kernel_sa *sa_outer,
         const struct kernel_sa *sa_inner);
// 删除SA
 bool (*del_sa)(const struct kernel_sa *sa);
// 获取SPI
 ipsec_spi_t (*get_spi)(const ip_address *src,
          const ip_address *dst,
          int proto,
          bool tunnel_mode,
          unsigned reqid,
          ipsec_spi_t min,
          ipsec_spi_t max,
          const char *text_said);
// 执行建立连接命令
    bool (*docommand)(struct connection *c
        , struct spd_route *sr
        , const char *verb
        , struct state *st);
};


// 加密路由信息
struct eroute_info {
// 包数
    unsigned long count;
// 本地子网
    ip_subnet ours;
// 对方子网
    ip_subnet his;
// 目的地址
    ip_address dst;
// SA ID
    ip_said said;
// 传输协议
    int         transport_proto;
// 链表下一项
    struct eroute_info *next;
};

5.5 密钥结构


// RSA公钥
struct RSA_public_key
{
// 密钥ID
    char keyid[KEYID_BUF]; 
   
// 长度
    unsigned k;
   
// 公钥参数
    MP_INT
 n, 
 e; 
};
// RSA私钥
struct RSA_private_key {
// 公钥结构, 因为私钥和公钥是对称的, 基本描述结构也相同
    struct RSA_public_key pub; 
// 私钥相关参数, 主要是一些内部私有数据
    MP_INT
 d, 
 
 p, 
 q, 
 dP, 
 dQ, 
 qInv; 
};


// 公开密钥结构
struct pubkey {
// ID结构
    struct id id;
// 使用数
    unsigned refcnt; 
// 认证层次
    enum dns_auth_level dns_auth_level;
// DNS签名
    char *dns_sig;
// 相关时间: 安装时间, 上次尝试时间, 上次工作时间, 到期时间
    time_t installed_time
 , last_tried_time
 , last_worked_time
 , until_time;
// 发布者
    chunk_t issuer;
// 公开密钥算法类型
    enum pubkey_alg alg;
// 公开密钥算法联合
    union {
// 目前只支持RSA这种公开密钥算法
 struct RSA_public_key rsa;
    } u;
};

// 公开密钥链表结构
struct pubkey_list {
    struct pubkey *key;
    struct pubkey_list *next;
};

...... 待续 ......

--结束END--

本文标题: pluto实现分析(3)

本文链接: https://lsjlt.com/news/184710.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pluto实现分析(3)
      本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 严禁用于任何商业用途。msn: yfydz_no1@hotmail.com来源:http://yfydz.cublog.cn 5....
    99+
    2023-01-31
    pluto
  • in_array的第3个参数实例分析
    本文小编为大家详细介绍“in_array的第3个参数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“in_array的第3个参数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用 in_array...
    99+
    2023-07-02
  • wifidog 源码初分析(3)
    上一篇分析了 接入设备 在接入路由器,并发起首次 HTTP/80 请求到路由器上时,wifidog 是如何将此 HTTP 请求重定向至 auth-server 的流程。 之后 接入设备 的浏览器接收到 wifidog 返回的 302 重定向...
    99+
    2023-01-31
    源码 wifidog
  • SpringMVC源码分析(3)Dis
    <SpringMVC源码分析(1)标签解析>:介绍了解析过程中,初始化若干组件。<SpringMVC源码分析(2)DispatcherServlet的初始化>:初始化DispatcherServlet的多个组件。本文...
    99+
    2023-01-31
    源码 SpringMVC Dis
  • 极验3代 加密分析
    目标链接 'aHR0cHM6Ly93d3cuZ2Vhttps://blog.csdn.net/zhp980121/article/details/ldGVzdC5jb20vZGVtby9zbGhttp...
    99+
    2023-09-02
    爬虫 加密算法分析及还原 逆向 极验验证码 极验参数w
  • php实现分页功能的3种方法
    1. 使用数据库的LIMIT语句实现分页功能。这种方法是最常见的,通过在SQL语句中添加LIMIT子句来指定每页显示的记录数和偏移量...
    99+
    2023-08-14
    php
  • redis实现分布式锁实例分析
    本文小编为大家详细介绍“redis实现分布式锁实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“redis实现分布式锁实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、业务场景引入模拟一个电商系统,...
    99+
    2023-06-29
  • Python 3.x踩坑的示例分析
    这篇文章主要为大家展示了“Python 3.x踩坑的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python 3.x踩坑的示例分析”这篇文章吧。处处有坑1. 文件读...
    99+
    2023-06-29
  • 我的Python分析成长之路3
    一 集合                                                                                                                   ...
    99+
    2023-01-30
    成长之路 Python
  • 可信安全TEE分析3 Intel SGX
    硬件要求:6代处理器并且BIOS支持。针对可信计算,类似ARM的TrustZone,Intel也针对x86平台提出了自己的安全架构SGX:Intel® Software Guard Extensions (Intel® SGX)https:...
    99+
    2023-01-31
    可信 TEE SGX
  • 【STRIDE】【3】安全威胁分析设计
    本文谈一下STRIDE数据流图的四个元素:外部实体、处理过程、存储、数据流    为了描述方便,以下图为例进行说明,该数据流图是“斗医”系统解析业务配置规则的一个功能,即客户端启动系统时会通过PwmLauncher调用到PwmBusines...
    99+
    2023-01-31
    STRIDE
  • Gochannel实现原理分析
    目录channelchannel类型创建channelchannel操作发送接收关闭无缓冲的通道有缓冲的通道close()如何优雅的从通道循环取值单向通道通道遍历异步通道通道总结ch...
    99+
    2023-05-14
    Go channel Go channel实现原理
  • Spring Data + Thymeleaf 3 + Bootstrap 4 实现分页器实例代码
    实际上分页器或者分页组件在现实中都有广泛着的应用,照理来说老卫没有必要单独撰文来提这茬。事实是,我近期刚好在写一门关于Spring Data、Thymeleaf 3、Bootstrap 4 的应用课程,所以用了Bootstrap 4的样式,...
    99+
    2023-05-31
    spring data 分页
  • GitHub连续3天出现严重宕机的示例分析
    GitHub连续3天出现严重宕机的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。4月21日,多个GitHub服务被问题困扰了至少一...
    99+
    2024-04-02
  • 分析ZooKeeper分布式锁的实现
    目录一、分布式锁方案比较二、ZooKeeper实现分布式锁2.1、方案一2.2、方案二一、分布式锁方案比较 方案 ...
    99+
    2024-04-02
  • python 3.x 分析日志的模块(正
    #导入正则模块 import re auth="no_shutdown_" ''' 分析日志的模块,查找日志中标志性信息产生的次数 ''' #定义你需要查找的对象的正则表达式wordcheck #需要分析的日志的路径filesource d...
    99+
    2023-01-31
    模块 日志 python
  • 实现Ajax的示例分析
    小编给大家分享一下实现Ajax的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Ajax:  Asynchron...
    99+
    2024-04-02
  • Redis实现唯一计数的3种方法分享
    唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每...
    99+
    2022-06-04
    种方法 Redis
  • C# 泛型实现的实例分析
    这期内容当中小编将会给大家带来有关C# 泛型实现的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C# 泛型实现在 .NET 2.0 中,C# 泛型在 IL(中间语言)和 CLR 本身中具有本机支持...
    99+
    2023-06-17
  • Tensorflow2.1MNIST图像分类实现思路分析
    目录前言主要思路和实现(1) 加载数据,处理数据(2) 使用 keras 搭建深度学习模型(3) 定义损失函数(4) 配置编译模型(5) 使用训练数据训练模型(6) 使用测试数据评估...
    99+
    2022-11-21
    Tensorflow2.1 MNIST图像分类 Tensorflow MNIST
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作