文章目录

  • Why we talk N2 based handover
  • Some basic background knowledge
  • N2 based handover Preparation phase
  • N2 based handover Execution phase
  • Indirect tunnel summary

Why we talk N2 based handover

相信大家都能轻易地读懂TS 23502的XN 切换信令流程,因为这个流程的信令交互不多。但到了N2 based handover,情况貌似变得不一样了,这个流程信令真多,而且还各种场景全部揉在一张图中,第一眼看下去让人头皮发麻。

所以,今天来聊聊整个N2 based handover信令流程,说一下我个人的理解,希望大家能对这个流程有个大概的了解,然后有需要的时候,自己再深入TS 23502去挖掘各种各样的细节。

如果你能轻易读懂这个N2 based handover的信令流程的话,那么TS 23502的其他信令流程,例如ULCL,SSC mode 3等信令流程对你来说难度也不大。

在开始分析这个N2 based handover之前,先问问自己,在这个切换的流程里要重点关注什么呢?没错,就是数据面通道是如何重新建立到target NG-RAN的。

所以整个N2 based handover的信令流程其实就是在描述:核心网的网元如何通过各种信令的交互,将上行和下行的数据面在target NG-RAN和核心网UPF之间打通。所以,你要关注NG-RAN 和 UPF 的各种FTEID信息是如何产生和交换的。

Some basic background knowledge

N2 based handover触发的条件:
由于新的无线条件、负载均衡或特定的服务都可能触发切换流程,当NG-RAN之间不存在Xn接口时或者基于Xn接口的切换流程失败,那么就会触发N2 based handover。
direct forwarding path:
直接转发路径,当source 和 target NG-RAN之间存在数据面通道时,用户面数据可以在source 和 target NG-RAN直接转发。
相对地,我们有间接转发路径,或者叫间接转发隧道。意思是,用户面数据需要在核心网绕一圈,才能从sourceNG-RAN 到 target NG-RAN。
N2 based handover Preparation phase:
准备阶段:源NG-RAN节点发起切换流程后,准备阶段主要完成的工作是目标侧核心网和无线网的资源分配,包括SMF选择新的目标UPF作为中间UPF、目标UPF和PSA UPF之间建立N9接口隧道、目标NG-RAN分配无线资源、目标NG-RAN和目标UPF之间建立N3接口隧道、目标AMF上建立UE上下文等。这个是一个资源预留的过程。
N2 based handover Execution phase:
执行阶段:源NG-RAN节点通知UE切换,UE切换后,目标NG-RAN通知目标AMF, 目标AMF通知源AMF,源AMF释放被拒绝切换的会话。目标SMF将目标UPF的信息通知PSA UPF,完成下行数据通道的切换。切换完成后,一般后续还跟随有注册流程,释放源UPF和源NG-RAN上面的资源,并释放间接数据转发隧道的资源。

N2 based handover Preparation phase


又是开局一张信令流程图,上图是切换准备阶段的截图,我在上面加了一些备注,以让您可以有个逻辑上的划分。

我今天准备聊一下,带有间接转发隧道的,有S-UPF,T-UPF,PSA-UPF的场景,这样当你遇到简化的场景时,也能轻松应对了。

切换前的用户面数据流:
在切换之前,UE的上下行数据是由UE到源NG-RAN,再到源UPF,PSA,然后出去DN。这就是截图最上面的数据流虚线。
step 1 Handover Required:
源NG-RAN发送Handover Required给源AMF,通知有用户要进行切换。
这是一个NGAP消息,Handover Required,你可以在TS 38413 9.2.3.1找到它的详细描述。它会带(Target ID, Source to Target transparent container, SM N2 info list, PDU Session IDs, intra system handover indication)。
其中,有一个PDU Session Resource List,它通过PDU Session ID 告诉AMF有哪些会话资源需要切换。同时里面有个SMF 用的IE,叫Handover Required TransFer, AMF 会透传这种xxxx_transfer后缀的IE给SMF,SMF 通过获取 Direct Forwarding Path Availability,指示是否支持直接转发路径。
step 2 选择目标AMF:
如果源AMF不能再服务UE,则源AMF选择一个可服务的目的目标AMF。详情请参考TS 23.501 6.3.5
step 3 Namf_Communication_CreateUEContext Request:
源AMF给目标AMF发送Namf_Communication_CreateUEContext Request消息发起切换资源分配流程。消息中包含用户的上下文信息,N2信息。如果源AMF和目标AMF是同一个AMF,则此步不需要。
该步骤中,重点关注一下UeContextCreateData这个结构体,在29518 6.1.6.2.41。目标AMF收到这个信令后,开始建立UE的上下文。
step 4 Nsmf_PDUSession_UpdateSMContext:
对于源NG-RAN指示的每个PDU Session,AMF发送Nsmf_PDUSession_UpdateSMContext请求给关联的SMF,建立目标AMF与SMF的联系,告知SMF(PDU Session ID, Target ID, T-AMF ID, N2 SM Information).。
PDU会话标识,表示N2切换的候选PDU会话。Target ID表示UE的位置信息。SM N2 Info包含Direct Forwarding Path Availability。在http2的json body 里面,带有hoState== PREPARING,这时SMF就知道了这个session要开始做N2 切换了。
对于切换准备阶段的所有Nsmf_PDUSession_UpdateSMContext,都可以在TS 29502 5.2.2.3.4.2 N2 Handover Preparation找到你想要的细节信息。
step 5 选择目标UPF:
SMF根据Target ID判断UE是否可以接受切换,以及UE是否移出了UPF的服务范围从而决定是否选择新的UPF。
我假设SMF选到了一个新的UPF,并且UPF的隧道FTEID都有UPF分配,而且我们不需要新的N9 Tunnel Info,所以我们跳过步骤6a.
因为SMF原先在管理着S-UPF,已经知道了PSA-UPF的N9 FTEID,所有步骤6a 6b可以跳过。
step 6c T-UPF N4 Session Establishment Request:
SFM 选择到了一个新的T-UPF,发送 N4 Session Establishment Request给UPF, 这里使用create pdr 去请求T-UPF的N3 和 N9 FTeid, 并且将PSA-UPF的N9 FTEID通过上行PDR对应的FAR带给T-UPF,这样T-UPF就知道了上行PDR检测到的数据,转发到PSA-UPF的N9 FTEID。
step 6d T-UPF N4 Session Establishment Response:
SFM 收到 N4 Session Establishment Response, 通过rsp 中的 created Pdr 获取了T-UPF的N3 和 N9 FTeid, 这个N3 FTeid 在下一步就要通过AMF告诉目标gNB,给目标gNB用来发上行数据到T-UPF。N9 FTeid 在N2 切换的执行阶段,才告诉PSA-UPF,用于转发下行数据。
SMF启动定时器,释放源UPF的资源,该定时器将会触发执行阶段的步骤13a
step 7 SMF 回复 Nsmf_PDUSession_UpdateSMContext Response:
SMF给目标AMF回复Nsmf_PDUSession_UpdateSMContext Response,消息中携带PDU会话ID,N2 SM Information。其中N2 SM Information 包含了step 6d获得的N3用户面地址和上行CN隧道ID和QoS参数。
如果直接转发数据通道不可用,N2 SM Information中还包括 Data forwarding not possible indication。
如果在step 5 中没有接受PDU Session的N2切换,则SMF不会在响应消息中携带PDU会话的N2 SM Information,以避免在目标NG-RAN上建立无线资源。

我们现在假设SMF 回复 Data forwarding not possible indication,那么下面步骤就会走向间接隧道的创建

step 8 AMF supervises:
AMF监控来自相关SMF的Nsmf_PDUSession_UpdateSMContext响应消息。等待切换候选PDU的最大延迟指示的最低值为AMF等待Nsmf_PDUSession_UpdateSMContext响应消息的最大时间。在最大等待时间超时或收到所有Nsmf_PDUSession_UpdateSMContext响应消息后,AMF继续执行N2切换流程。
step 9 T-AMF to T-RAN: Handover Request:
目标AMF根据Target ID确定目标NG-RAN。目标AMF给目标NG-RAN发送Handover Request消息,请求建立无线侧网络资源。
Handover Request 中带有((Source to Target transparent container, N2 MM Information, N2 SM Information list, Tracing Requirements)
其中 Handover Request 中的 切换类型为Intra5GS,PDU Session Resource Setup List 中带有T-UPF的N3用户面Fteid 和相关的 QoSFlow级别的QoS参数。
step 10 T-RAN to T-AMF: Handover Request Acknowledge:
目标NG-RAN回复Handover Request Acknowledge给目标AMF,此时目标NG-RAN做好接收分组数据单元的准备。消息中包括可切换的PDU会话列表和无法切换的PDU会话列表,可切换的PDU会话列表中每个PDU会话的N2 SM信息包含目标NG-RAN的N3地址和隧道信息。
step 11a AMF to SMF: Nsmf_PDUSession_UpdateSMContext Request :
步骤11 分为a-f, 该步骤主要是与目标NG-RAN、目标UPF、源UPF间相互交换隧道信息。
如果是直接转发(不建立间接转发隧道),步骤11只执行 11a 和 11f。
Nsmf_PDUSession_UpdateSMContext Request 带有PDU Session ID,hoStae: prepared,N2 Sm Inforamtion 是TS 38413 9.3.4.11 Handover Request Acknowledge Transfer。这里面带有目标gnb-ID,DL NG-U UP TNL Information 也就是目标Gnb 的N3隧道FTEID, 以及和该隧道关联的QoS Flow信息。
SMF 此时先将目标Gnb 的N3隧道FTEID存起来,到执行阶段的后半部分信令流程(步骤8a)再更新到T-upf 上。
step 11b SMF发送N4 Session Modification Request给T-UPF
这个步骤主要是要在T-UPF上建立间接转发隧道的PDR,FAR和QER等。由执行阶段的信令流程图中可以看到,间接转发是源基站发往S-UPF,再由S-UPF转发到 T-UPF, 然后T-UPF再转向T-RAN.
所以我们要在T-UPF 上,通过N4 Session Modification Request 消息,create 下行pdr,下行的far,以及该pdr 关联的Qer.
为啥不需要在T-UPF上安装一个上行pdr呢? 因为对于T-UPF来说,间接转发隧道没有上行的数据包,所以没必要。
这个create 下行pdr,pdi 里面需要申请T-UPF的N9 FTEID(假设FTEID是由UPF分配),该N9 FTEID 不同于 step 6d获得的FTEID。这个和CHOOSE有关,详情看TS 29244 5.5.3 F-TEID allocation in the UP function。pdi 的 Source Interface 为Core,表示匹配的数据包是下行的。
该create 下行pdr 对应的far 的转发目的地址为 step 11a 中获得的目标Gnb 的N3隧道FTEID。即far 里面的 Forwarding Parameters 的Destination Interface是 access,Outer Header Creation 里面填写目标Gnb 的N3隧道的信息。
qer 按照成功切换的QoS Flow 来组建。
step 11c T-UPF 回复N4 Session Modification Response:
T-UPF 接收步骤11b的规则的安装,然后返回新分配的N9隧道FTEID给SMF。
所以在step 11c之后,当S-UPF的间接隧道包转发T-UPF新分配的FTEID时,UPF 通过该teid找对应的N4 session,再通过pdi里面的Local Fteid 匹配到步骤11b中的create pdr,然后索引到对应的下行far, 将gtpu包加头转发到目标Gnb 的N3隧道
step 11d SMF to S-UPF: N4 Session Modification Request:
在我们假设的场景中,是有间接转发隧道的。所以这一步就是要在S-UPF上安装上行PDR和上行 PDR 对应的FAR以及QER。用这些N4 rules 来生成一个间接转发隧道。这个隧道的gtpu数据流是:S-Ran —>S-UPF N3口–>T-UPF N9口。
SMF通过N4 Session Modification Request 消息,create 上行pdr,转发到T-UPF的far,以及该pdr 关联的Qer.
这个create 上行pdr,pdi 里面需要申请S-UPF的N3 FTEID(假设FTEID是由UPF分配),该N3 FTEID 不同于SMF在S-UPF中已经获得的FTEID。这个各CHOOSE有关,详情看TS 29244 5.5.3 F-TEID allocation in the UP function。pdi 的 Source Interface 为ACCESS,表示配置的数据包是上行的。
该create 上行pdr 对应的far 的转发目的地址为 step 11b 中获得的目标T-UPF 的N9隧道FTEID。即far 里面的 Forwarding Parameters 的Destination Interface是 access,Outer Header Creation 里面填写目标T-UPF 的N9隧道的信息。
step 11e S-UPF to SMF: N4 Session Modification Response:
根据 step 11d 中,smf 安装的rules, S-UPF 返回间接转发隧道的N3 Fteid. SMF 在下面的步骤中,会将这个N3 Fteid带给S-Ran.
step 11f SMF to T-AMF: Nsmf_PDUSession_UpdateSMContext Response:
在间接转发的场景中,该步骤要将S-UPF的N3间接转发隧道的Fteid带给S-Ran.在29502 Figure 5.2.2.3.4.2-1: N2 Handover Preparation 步骤4a 中,可以看到http json 里面 hoState attribute set to PREPARED, N2 information 是 3GPP TS 38.413 clause 9.3.4.10 的 Handover Command Transfer IE。这个Transfer IE 里面的 DL Forwarding UP TNL Information 应该就是 S-UPF的N3间接转发隧道的Fteid 信息,然后QoS Flow to be Forwarded List 就是要转发的QoS Flow的信息列表。

在步骤11走完后,SMF通过操作UPF,已经将间接转发隧道以及要转发的Qos Flow准备好了

step 12 T-AMF to S-AMF: Namf_Communication_CreateUEContext Response:
步骤12是对步骤3的一个回复。目标AMF发送Namf_Communication_CreateUEContext Response消息,将包含下行数据隧道信息的N2 SM信息携带给源AMF。

N2 based handover Execution phase


上图是N2 HO 执行阶段的信令流程图,下面继续简单介绍一下执行阶段的各个信令。

step 1 S-AMF to S-RAN: Handover Command:
源AMF给源NG-RAN发送Handover Command消息,通知切换准备完成。消息中包括切片准备阶段从目标NG-RAN处获取的接受切换的PDU会话列表和拒绝切换的PDU会话列表,以及每个会话的N2 SM信息。如果是直接转发,SM转发信息是目标NG-RAN的N3转发隧道信息,如果是间接转发,SM转发信息是S-UPF N3转发隧道信息。
step 2 S-RAN to UE: Handover Command (UE container):
源NG-RAN把Handover Command消息发送到UE。收到这条消息后,UE将释放被目标NG-RAN所拒绝PDU会话资源。
步骤2a~2c:源NG-RAN向源AMF发送上行运行状态迁移消息。如果UE的所有无线承载都不应被以PDCP状态保存处理,则源NG-RAN可以省略发送该消息。如果有AMF迁移,源AMF通过Namf_Communication_N1N2MessageTransfer业务操作发送给目标AMF和目标AMF应答消息。源AMF或目标AMF(如果AMF迁移)通过下行运行状态迁移消息将信息发送给目标NG-RAN。
step 3 Uplink packets are sent from T-RAN to T-UPF and UPF (PSA):
我们这个场景是间接转发:数据包路径从源NG-RAN将数据转发给源UPF,源UPF转发给目标UPF(T-UPF),目标UPF(T-UPF)再转发给目标NG-RAN。
step 4 UE to T-RAN: Handover Confirm:
UE成功同步到目标小区后,向T-RAN发送Handover Confirm消息。 通过该消息,切换被 UE 认为是成功的。
上行数据经过UE发送到目标NG-RAN,再转发到目标T-UPF,然后T-UPF转发到UPF(PSA)进行发送,目标NG-RAN将缓存的下行数据发送给UE。

在步骤4走完后,UE开始在T-RAN上发送上行数据,其实上行通道在准备阶段已经建立

step 5 T-RAN to T-AMF: Handover Notify:
目标NG-RAN发送Handover Notify消息到目标AMF,通知目标AMF,UE已经位于目标小区,目标NG-RAN上切换成功。
step 6a T-AMF to S-AMF: Namf_Communication_N2InfoNotify:
目标AMF通过发送Namf_Communication_N2InfoNotify消息给源AMF,通知源AMF从目标NG-RAN上收到了Handover Notify消息。源AMF启动一个定时器来监督源NG-RAN中资源的释放
step 6b S-AMF to T-AMF: Namf_Communication_N2InfoNotify ACK:
源AMF回复Namf_Communication_N2InfoNotify ACK
step 6c S-AMF to SMF: Nsmf_PDUSession_ReleaseSMContext Request :
如果有PDU会话没有被目标AMF接受,则源AMF在收到6a步骤的N2 handover notify后,向SMF发送Nsmf_PDUSession_ReleaseSMContext Request消息触发PDU会话释放流程。
step 7 T-AMF to SMF: Nsmf_PDUSession_UpdateSMContext Request:
hoState attribute set to COMPLETED。这个消息还包含TS 38.413 clause 9.3.4.23的 Secondary RAT Data Usage Report Transfer IE。
servingNfId set to the new serving AMF Id, for a N2 handover with AMF change 而且还要考虑LADN的场景。.
step 8a SMF to T-UPF (intermediate): N4 Session Modification Request:
如果插入了新的目标UPF(T-UPF)或者重新分配了一个中间UPF,则执行此步骤。我们假设的场景是有这个步骤的,并且我们是新插入了一个T-UPF。此时,SMF将在准备阶段Step11a 收到的目标Gnb 的N3隧道FTEID,通过update 下行far 发送给T-UPF。这样下行包就可以由T-UPF转发到T-RAN。
step 8b T-UPF to SMF: N4 Session Modification Response.:
T-UPF接受FAR的更新。

我们这个场景,跳过step9

step 10a SMF to UPF (PSA): N4 Session Modification Request:
SMF将在准备阶段Step 6d 收到的目标T-UPF 的N9隧道FTEID,通过update 下行far 发送给T-UPF。这样下行包就可以由UPF(PSA)转发到T-UPF.
step 10a SMF to UPF (PSA): N4 Session Modification Request:
UPF(PSA)接受FAR的更新。
为了协助目标NG-RAN中的重排序功能,UPF (PSA) 在切换路径后立即向旧路径上的每个N3隧道发送一个或多个“结束标记”报文。源NGRAN将“结束标记”报文转发给目标NGRAN。此时,UPF (PSA)如果插入新的目标UPF(T-UPF)或重新分配一个已有的中间源UPF,则通过目标UPF(T-UPF)向目标NG-RAN发送下行数据包。
step 11 SMF to T-AMF: Nsmf_PDUSession_UpdateSMContext Response :
SMF确认收到了Handover Complete,切换流程完成。如果采用间接数据转发,则SMF启动间接数据转发定时器,用于释放间接数据转发隧道的资源。.

step 12~15属于handover后续的注册流程和转发通道释放流程。

step 12 UE发起移动性注册更新流程
详细介绍请参考注册流程,其中步骤4、5和10需要跳过.
step 13a SMF to S-UPF (intermediate): N4 Session Release Request.
step 11中间接数据转发定时器超时后,SMF给源UPF发送N4 PFCP Session Deletion Request,释放资源和间接转发通道的删除。
step 13b S-UPF to SMF: N4 Session Release Response.
源UPF回复N4 PFCP Session Deletion Response消息,确认资源和间接转发通道已经释放
step 14a AMF to S-RAN: UE Context Release Command
当step 6a中定时器超时后,AMF给源NG-RAN发送UE Context Release Command消息,释放无线侧资源
step 14b S-RAN to AMF: UE Context Release Complete
源NG-RAN释放资源后,回复UE Context Release Complete给AMF
step 15 T-UPF间接隧道的释放
在prepare阶段的step11b,我们在T-upf上建立了间接隧道,步骤15要将间接隧道所用的pdr far qer 等规则移除。
当间接转发承载定时器超时后,SMF发送N4 Session Modification Request给目标UPF(T-UPF),释放间接转发资源。
目标UPF(T-UPF)确认释放掉间接转发资源后,给SMF回复N4 Session Modification Response消息。

Indirect tunnel summary

上面已经对N2 HO的信令流程作了简单的介绍,这是基于我个人的理解做出的记录。
下面总结一下indirect tunnel N2 HO的各个阶段的上下行数据转发路径:

  • 切换前:
    上行: UE---->S-gNB---->S-UPF---->PSA-UPF---->DN
    下行: DN---->PSA-UPF---->S-UPF---->S-gNB---->UE

  • 切换执行阶段:
    上行: UE---->S-gNB---->S-UPF---->PSA-UPF---->DN
    下行: DN---->PSA-UPF---->S-UPF---->S-gNB---->S-UPF---->T-UPF---->T-gNB---->UE

  • 切换完成后:
    上行: UE---->S-gNB---->S-UPF---->PSA-UPF---->DN
    下行: DN---->PSA-UPF—>T-UPF---->T-gNB---->UE

这N2切换的信令真多,打字有点累。无语了。。。。。

5G 核心网 Inter NG-RAN node N2 based handover 信令流程相关推荐

  1. 【5G核心网】 Handover procedures Execution phase切换流程执行阶段

    Handover procedures Execution phase 执行阶段主要是释放原来基站资源,把 UE 在新的基站 Figure 4.9.1.3.3-1: inter NG-RAN node ...

  2. 【5G核心网】 Handover procedures Preparation phase切换流程准备阶段

    切换流程用来为一个 UE 使用 Xn 或者 N2 参考点从源 NG-RAN 到目标 NG-RAN 进行切换.触发的条件可以是一个新的无线条件,负载均衡或者由于特定服务.语音存在 QoS 流的情况下,源 ...

  3. 【5G核心网】5G Non 3GPP接入-N3IWF

    5G 核心网支持通过非 3GPP 接入网(例如 WLAN访问).本节仅描述了在 NG-RAN 外部部署的非 3GPP 接入网的支持(称为"独立"非3GPP接入).非 3GPP接入网 ...

  4. 【5GC】开源5G核心网(Open5GS)架构详解

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G ...

  5. 5G 核心网 5GS to EPS handover for single-registration mode with N26 interface

    在当前的环境下,5G 核心网组网后,必然会与现有的4G EPC 进行交互.在23501当中有5G 和 EPC 交互架构图.其中需要关注的是N26接口.(如下图所示) 那么当 UE 在4G 和 5G 之 ...

  6. 5G核心网SBA架构

    作者:柒号华仔 个人主页:欢迎访问我的主页 个人信条:星光不问赶路人,岁月不负有心人. 个人方向:专注于4G/5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关 ...

  7. 5G核心网之SBA架构(面向服务)

    前言 随着技术演进和发展,云原生提出的"微服务"概念得到了大家的认可,微服务概念指将原本具有多个功能的集合体分拆为多个具有独立功能的个体,每个个体都具有自己的微服务.5GC将微服务 ...

  8. 【云原生与5G】微服务加持5G核心网

    作者:柒号华仔 个人主页:欢迎访问我的主页 个人信条:星光不问赶路人,岁月不负有心人. 个人方向:专注于5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我, ...

  9. 【5G核心网】控制面与用户面协议栈

    本章节指定 5GS 实体之间的整体网络协议栈,比如在 UE 和 5GC 网络功能,在 5G-AN 和 5GC 网络功能,或者在 5GC 网络功能之间 1. 控制平面--5GAN和5G核心网:N2 N2 ...

最新文章

  1. libvirt(virt-install命令介绍)
  2. JAVA性能诊断与调优
  3. nightwatchjs --Expect element to not include text
  4. MySQL的binary类型操作
  5. 亚马逊正式发布关系型数据库Amazon Aurora
  6. Android -- 自定义权限
  7. 《大数据》第1期“论坛”——数据技术时代的未来
  8. 二叉树节点数目计算的两种思路
  9. 摄像头,一万块三个,嘿嘿!欢迎来到一年一度iPhone 吐槽大会!
  10. 能在市场上大概率赚钱的人类型
  11. java怎么从数据库中查询_java – 从数据库中检索的实体与查询中的情况相同
  12. swagger默认访问路径_spring-boot集成swagger-ui修改默认访问路径
  13. 最短路 Codeforces Round #103 (Div. 2) D. Missile Silos
  14. 网页导出pdf不完整_网页怎么打印成PDF文件?使用这款工具轻松实现
  15. 7-20 | 打印九九口诀表
  16. 深职计算机学院官网,深圳职业中专
  17. 【Excel】如何使用RegexString正则表达式
  18. 问题xxx: TypeError: __randomstate_ctor() takes from 0 to 1 positional arguments but 2 were given
  19. 学习日记之三:RFC2198文档阅读
  20. js中getMonth()+1

热门文章

  1. android 隐藏文本,Android使用facebook隐藏库加密plaint文本
  2. 猿创征文|laravel中JWT的使用
  3. Java问题——can not be represented as java.sql.Date 错误解决
  4. 企业CDN缓存加速原理
  5. 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)
  6. intel显卡驱动安装时报错【无法为此计算机验证正在安装的驱动程序】
  7. css玻璃雨滴效果,纯css实现窗户玻璃雨滴逼真效果
  8. python制作qq登录界面_使用Python编写一个QQ办公版的图形登录界面
  9. 活动策划书用什么计算机软件,各行业主流设计软件有哪些?(设计人员请进)...
  10. 【STM32】时钟系统RCC