范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

DPVSSNAT实现

  DPVS的数据流量从以流入流出划分为:inbond outbond; outbond:指数据包从内网服务器 -> DPVS -> 外网服务器(如 qq.com ) inbond:指数据包从外网服务器(如qq.com) -> DPVS -> 内网服务器 outbond 方向数据包处理流程
  内网服务器需要访问外网某个功能接口,请求数据包到达了 DPVS 服务器。数据包从网卡某个队列 queuex 进入后,被 cpux 接收并开始相关的逻辑处理。收包路径大概包括如下: netif_loop -> lcore_job_recv_fwd -> lcore_process_packets -> netif_deliver_mbuf netif_deliver_mbuf 函数中根据 packet_type 分别调用相应的 func 函数,func 类型主要包括:ipv4、ipv6、arp 三种类型。这里主要以 IPv4 分析 SNAT 整个过程。 IPv4 类型的包处理函数是 ipv4_rcv,经过 IP 层相关检查和校验处理后,调用 INET_HOOK 来执行相关的钩子函数,这里调用的是 INET_HOOK_PRE_ROUTING 位置钩子,包括:dp_vs_pre_routing & dp_vs_in 函数,核心代码入口在 dp_vs_in 里边
  在  dp_vs_in   中其实调用的是  __dp_vs_in   函数,主逻辑入口在这个函数中体现: 首先调用协议查找函数 dp_vs_proto_lookup,确认此数据包是哪种协议类型,如 TCP 或 UDP 等,每种协议的相关处理逻辑不同,后续的相关操作会根据对应协议注册的回调函数来执行。 假设本次是请求是首包,需要调用 proto 的 conn_sched 函数进行连接的初始化和调度,TCP 的连接调度函数是 tcp_conn_sched。 调度时,只有 TCP syn 包才能触发正常调度流程。首先,根据数据包的相关数据确认该包是否属于我们配置的服务,调用 dp_vs_service_lookup 函数进行查找,不过这里查找到的 service 类型是 match 方式。如果找不到响应的 svc 就跳出 SNAT 主流程。 找到 svc 后,调用 dp_vs_schedule 进行主调度流程,并创建初始化新的连接 Entry。 调用 svc->scheduler->schedule 函数,从 RS 列表中挑选出一个 RS 作为 dest 对于 SNAT 模式,调用 dp_vs_snat_schedule() 函数 此时已确认 dest 作为源 IP 地址,调用 sa_fetch 根据源地址选择相对应的源 port 调用 dp_vs_conn_fill_param 将相关数据赋值到 param 变量中去。 确定相关参数后,调用 dp_vs_conn_new 建立初始化新的连接条目。 申请 new conn 连接内存资源,调用 dp_vs_conn_alloc 初始化 inbond 和 outbond 连接表关联的 ntuple 哈希 初始化 new conn 的相关字段 为 conn 绑定对应的 dest,并设置对应的 xmit 函数 添加 new conn 到连接表中 dp_vs_conn_hash 初始化相关的计数器和定时器 到此为止,一个新的 SNAT 连接已经完成 连接调度成功后,根据模式,SNAT 初始化方向为 DPVS_CONN_DIR_OUTBOUND 不同于其他模式。 调用 proto 的 state_trans 函数,进行相关协议状态机的转换。 调用 xmit_outbound 将数据包发送出去。 调用相关接口,确认 output 路由,并修改三层和四层信息 确认下一跳等相关信息,调用 neigh_output 发出数据包
  到此从 SNAT 数据包的接收、处理、转发等过程,完成 SNAT outbond 方向的整个流程。 inbond 方向数据包处理流程
  内网服务器发送请求数据包后,外网服务器执行相关操作,发出响应数据包,此数据包到达了 DPVS 服务器。此时 DPDK 驱动程序会根据关键字段进行 FDIR 规则匹配,数据包从同样的网卡度列 queuex 进入后,被 cpux 接收并开始相关的逻辑处理,这样整个连接都是被同一个 cpux 来处理的。收包路径大概包括如下:
  在 dp_vs_in 前的收包处理流程和 outbond 基本一致,这里就不分析了。 根据数据包字段,确认协议类型,调用 dp_vs_proto_lookup 确认本次是 TCP 协议 根据响应数据包的 4 元组来查找连接表(根据元组字段和 tuple hash 字段),正常情况能够找到对应的连接表。 进行协议的状态机转换 调用 xmit_inbound 将数据包发送出去,具体细节与 outbond 很类似。
  不断的重复 outbond 和 inbond 流程,就能够通过多次数据包的交互完成连接过程中业务的传输,从而实现 SNAT 功能
  存在问题: ICMP 处理问题。内网服务器 ping 外网是一个很常见的需求,从实验测试和代码分析来看,响应 ICMP 包可能命中到其它网卡队列,导致连接表 miss 的问题,这个问题可以通过 FDIR 功能将 ICMP 包都定位到固定的网卡 queue 上,这样可以简单的方式来解决这个问题。
  NAT模式原理
  对于inbound方向的流量,实际上做的是dnat,将目标ip由lb vip转换成真正的rs ip,此时后端rs是能拿到client ip的。outbond的流量做snat,将源地址换成lb vip
  /* return verdict INET_XXX  * af from mbuf->l3_type? No! The field is rewritten by netif and conflicts with  * m.packet_type(an union), so using a wrapper to get af.  * */ static int __dp_vs_in(void *priv, struct rte_mbuf *mbuf,                       const struct inet_hook_state *state, int af) {     struct dp_vs_iphdr iph;     struct dp_vs_proto *prot;     struct dp_vs_conn *conn;     int dir, verdict, err, related;     bool drop = false;     lcoreid_t cid, peer_cid;     eth_type_t etype = mbuf->packet_type; /* FIXME: use other field ? */     assert(mbuf && state);     //获取当前运行的lcore id     cid = peer_cid = rte_lcore_id();          //数据包不是发往本机的,直接返回ACCEPT,之后执行ipv4_rcv_fin     if (unlikely(etype != ETH_PKT_HOST))         return INET_ACCEPT;      //填充内部dp_vs_iphdr,如果出错,主要是协议族不正确,直接返回ACCEPT     if (dp_vs_fill_iphdr(af, mbuf, &iph) != EDPVS_OK)         return INET_ACCEPT;     //处理ICMP消息,类似于linux内核中icmp_error相关的处理逻辑     if (unlikely(iph.proto == IPPROTO_ICMP ||                  iph.proto == IPPROTO_ICMPV6)) {         /* handle related ICMP error to existing conn */         verdict = dp_vs_in_icmp(af, mbuf, &related);         if (related || verdict != INET_ACCEPT)             return verdict;         /* let unrelated and valid ICMP goes down,          * may implement ICMP fwd in the futher. */     }                  //查找四层处理协议,目前实现了tcp,udp和icmp     prot = dp_vs_proto_lookup(iph.proto);     if (unlikely(!prot))         return INET_ACCEPT;      /*      * Defrag ipvs-forwarding TCP/UDP is not supported for some reasons,      *      * - RSS/flow-director do not support TCP/UDP fragments, means it"s      *   not able to direct frags to same lcore as original TCP/UDP packets.      * - per-lcore conn table will miss if frags reachs wrong lcore.      *      * If we redirect frags to "correct" lcore, it may cause performance      * issue. Also it need to understand RSS algorithm. Moreover, for the      * case frags in same flow are not occur in same lcore, a global lock is      * needed, which is not a good idea.      */ //目前不支持ip分片,此处与flow director相关     if (af == AF_INET && ip4_is_frag(ip4_hdr(mbuf))) {         RTE_LOG(DEBUG, IPVS, "%s: frag not support. ", __func__);         return INET_DROP;     }     //调用proto相关conn_lookup函数查找会话,tcp中为 tcp_conn_lookup 。有可能会 drop 掉。dir 是设置数据流方向,从client到LB,     //还是从real server到LB,peer_cid为查找时决定处理该连接的lcore id     /* packet belongs to existing connection ? */     conn = prot->conn_lookup(prot, &iph, mbuf, &dir, false, &drop, &peer_cid);      if (unlikely(drop)) {         RTE_LOG(DEBUG, IPVS, "%s: deny ip try to visit. ", __func__);         return INET_DROP;     }      /*      * The connection is not locally found, however the redirect is found so      * forward the packet to the remote redirect owner core.      */     //如果不在当前lcore上处理,则恢复mbuf->data_off指向L2 header后转发给其他lcore处理,此处ring enqueue成功后返回INET_STOLEN,         //否则返回DROP丢弃数据包     if (cid != peer_cid) {         /* recover mbuf.data_off to outer Ether header */         rte_pktmbuf_prepend(mbuf, (uint16_t)sizeof(struct rte_ether_hdr));          return dp_vs_redirect_pkt(mbuf, peer_cid);     }     //对于新建的连接,肯定是没有会话的,conn_sched根据请求选择一个后端real server建立连接     if (unlikely(!conn)) {         /* try schedule RS and create new connection */     //调用proto中conn_sched接口选择一个后端rs建立连接,如果创建连接失败,返回verdict         if (prot->conn_sched(prot, &iph, mbuf, &conn, &verdict) != EDPVS_OK) {             /* RTE_LOG(DEBUG, IPVS, "%s: fail to schedule. ", __func__); */             return verdict;         }         //snat模式,则是内部服务器访问外部服务,内网服务器--->dpvs--->外网服务器(baidu),         //所以设置dir=DPVS_CONN_DIR_OUTBOUND         /* only SNAT triggers connection by inside-outside traffic. */         if (conn->dest->fwdmode == DPVS_FWD_MODE_SNAT)             dir = DPVS_CONN_DIR_OUTBOUND;         else//其余模式设置dir=DPVS_CONN_DIR_INBOUND             dir = DPVS_CONN_DIR_INBOUND;     } else {         /* assert(conn->dest->svc != NULL); */         if (conn->dest && conn->dest->svc &&                 prot->conn_expire_quiescent &&                 (conn->dest->svc->flags & DPVS_CONN_F_EXPIRE_QUIESCENT)) {             if (rte_atomic16_read(&conn->dest->weight) == 0) {                 RTE_LOG(INFO, IPVS, "%s: the conn is quiescent, expire it right now,"                         " and drop the packet! ", __func__);                 prot->conn_expire_quiescent(conn);                 dp_vs_conn_put(conn);                 return INET_DROP;             }         }     }     //特殊处理,syn_proxy      if (conn->flags & DPVS_CONN_F_SYNPROXY) {         if (dir == DPVS_CONN_DIR_INBOUND) {             /* Filter out-in ack packet when cp is at SYN_SENT state.              * Drop it if not a valid packet, store it otherwise */             if (0 == dp_vs_synproxy_filter_ack(mbuf, conn, prot,                                                &iph, &verdict)) {                 dp_vs_stats_in(conn, mbuf);                 dp_vs_conn_put(conn);                 return verdict;             }              /* "Reuse" synproxy sessions.              * "Reuse" means update syn_proxy_seq struct              * and clean ack_mbuf etc. */             if (0 != dp_vs_synproxy_ctrl_conn_reuse) {                 if (0 == dp_vs_synproxy_reuse_conn(af, mbuf, conn, prot,                                                    &iph, &verdict)) {                     dp_vs_stats_in(conn, mbuf);                     dp_vs_conn_put(conn);                     return verdict;                 }             }         } else {             /* Syn-proxy 3 logic: receive syn-ack from rs */             if (dp_vs_synproxy_synack_rcv(mbuf, conn, prot,                                           iph.len, &verdict) == 0) {                 dp_vs_stats_out(conn, mbuf);                 dp_vs_conn_put(conn);                 return verdict;             }         }     }     //状态迁移,tcp中为tcp_state_trans     if (prot->state_trans) {         err = prot->state_trans(prot, conn, mbuf, dir);         if (err != EDPVS_OK)             RTE_LOG(WARNING, IPVS, "%s: fail to trans state.", __func__);     }     conn->old_state = conn->state;      /* holding the conn, need a "put" later. */     //根据流量方向dir,来选择如何发送数据     if (dir == DPVS_CONN_DIR_INBOUND)         return xmit_inbound(mbuf, prot, conn);     else         return xmit_outbound(mbuf, prot, conn); }
  原文链接:https://www.cnblogs.com/codestack/p/15717792.html

(社会)山楂产业助力乡村振兴天津市蓟州区下营镇林果资源丰富,拥有1600余亩的山楂种植面积。近年来,当地发挥山楂种植面积大品质好的优势,通过实施山楂果品冻干生产山楂基地新品种引进山楂标准化示范基地建设等措施,(经济)河北邢台小葫芦成产业农文旅融合促振兴育苗翻地覆膜搭藤架春耕时节,在河北省邢台市信都区会宁镇张尔庄村,村民在田间地头忙碌,为特色葫芦规模种植做前期准备葫芦工艺室内,工艺师们用烙笔刻刀等工具制作精美的葫芦工艺品。近几年,MetaTdexQ1季度交易额翻倍增长2023年,MetaTdex作为DEX市场头号黑马,因交易量快速增长,在全球DEX排位中不断提升。币股通产品发布,更是将DEX衍生品服务拓展至万亿级股票市场,让Web3。0用户有了施普林格自然集团发布年度可持续企业报告发现驱动作为出版自然科学美国人等刊物的全球出版机构,施普林格自然集团(SpringerNatureGroup)于北京时间4月5日发布了最新的年度可持续企业报告发现驱动。该报告通过环境社会和气价涨利润降!城燃企业两头承压,困境如何解高气价下,价格疏导不畅正困扰着诸多城燃企业。国家发改委的数据显示,2022年全国天然气表观消费量3663亿立方米,同比下降1。7,是我国年度天然气消费量近年来首次下降。然而,四大城真招实策促企业降本增效中小企业经营范围遍及社会生产生活的各个角落,关乎千千万万家庭的就业和生活。今年政府工作报告强调,支持中小微企业和个体工商户发展。去年的中央经济工作会议也指出,要坚定不移深化改革,更安徽省加快构建优质高效服务业新体系开展内外贸产品同线同标同质推进行动,力争年内招引外资重点项目超过150个,徽动消费行动扩容升级今年,安徽服务业将释放更大的发展动能。记者4月6日从省委宣传部举行的新闻发布会获悉,我忻州这两个县或将合并,如果成功实现,未来经济发展有望腾飞山西省,简称晋,省会是太原市。山西位于黄土高原东翼,南临黄河,西邻吕梁山,东靠太行山。因在太行山以西,故称山西。2022年,山西省国民经济和社会发展取得了显著成绩,经济实力稳步增长临澧县佘市桥镇慈善会暨辛树帜教育基金会佘市桥分会成立湖南日报新湖南客户端4月6日讯(邹涵乔蒋檬)4月6日上午,临澧县佘市桥镇慈善会暨辛树帜教育基金会佘市桥分会成立。临澧县委书记李雨初,县委副书记统战部长魏翔,县人大常委会主任李颖及湖16国驻华使节及外交官访渝挖掘西部陆海新通道商机中新社重庆4月6日电(记者刘相琳)4月5日至6日,中国外交部驻华使节地方行活动走进重庆,来自16个国家的30多位驻华使节及外交官赴渝实地访问,聚焦高质量共建西部陆海新通道,开展国际好政策助经济企稳回升全国规模以上工业增加值同比增长2。4,社会消费品零售总额同比增长3。5,全国固定资产投资(不含农户)同比增长5。5国家统计局近日发布的一系列主要经济数据显示,从1月份至2月份,我国
夏天,人体内是热还是寒?经常听到一些养生专家讲夏天人体内部比人体表面寒,不要吃冰冷食物。通常会这样举例子,夏天的时候,地面是热的,井水是凉的,你的身体和这个一样,气血都浮到表上来了,人体内里气变少了,里面气血是身体根本,若想补气血,不妨多吃这4种食物从中医角度来看,保持健康的人气血供应充足,可以保持脏腑健康。因为各大器官要功能发挥,首要条件是营养满足需求。但如果出现气虚,血虚等情况,持续气血不足,后续会有疲惫乏力精神不振头晕耳浑身都是宝的芝麻芝麻是我国四大食用油料作物的佼佼者,是我国主要油料作物之一。从芝麻种子中提取的油脂气味芳香,又称作香油,可用作食用油,而从芝麻的花和茎中,可获取制造香水所用的香料。热榨的芝麻油可用养生抗衰美容的五款芝麻茶芝麻虽小,但小小的身躯中却蕴涵着多种不饱和脂肪酸维生素E与卵磷脂,可在人体中发挥出大大的功效。芝麻味甘性平,能滋养肝肾润肠通便也具有通乳效果,适合产后乳汁分泌状况不佳的妇女食用。芝现在沙滩也成了奢侈品?阳光海浪沙滩,人们无不向往着这些美丽的海洋风情,其中,沙滩更是不可或缺的组成部分,有了沙滩的存在,人们才能享受海洋美景。但是,不久的将来,也许沙滩这一人们已经习惯的事物就将永远消失你应该不知道,浙江有个度假避暑的小县城,100包吃住,距上海4h来浙江避暑,在很多人看来,可能觉得是开玩笑,然而浙江,确实有着小众的避暑佳地,海拔不高,1000余米的地方,却有着避暑仙境,夏天均温22。空气清新,住着的人儿也有了惬意的生活,在距养生先养肺,哪些食物应多吃?来源大河健康报河南省中医院王艳梅中医认为肺位居上,开窍于鼻,外合皮毛,通过皮毛口鼻直接与外界相通,相当于人体城门。若病毒来袭,则首先攻肺,出现发热咳嗽胸闷等呼吸道症状。因此,养生就总口苦,因为湿气大!一张方子,除湿去口苦,值得认真品味现在,我给你说说口苦这个毛病。人到了一定年龄,常会出现口苦的现象。有人说,这是肝火大,上火了。其实,你可知道,口苦这个事儿,也可能不是因为火,而是因为湿。现在,请允许我给你讲讲,我血湿会胖,血瘀会疼,血燥会痒,教你一招,把血给养回来气血亏虚则淡,血瘀则痛,血躁则痒,血为万物之源!大家好,我是贾医生。血,相信大家都不陌生,它其实在日常中,充当着很重要角色。内经中说啊,人之所有者,血与气耳,就是说气血是生命根本,为何一查肝癌,往往都是晚期?主要有2点!劝你远离这4个祸根肝癌之所以如此可怕,除了发病率高,还有不少知名人士被肝癌夺走性命。而这些知名人士经济状况良好,即便患癌也能最大程度利用优质医疗资源,但依然无法保住性命。这其中背后有一个较大的原因肝沈腾老婆王琦是有福之人,体态圆润超有旺夫相,穿格子裙甜美迷人沈腾老婆王琦是有福之人,体态圆润超有旺夫相,穿格子裙甜美迷人沈腾老婆王琦是有福之人,体态圆润超有旺夫相,穿格子裙甜美迷人沈腾老婆王琦是有福之人,体态圆润超有旺夫相,穿格子裙甜美迷人