幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Linux内核网络之网络层接收消息分片组装

  在接收方,一个由发送方发出的原始IP数据报,其所有分片将被重新组合,然后才能提交给上层协议。
  而每个将被重新组合的IP数据报都用一个ipq结构实例来表示。structipq{用来将ipqhash散列表链接成双向链表structhlistnodelist;用来将ipq连接到全局链表ipqlrulist链表中。ipqlrulist用于垃圾收集,当ip组装模块消耗内存大于规定的上限时,会遍历该链表清除符合条件的分片structlistheadlrulist;lrulistmemberu32user;标识分片来源:来自网络其他主机或是本地环回接口的分片、含有路由警告选项的IP分片以下四个字段的值都来源于ip首部,用来唯一确定分片来自哪个ip数据报be32saddr;be32daddr;be16id;u8protocol;u8lastin;defineCOMPLETE4所有分片已到达,可以进行组装;defineFIRSTIN2第一个分片到达,其特殊之处在于只有第一个分片包含了所有ip选项;defineLASTIN1最后一个分片已到达,最后一个分片带有原始数据包的长度信息用来链接已经接收到的分片structskbufffragments;linkedlistofreceivedfragments当前已接收到分片中offset最大的那个分片的offset值加上其长度值,即分片末尾处在整个原始数据报中的位置,因此当收到最后一个分片后该字段值将更新为原始数据报的长度intlen;totallengthoforiginaldatagram已接收到的所有分片总长度,因此可以用len和meat来判断一个ip数据报的所有分片时否已到齐intmeat;自旋锁,在smp环境下,处理ipq及分片链时需上锁spinlocktlock;atomictrefcnt;引用计数组装超时定时器,组装分片非常消耗资源,防止无休止等待分片的到达structtimerlisttimer;whenwillthisqueueexpire?记录最后一个分片的到达时间,在组装数据报时用该值作为时间戳structtimevalstamp;接收最后一个分片的网络设备索引号。当分片组装失败时,用该设备发送组装失败icmp出错报文。intiif;已接收到分片的计数器,可通过对端信息块peer中的分片计数器和该分片计数器来防止DoS攻击unsignedintrid;记录发送方的一些信息structinetpeerpeer;};Hashtable。defineIPQHASHSZ64Perbucketlockiseasytoaddnow。staticstructhlistheadipqhash〔IPQHASHSZ〕;
  每个原始的IP数据报的所有分片以链表的形式保存在ipq结构fragments中。
  在网络层中,会根据每个原始的IP数据报首部中的(saddr,daddr,id,protocol,ipfraghashrnd)计算一个hash值,然后将ipq结构放到对应的ipqhash〔hash〕散列表中。
  因此,当一个新的分片skb到来时,根据(saddr,daddr,id,protocol,ipfraghashrnd)计算出hash值,从ipqhash〔hash〕散列表中找到ipq结构,然后把分片存放到fragments链表中。
  当IP分片到达本地时,先调用ipdefrag进行重组。ip数据报输入到本地intiplocaldeliver(structskbuffskb){ReassembleIPfragments。若接收到的ip报是分片,则调用ipdefrag进行重组,其标志为IPDEFRAGLOCALDELIVERif(skbnh。iphfragoffhtons(IPMFIPOFFSET)){返回0,表示ip数据包分片还未到齐,重组未完成,直接返回;非0,返回已完成重组的ip数据报skb缓存的指针,传到传输层进行处理skbipdefrag(skb,IPDEFRAGLOCALDELIVER);if(!skb)return0;}通过netfilter处理后,调用iplocaldeliverfinish将组装完的ip报文传送到传输层进行处理returnNFHOOK(PFINET,NFIPLOCALIN,skb,skbdev,NULL,iplocaldeliverfinish);}
  分片组装
  分片组装的流程如下:
  ipdefrag
  ipfind在ipq散列表中查找分片所属的ipq,若找不到则新建一个ipq
  ipfragqueue将分片插入到ipq分片链表的适当位置
  ipfragreasm原始数据报的所有分片全部到达,组装分片
  具体实现细节如下
  ipdefragProcessanincomingIPdatagramfragment。对分片进行组装skb:新接收到的ip数据报user:分片来源structskbuffipdefrag(structskbuffskb,u32user){structiphdriphskbnh。iph;structipqqp;structnetdevicedev;IPINCSTATSBH(IPSTATSMIBREASMREQDS);Startbycleaningupthememory。若iqp散列表消耗的内存大于指定的值,则ipevictor()清理分片if(atomicread(ipfragmem)sysctlipfraghighthresh)ipevictor();获取接收数据报的网络设备指针devskbdev;Lookup(orcreate)queueheader在ipq散列表中查找分片所属的ipq。若找不到则新建一个ipq,若返回为null,则说明查找及创建失败if((qpipfind(iph,user))!NULL){structskbuffretNULL;spinlock(qplock);将分片插入到ipq分片链表的适当位置ipfragqueue(qp,skb);当ipq的第一个分片和最后一个分片都已收到,且若已接收数据报的总长度与原始数据报的长度相等,则说明该原始数据报的所有分片都已到齐if(qplastin(FIRSTINLASTIN)qpmeatqplen)调用ipfragreasm组装分片retipfragreasm(qp,dev);spinunlock(qplock);删除iqp及其所有分片ipqput(qp,NULL);returnret;}IPINCSTATSBH(IPSTATSMIBREASMFAILS);释放分片kfreeskb(skb);returnNULL;}
  当一个分片到达后,按照偏移量插入到ipq分片链表的适当位置,如下图:
  ipfind
  在ipq散列表中查找分片所属的ipq结构如下:根据分片的ip首部以及user标志在ipq散列表中找对应的ipq,若没找到,则为其创建新的ipqstaticinlinestructipqipfind(structiphdriph,u32user){be16idiphid;be32saddriphsaddr;be32daddriphdaddr;u8protocoliphprotocol;unsignedinthash;structipqqp;structhlistnoden;readlock(ipfraglock);计算hash值hashipqhashfn(id,saddr,daddr,protocol);遍历该桶的ipq链表查找对应的ipq,若找到则返回该ipq,否则说明这是一个新的ip数据报分片,需要创建一个新的ipqhlistforeachentry(qp,n,ipqhash〔hash〕,list){if(qpididqpsaddrsaddrqpdaddrdaddrqpprotocolprotocolqpuseruser){atomicinc(qprefcnt);readunlock(ipfraglock);returnqp;}}readunlock(ipfraglock);返回新建的ipqreturnipfragcreate(iph,user);}
  ipfragcreate
  创建ipq结构,并初始化其组装超时定时器。每当接收到一个属于新的ip数据报的分片时,会为其创建对应的iqp,并初始化其组装超时定时器staticstructipqipfragcreate(structiphdriph,u32user){structipqqp;if((qpfragallocqueue())NULL)gotooutnomem;qpprotocoliphprotocol;qplastin0;qpidiphid;qpsaddriphsaddr;qpdaddriphdaddr;qpuseruser;qplen0;qpmeat0;qpfragmentsNULL;qpiif0;qppeersysctlipfragmaxdist?inetgetpeer(iphsaddr,1):NULL;Initializeatimerforthisentry。inittimer(qptimer);qptimer。data(unsignedlong)qp;pointertoqueueqptimer。functionipexpire;expirefunctionspinlockinit(qplock);atomicset(qprefcnt,1);returnipfragintern(qp);outnomem:LIMITNETDEBUG(KERNERRipfragcreate:nomemoryleft!);returnNULL;}
  ipfragintern将新建的ipq插入到ipq散列表中和ipqlrulist中staticstructipqipfragintern(structipqqpin){structipqqp;unsignedinthash;writelock(ipfraglock);计算hash值hashipqhashfn(qpinid,qpinsaddr,qpindaddr,qpinprotocol);qpqpin;安装ipq的组装超时定时器,定时为sysctlipfragtimeif(!modtimer(qptimer,jiffiessysctlipfragtime))atomicinc(qprefcnt);递增ipq的引用计数atomicinc(qprefcnt);将ipq插入到ipq散列表和lrulist中hlistaddhead(qplist,ipqhash〔hash〕);INITLISTHEAD(qplrulist);listaddtail(qplrulist,ipqlrulist);对ipq的数量进行计数ipfragnqueues;writeunlock(ipfraglock);returnqp;}
  ipfragqueueAddnewsegmenttoexistingqueue。将分片skb添加到iqp指定的ipq分片链表中qp:将添加ip分片到ipqskb:接收到待添加到ipq中的ip分片staticvoidipfragqueue(structipqqp,structskbuffskb){structskbuffprev,next;intflags,offset;intihl,end;对分片已全部接收到的ipq,则释放该分片后返回if(qplastinCOMPLETE)gotoerr;若不是有本地生成的分片,则调用ipfragtoofar检测该分片是否存在DoS攻击嫌疑,。若受到攻击,则调用ipfragreinit释放所有的ipq所有分片if(!(IPCB(skb)flagsIPSKBFRAGCOMPLETE)unlikely(ipfragtoofar(qp))unlikely(ipfragreinit(qp))){ipqkill(qp);gotoerr;}取出ip首部中的标志位、片偏移及首部长度字段,并计算片偏移值和首部长度值offsetntohs(skbnh。iphfragoff);flagsoffsetIPOFFSET;ip首部中的片偏移字段为13位,表示的是8字节的倍数offsetIPOFFSET;offset3;offsetisin8bytechunksihlskbnh。iphihl4;Determinethepositionofthisfragment。计算分片末尾处在原始数据报中的位置endoffsetskblenihl;Isthisthefinalfragment?若是最后一个分片if((flagsIPMF)0){Ifwealreadyhavesomebitsbeyondendorhavedifferentend,thesegmentiscorrrupted。先对分片进行检查,若其末尾小于原始包长度,或者ipq已有LASTIN标志且分片末尾不等于原始包长度,则出错if(endqplen((qplastinLASTIN)end!qplen))gotoerr;设置LASTIN标志,将完整数据报长度存储在ipq的len字段中qplastinLASTIN;qplenend;}else{不是最后一个分片,其数据长度又不是8字节对齐,则将其截为8字节对齐if(end7){end7;若需要计算校验和,则强制设置有软件来计算校验和,因为截断了ip有效负载,改变了长度,需重新计算校验和if(skbipsummed!CHECKSUMUNNECESSARY)skbipsummedCHECKSUMNONE;}在最后一个分片没有到达的情况下,若当前分片的末尾在整个数据报中的位置大于ipq中的len值,则更新len。因为ipq中的len字段始终保持所有已接收到的分片中分片末尾在数据报中的位置的最大值,而只有在收到最后一个分片后。len值才是整个数据报的长度if(endqplen){Somebitsbeyondendcorruption。若此数据报有异常,则直接丢弃if(qplastinLASTIN)gotoerr;qplenend;}}若分片的数据区长度为0,则该分片异常,直接丢弃if(endoffset)gotoerr;调用pskbpull去掉ip首部,只保留数据部分if(pskbpull(skb,ihl)NULL)gotoerr;将skb数据区长度调整为endoffset,ip有效负载长度if(pskbtrimrcsum(skb,endoffset))gotoerr;Findoutwhichfragmentsareinfrontandatthebackofusinthechainoffragmentssofar。Wemustknowwheretoputthisfragment,right?确定分片在分片链表中的位置。因为各分片很可能不按照顺序到达,而ipq分片链表上的分片是按照分片偏移值从小到大的顺序连接在一起的prevNULL;for(nextqpfragments;next!NULL;nextnextnext){if(FRAGCB(next)offsetoffset)break;bingo!prevnext;}Wefoundwheretoputthisone。Checkforoverlapwithprecedingfragment,and,ifneeded,alignthingssothatanyoverlapsareeliminated。检测和上一个分片的数量是否有重叠,i是重叠部分的长度,若有重叠,调用pskbpull去掉重叠的部分if(prev){inti(FRAGCB(prev)offsetprevlen)offset;if(i0){offseti;if(endoffset)gotoerr;if(!pskbpull(skb,i))gotoerr;if(skbipsummed!CHECKSUMUNNECESSARY)skbipsummedCHECKSUMNONE;}}若和后一个分片有重叠,则还需判断重叠部分的数据长度是否超过下一个分片的数据长度,若没有超过则调整下一个分片,超过这需要释放下一个分片后再检查与后面第二个分片的数据是否有重叠,如此反复,直到完成后面对所有分片的检测。调整分片的偏移值、已接收分片总长度等while(nextFRAGCB(next)offsetend){intiendFRAGCB(next)offset;overlapisibytesif(inextlen){Eatheadofthenextoverlappedfragmentandleavetheloop。Thenextonescannotoverlap。if(!pskbpull(next,i))gotoerr;FRAGCB(next)offseti;qpmeati;if(nextipsummed!CHECKSUMUNNECESSARY)nextipsummedCHECKSUMNONE;break;}else{structskbufffreeitnext;Oldfragmentiscompletelyoverriddenwithnewonedropit。nextnextnext;if(prev)prevnextnext;elseqpfragmentsnext;qpmeatfreeitlen;fragkfreeskb(freeit,NULL);}}记录当前分片的偏移值FRAGCB(skb)offsetoffset;Insertthisfragmentinthechainoffragments。将当前的分片插入到ipq分片队列中的相应位置skbnextnext;if(prev)prevnextskb;elseqpfragmentsskb;if(skbdev)qpiifskbdevifindex;skbdevNULL;更新ipq的时间戳skbgettimestamp(skb,qpstamp);累计该分片已收到的分片总长度qpmeatskblen;累计分片组装模块所占的内存atomicadd(skbtruesize,ipfragmem);若片偏移值为0,说明当前分片为第一个分片,设置FIRSTINif(offset0)qplastinFIRSTIN;writelock(ipfraglock);调整所属ipq在ipqlrulist中的位置,这是为了在占用内存超过阈值时可以先释放最久未用的那些分片listmovetail(qplrulist,ipqlrulist);writeunlock(ipfraglock);return;err:kfreeskb(skb);}
  对于其中计算分片末尾处在原始数据报中的位置的地方
  计算分片末尾处在原始数据报中的位置
  endoffsetskblenihl;
  有关ihl、offset、len和end的关系,如下图:
  ipfragreasm组装已到齐的所有分片。当原始数据报所有分片都已到齐时,调用此函数组装分片qp:存储待组装分片队列的ipqdev:输入分片的网络设备staticstructskbuffipfragreasm(structipqqp,structnetdevicedev){structiphdriph;structskbufffp,headqpfragments;intlen;intihlen;组装前,先将此ipq节点从ipq散列表和ipqlrulist表中断开,并删除定时器ipqkill(qp);BUGTRAP(head!NULL);BUGTRAP(FRAGCB(head)offset0);Allocateanewbufferforthedatagram。计算原始数据报包括ip首部的总长度,ihlenheadnh。iphihl4;lenihlenqplen;若该长度值超过64k则丢弃if(len65535)gotooutoversize;Headoflistmustnotbecloned。在组装分片时,所有的分片都会组装到第一个分片上,因此第一个分片不能时克隆的,若是克隆的,则需为分片组装重新分配一个skbif(skbcloned(head)pskbexpandhead(head,0,0,GFPATOMIC))gotooutnomem;Ifthefirstfragmentisfragmenteditself,wesplitittotwochunks:thefirstwithdataandpagedpartandthesecond,holdingonlyfragments。分片队列的第一个skb不能既带有数据,又带有分片,也即是其fraglist上不能有分片skb,若有则重新分配一个skb。最终效果时,head自身不包括数据,其fraglist上连接着所有分片的skb。这也是skb的一种表现形式,不一定是一个连续的数据块,但最终会调用skblinearize()将这些数据都复制到一个连续的数据块中if(skbshinfo(head)fraglist){structskbuffclone;inti,plen0;if((cloneallocskb(0,GFPATOMIC))NULL)gotooutnomem;clonenextheadnext;headnextclone;skbshinfo(clone)fraglistskbshinfo(head)fraglist;skbshinfo(head)fraglistNULL;for(i0;iskbshinfo(head)nrfrags;i)plenskbshinfo(head)frags〔i〕。size;clonelenclonedatalenheaddatalenplen;headdatalenclonelen;headlenclonelen;clonecsum0;cloneipsummedheadipsummed;atomicadd(clonetruesize,ipfragmem);}把所有分片组装起来,即将分片连接到第一个skb中的fraglist上,同时还需要遍历所有分片,重新计算ip数据报长度以及校验和等。skbshinfo(head)fraglistheadnext;skbpush(head,headdataheadnh。raw);atomicsub(headtruesize,ipfragmem);for(fpheadnext;fp;fpfpnext){headdatalenfplen;headlenfplen;if(headipsummed!fpipsummed)headipsummedCHECKSUMNONE;elseif(headipsummedCHECKSUMCOMPLETE)headcsumcsumadd(headcsum,fpcsum);headtruesizefptruesize;atomicsub(fptruesize,ipfragmem);}headnextNULL;headdevdev;skbsettimestamp(head,qpstamp);重置首部长度、片偏移、标志位和总长度iphheadnh。iph;iphfragoff0;iphtotlenhtons(len);IPINCSTATSBH(IPSTATSMIBREASMOKS);既然各分片都已处理完,释放ipq的分片队列qpfragmentsNULL;returnhead;outnomem:LIMITNETDEBUG(KERNERRIP:queueglue:nomemoryforgluingqueuep,qp);gotooutfail;outoversize:if(netratelimit())printk(KERNINFOOversizedIPpacketfromd。d。d。d。,NIPQUAD(qpsaddr));outfail:IPINCSTATSBH(IPSTATSMIBREASMFAILS);returnNULL;}
  组装的过程就是把所有分片组装起来,即将分片连接到第一个skb中的fraglist上,并返回组装后的数据报文。
  ipq散列表的重组
  所有的分片重组都是通过ipq散列表进行的。随着后续ipq的添加或删除,使得散列表中的ipq的分布变得不均匀,处理性能会大大降低,因此需要定时对散列表进行重新组装。这样做同时也是为了防御DoS攻击。
  散列表的定时重组是通过ipfragsecrettimer定时器实现的,在ipfraginit()中对ipfragsecrettimer定时器的初始化。在该函数中还初始化了ipfraghashrnd变量,该变量主要用来与IP首部中的源地址、目的地址等构成ipq散列表的关键字。每次重组时都会将ipfraghashrnd更新为一个新的随机值,并重新设置ipfragsecrettimer定时器,时间跨度为10min。
  ipfraginitvoidipfraginit(void){ipfraghashrnd(u32)((numphyspages(numphyspages7))(jiffies(jiffies6)));inittimer(ipfragsecrettimer);ipfragsecrettimer。functionipfragsecretrebuild;ipfragsecrettimer。expiresjiffiessysctlipfragsecretinterval;addtimer(ipfragsecrettimer);}
  ipfragsecretrebuild对全局的ipq散列表进行重组staticvoidipfragsecretrebuild(unsignedlongdummy){unsignedlongnowjiffies;inti;writelock(ipfraglock);重新获取ipfraghashrnd随机值getrandombytes(ipfraghashrnd,sizeof(u32));遍历ipq散列表中所有ipq,根据新的ipfraghashrnd值把这些ipq重新连接到散列表对应的桶中for(i0;iIPQHASHSZ;i){structipqq;structhlistnodep,n;hlistforeachentrysafe(q,p,n,ipqhash〔i〕,list){unsignedinthvalipqhashfn(qid,qsaddr,qdaddr,qprotocol);if(hval!i){hlistdel(qlist);Relinktonewhashchain。hlistaddhead(qlist,ipqhash〔hval〕);}}}writeunlock(ipfraglock);重新设置重构定时器的下次到期时间modtimer(ipfragsecrettimer,nowsysctlipfragsecretinterval);}
  清除超时的IP分片
  在复杂的网络环境下,一个IP数据报的分片有可能不能全部抵达目的地址,而该数据报已到达的分片会占用大量的资源,此外也为了防止抵御DoS攻击,因此需要设置一个时钟,一旦超时,数据报的分片还未全部到达,则将其已到达的分片全部清除。
  每当收到一个属于新的IP数据报分片时,在为其创建ipq时,会初始化其超时定时器ipexpire每当接收到一个属于新的ip数据报的分片时,会为其创建对应的iqp,并初始化其组装超时定时器staticstructipqipfragcreate(structiphdriph,u32user){。。。qptimer。functionipexpire;expirefunction。。。}
  ipexpire组装超时定时器例程,当定时器激活时,清除在规定时间内没有完成组装的ipq及其所有分片staticvoidipexpire(unsignedlongarg){structipqqp(structipq)arg;spinlock(qplock);当前已是COMPLETE状态,不做处理,直接跳到释放ipq及其所有的分片处if(qplastinCOMPLETE)gotoout;将ipq从ipq散列表和ipqlrulist链表中删除ipqkill(qp);IPINCSTATSBH(IPSTATSMIBREASMTIMEOUT);IPINCSTATSBH(IPSTATSMIBREASMFAILS);若第一个分片已经到达,则发送分片组装超时ICMP出错报文if((qplastinFIRSTIN)qpfragments!NULL){structskbuffheadqpfragments;SendanICMPFragmentReassemblyTimeoutmessage。if((headdevdevgetbyindex(qpiif))!NULL){icmpsend(head,ICMPTIMEEXCEEDED,ICMPEXCFRAGTIME,0);devput(headdev);}}out:spinunlock(qplock);释放ipq及其所有的ip分片ipqput(qp,NULL);}
  垃圾收集
  为了控制IP组装所占用的内存,设置了两个阈值ipfraghighthresh和ipfraglowthresh。当前ipq散列表占用的内存量存储在全局变量ipfragmem中,当ipfragmem大于ipfraghighthresh时,需要调用ipevictor()对散列表进行清理,直到ipfragmem降低到ipfraglowthresh。这两个阈值可以在系统运行时通过proc文件系统修改。
  ipevictor
  该方法主要对ipq中的分片进行条件性的清理。在所有的ipq中,若分片没有到齐,则被删除。staticvoidipevictor(void){structipqqp;structlistheadtmp;intwork;在清理前再次对当前消耗的内存量做测试,若少于sysctlipfraglowthresh,则不进行清理workatomicread(ipfragmem)sysctlipfraglowthresh;if(work0)return;while(work0){readlock(ipfraglock);若lru链表为空,解锁后返回if(listempty(ipqlrulist)){readunlock(ipfraglock);return;}tmpipqlrulist。next;qplistentry(tmp,structipq,lrulist);递增ipq引用计数atomicinc(qprefcnt);readunlock(ipfraglock);在删除分片前后要做同步保护spinlock(qplock);若分片还未到齐,则ipq从散列表及lru链表中删除。ipqkill只删除不释放if(!(qplastinCOMPLETE))ipqkill(qp);spinunlock(qplock);ipqput真正删除ipq及其所有分片ipqput(qp,work);IPINCSTATSBH(IPSTATSMIBREASMFAILS);}}

那天的云,也陪我哭了两个晚上文柏颜来源:《南风》杂志图片来源:网络(侵删)001hr池塘水绿风烟暖,记得玉真初见面。每当想起晏殊的这句词,我都会绝望地想,是不是所有太过美好的相遇,……国乒公布世乒赛参赛名单,樊振东孙颖莎领衔世乒赛国乒男女团中国乒乓球协会9月11日下午发布公告,确认了2022年第56届国际乒联世界乒乓球团体锦标赛(决赛)成都的中国队参赛名单。公告指出,根据《中国乒乓球协会2022年第56届国际乒联……马刺雪中送炭?加盟湖人,砍36853,他能否成为詹眉强力帮手洛杉矶湖人队今夏成为了全联盟关注的焦点,詹姆斯完成提前续约(2年9800万美金),但同时,詹姆斯和浓眉哥都想要一套能够冲冠的阵容,如今的湖人阵容还是欠缺冲冠竞争力。上赛季湖人队……海缆行业分析报告寡头竞争格局稳定,长期受益海风出口(报告出品方作者:国金证券,姚遥,胡竞楠)1、全球海风需求爆发,国内部分项目已实现平价1。1、国内海风十四五长周期景气1Q22招标量创历史单季度新高,预计全年海风招……广西唯一有王陵的城市,11座墓园足以跟北京13陵比拟桂林,秦汉时期称始安,隋唐时期更名桂州,唐光化3年(公元900)置桂州静江军,南宋绍兴3年(公元1133)桂州升静江府,元朝改广西行中省为静江路,桂州在宋元时期亦称为静江。明朝……人体自带散结穴,每天按一按,乳腺增生结节不来扰一、库房穴【位置】:位于胸部,在1肋间隙,距前正中线4寸。【作用功效】:库房穴具有预防咳嗽、气喘等呼吸道疾病、缓解局部疼痛的作用。常按此穴可以清热化痰,……跌破3900!华为P50又降价了文张紫宸责编吕东兴总编唐迪华为P50分别于8月20优惠400元,21日降价180元,如今又降30元,短短几日降价610元,现价3878元,目前已经跌破3900元。学生享学……25惨败!昔日英超冠军又输了1平5负排名垫底全队陷入沮丧英超第6轮,莱斯特城客场挑战布莱顿队,最终,莱斯特城又输了,25惨败,六轮过后,莱斯特城1平5负还未尝胜绩,排名积分榜垫底的位置,赛后莱斯特城全队陷入到了沮丧。莱斯特城队……五大联赛比赛预测曼联VS阿森纳,乌迪内斯VS罗马今晚的七场五大联赛的比赛预测:英超:布莱顿VS莱斯特城,这场比赛不能按照以往的眼光来看了,莱斯特城这赛季保级都成问题了,福法纳走了,其他人员表现得不好,而布莱顿的中前场看……非洲20亿年前的核反应堆,科学家研究后认为建造者不是人类非洲上的核反应堆究竟来自于哪儿?随着人类科技的不断发展,我们对于资源的利用程度也越来越高了。而在当下的社会中,核能源绝对是最热门的存在,研究核能源也成为了各国的目标。毕竟……春风化雨润无声,最难风雨故人来雨从昨天到今天已经淅淅沥沥两天了,凭窗望去,竟是春雨如酒柳如烟的景色,迷迷茫茫,分不清是天上的云,还是山间的雾,远处的青山时隐时显,那围绕在山间的长长的、白色的、飘逸的丝带幻化……10月后到春节前,企退职工的社保等待遇迎来四点变化,影响你了10月后、直到春节前,企业退休职工注意社保等待遇迎来四个新变化,看看影响到你了吗?各位国企纳入社会化管理的退休职工、以及普通企业的广大退休职工要注意了10月份之后、一直到……
华为Mate50X终于要来了,HarmonyOS35000m在国产智能手机市场中,华为的高端旗舰确实有很大的碾压效应,针对国内其他友商所谓的高端旗舰来说,华为的旗舰机依旧是有实力碾压的,不管是机身的工艺设计标准,还是内在的核心技术,华为……三月的春光在今天清晨,我散步在云林的小公园内,沐浴在三月灿烂的阳光中。清晨的天气还没有逃离冬日的寒意,春天正像花蕾一样一点一点地渐渐变得浓郁。明媚的阳光与清新的微风让我心旷神怡,路上的樱……switch大屏时代来临,您还犹豫什么说起Switch游戏机,相信大多数人都不陌生,宅在家里,外出聚会,朋友之间,一个连接欢乐的桥梁。说来真巧,我朋友跟她女朋友相识相知相爱的过程,其中Switch扮演着极为重要的角……LPLIG02FPX,Xun总伤害2874,刷新下限!宁王压随着Rookie、Theshy、Ning和Baolan,在2021年冬季转会期全部离开了IG战队,这支为LPL赛区捧回了第一座S赛冠军奖杯的豪门战队,在2022年彻底沦为了一支……这三位山东籍女明星,端庄大气美若天仙,谁是你心目中的女神?文微史解读编辑微史解读提起山东,大家首先想到的除了挖掘机技术哪家强,中国山东找蓝翔以外,大概就是中央电视台那句脍炙人口的广告语好客山东欢迎您了吧。著名教育家孔……vivo登上了国内手机市场占有率第一的宝座生活vivo手机品牌史上最薄曲面屏vivo手机品牌于2021年的新品发布顺利结束,vivo先后发布了专业影像芯片V1、新系统OriginOSOcean、升级JoviInC……孩子将来的人缘好不好,其实从妈妈身上有迹可循一个良好的人缘对于每个人来说是非常重要的,无论在人生的哪个时间段,一个良好的人缘都能够使他在遇到困难时受到帮助,那么拥有好人缘的孩子一般身上有哪些特征呢?1、乐于分享……realmeGTneo闪速版到底咋样?如今只要1500元,用realme手机的系列一直让人摸不着头脑,产品线有点混乱。第一部realmeX,然后X2,一下子就到X50了,X50系列发完了有发布了一个X7系列,如今的GT系列又发布了neo……娱乐圈女星七大高难度动作唐嫣的太疼了,邓紫棋的太难了在偌大的娱乐圈里,总有那么一些明星是与众不同的。有人演技出色,演什么像什么;有人靠着颜值就能成功出圈,哪怕没有演技也能收获超高的人气,这就是流量的魅力。还有一……湖人与凯尔特人交易,获得真正的未来老大目前湖人仅仅位列西部第九,本赛季注定将会是一个失败的赛季。而更为糟糕的情况是安东尼戴维斯又伤了,这位曾经的天选之子现在成为真正的景德镇之子了。做为一支豪门球队,显然这是无法接受……三月春意绽,四月美人间人们常说,人间最美四月天。人间四月天,出自林徽因的诗句《你是人间四月天》,代表着春天已行进到了最美好的时光,仿佛一年中所有的美好都聚集在了四月:春阳温暖,春风柔软,春水荡漾,春……敬佩!武僧一龙亲自看望84岁卧床老人,无愧中国武术搏击巨星近日,据武林风方面披露,中国著名自由搏击选手武僧一龙在得知一位84岁的老人住院后想见他的消息,一龙二话不说,直接驱车到医院与老人见面,并且在病房里与老人促膝长谈,体现出了浓浓的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网