NEWGTLD,如何评价GO语言?
Go语言,作为编程语言的后生,站在巨人的肩膀上,吸收了其他一些编程语言的特点。
以下内容摘自官方网站:
一、思想
Less can be more
大道至简,小而蕴真
让事情变得复杂很容易,让事情变得简单才难
深刻的工程文化
二、核心特性
Go语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,体验Go的核心特性。
2.1 并发编程
Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其在未来进入高并发高性能场景的重要筹码。
不同于传统的多进程或多线程,golang的并发执行单元是一种称为goroutine的协程。由于在共享数据场景中会用到锁,再加上GC,其并发性能有时不如异步复用IO模型,因此相对于大多数语言来说,golang的并发编程简单比并发性能更具卖点。在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。协程经常被理解为轻量级线程,一个线程可以包含多个协程,共享堆不共享栈。协程间一般由应用程序显式实现调度,上下文切换无需下到内核层,高效不少。
协程间一般不做同步通讯,而golang中实现协程间通讯有两种:
共享内存型,即使用全局变量+mutex锁来实现数据共享;
消息传递型,即使用一种独有的channel机制进行异步通讯。
对比JAVA的多线程和GO的协程实现,明显更直接、简单。这就是GO的魅力所在,以简单、高效的方式解决问题,关键字go,或许就是GO语言最重要的标志。
高并发是Golang语言最大的亮点。
2.2 内存回收(GC)
从C到C++,从程序性能的角度来考虑,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是随着而来的是程序员对内存使用上的很谨小慎微的考虑。因为哪怕一点不小心就可能会导致“内存泄露”使得资源浪费或者“野指针”使得程序崩溃等,尽管C++11后来使用了智能指针的概念,但是程序员仍然需要很小心的使用。后来为了提高程序开发的速度以及程序的健壮性,java和C#等高级语言引入了GC机制,即程序员不需要再考虑内存的回收等,而是由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。
GC过程是:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时起一个专门gorountine回收内存到空闲list中以备复用,不物理释放。物理释放由专门线程定期来执行。
GC瓶颈在于每次都要扫描所有对象来判活,待收集的对象数目越多,速度越慢。一个经验值是扫描10w个对象需要花费1ms,所以尽量使用对象少的方案,比如我们同时考虑链表、map、slice、数组来进行存储,链表和map每个元素都是一个对象,而slice或数组是一个对象,因此slice或数组有利于GC。
GC性能可能随着版本不断更新会不断优化,这块没仔细调研,团队中有HotSpot开发者,应该会借鉴jvm gc的设计思想,比如分代回收、safepoint等。
内存自动回收,再也不需要开发人员管理内存
开发人员专注业务实现,降低了心智负担
只需要new分配内存,不需要释放
2.3 内存分配
初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中,对象分配空间时从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。
2.4 编译
编译涉及到两个问题:编译速度和依赖管理
目前Golang具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)。
依赖管理方面,由于golang绝大多数第三方开源库都在github上,在代码的import中加上对应的github路径就可以使用了,库会默认下载到工程的pkg目录下。另外,编译时会默认检查代码中所有实体的使用情况,凡是没使用到的package或变量,都会编译不通过。这是golang挺严谨的一面。
2.5 网络编程
由于golang诞生在互联网时代,因此它天生具备了去中心化、分布式等特性,具体表现之一就是提供了丰富便捷的网络编程接口,比如socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口)、http用http.Get/Post()、rpc用client.Call('class_name.method_name', args, &reply),等等。
2.6 函数多返回值
在C,C++中,包括其他的一些高级语言是不支持多个函数返回值的。但是这项功能又确实是需要的,所以在C语言中一般通过将返回值定义成一个结构体,或者通过函数的参数引用的形式进行返回。而在Go语言中,作为一种新型的语言,目标定位为强大的语言当然不能放弃对这一需求的满足,所以支持函数多返回值是必须的。
函数定义时可以在入参后面再加(a,b,c),表示将有3个返回值a、b、c。这个特性在很多语言都有,比如python。
这个语法糖特性是有现实意义的,比如我们经常会要求接口返回一个三元组(errno,errmsg,data),在大多数只允许一个返回值的语言中,我们只能将三元组放入一个map或数组中返回,接收方还要写代码来检查返回值中包含了三元组,如果允许多返回值,则直接在函数定义层面上就做了强制,使代码更简洁安全。
2.7 语言交互性
语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。
在Go语言中直接重用了大部份的C模块,这里称为Cgo.Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。开发者基本上可以完全忽略这个Go语言和C语言的边界是如何跨越的。
golang可以和C程序交互,但不能和C++交互。可以有两种替代方案:1)先将c++编译成动态库,再由go调用一段c代码,c代码通过dlfcn库动态调用动态库(记得export LD_LIBRARY_PATH);2)使用swig(没玩过)
2.8 异常处理
golang不支持try...catch这样的结构化的异常解决方式,因为觉得会增加代码量,且会被滥用,不管多小的异常都抛出。golang提倡的异常处理方式是:
普通异常:被调用方返回error对象,调用方判断error对象。
严重异常:指的是中断性panic(比如除0),使用defer...recover...panic机制来捕获处理。严重异常一般由golang内部自动抛出,不需要用户主动抛出,避免传统try...catch写得到处都是的情况。当然,用户也可以使用panic('xxxx')主动抛出,只是这样就使这一套机制退化成结构化异常机制了。
2.9 其他一些有趣的特性
类型定义:支持var abc = 10这样的语法,让golang看上去有点像动态类型语言,但golang实际上时强类型的,前面的定义会被自动推导出是int类型。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
简单来说,Go是一门写起来像动态语言,有着动态语言开发效率的静态语言。
一个类型只要实现了某个interface的所有方法,即可实现该interface,无需显式去继承。
Go编程规范推荐每个Interface只提供一到两个的方法。这样使得每个接口的目的非常清晰。另外Go的隐式推导也使得我们组织程序架构的时候更加灵活。在写JAVA/C++程序的时候,我们一开始就需要把父类/子类/接口设计好,因为一旦后面有变更,修改起来会非常痛苦。而Go不一样,当你在实现的过程中发现某些方法可以抽象成接口的时候,你直接定义好这个接口就OK了,其他代码不需要做任何修改,编译器的自动推导会帮你做好一切。
不能循环引用:
即如果a.go中import了b,则b.go要是import a会报import cycle not allowed。好处是可以避免一些潜在的编程危险,比如a中的func1()调用了b中的func2(),如果func2()也能调用func1(),将会导致无限循环调用下去。
defer机制:
在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。
【划重点】可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性。
“包”的概念:
和python一样,把相同功能的代码放到一个目录,称之为包。包可以被其他包引用。main包是用来生成可执行文件,每个程序只有一个main包。包的主要用途是提高代码的可复用性。通过package可以引入其他包。
编程规范:
GO语言的编程规范强制集成在语言中,比如明确规定花括号摆放位置,强制要求一行一句,不允许导入没有使用的包,不允许定义没有使用的变量,提供gofmt工具强制格式化代码等等。奇怪的是,这些也引起了很多程序员的不满,有人发表GO语言的XX条罪状,里面就不乏对编程规范的指责。要知道,从工程管理的角度,任何一个开发团队都会对特定语言制定特定的编程规范,特别像Google这样的公司,更是如此。GO的设计者们认为,与其将规范写在文档里,还不如强制集成在语言里,这样更直接,更有利用团队协作和工程管理。
交叉编译:
比如说你可以在运行 Linux 系统的计算机上开发运行 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
三、功能
此处我们说个小段子:
很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己。然后在2009年,go语言诞生。以下就是这些大牛所罗列出的Go要有的功能:
规范的语法(不需要符号表来解析)
垃圾回收(独有)
无头文件
明确的依赖
无循环依赖
常量只能是数字
int和int32是两种类型
字母大小写设置可见性(letter case sets visibility)
任何类型(type)都有方法(不是类型)
没有子类型继承(不是子类)
包级别初始化以及明确的初始化顺序
文件被编译到一个包里
包package-level globals presented in any order
没有数值类型转换(常量起辅助作用)
接口隐式实现(没有“implement”声明)
嵌入(不会提升到超类)
方法按照函数声明(没有特别的位置要求)
方法即函数
接口只有方法(没有数据)
方法通过名字匹配(而非类型)
没有构造函数和析构函数
postincrement(如++i)是状态,不是表达式
没有preincrement(i++)和predecrement
赋值不是表达式
明确赋值和函数调用中的计算顺序(没有“sequence point”)
没有指针运算
内存一直以零值初始化
局部变量取值合法
方法中没有“this”
分段的堆栈
没有静态和其它类型的注释
没有模板
内建string、slice和map
数组边界检查
最后介绍下大牛真身,最大牌的当属B和C语言设计者、Unix和Plan 9创始人、1983年图灵奖获得者Ken Thompson,这份名单中还包括了Unix核心成员Rob Pike(go语言之父)、java HotSpot虚拟机和js v8引擎的开发者Robert Griesemer、Memcached作者Brad Fitzpatrick,等等。
四、Go 语言能做什么
Go 语言从发布 1.0 版本以来备受众多开发者关注并得到广泛使用,Go 语言的简单、高效、并发特性吸引了众多传统语言开发者的加入,而且人数越来越多。
鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web 应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
分布式系统、数据库代理器、中间件等,例如Etcd。
网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
数据库操作
开发云平台,目前国外很多云平台在采用Go开发。
五、国内外有哪些企业或项目使用Go语言
Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
云计算基础设施领域,代表项目有:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等
基础软件领域代表项目有:tidb、influxdb、cockroachdb等。
微服务领域代表项目有:go-kit、micro、monzo bank的typhon、bilibili等。
互联网基础设施领域有:以太坊、hyperledger等。
采用Go的一些国外公司,如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司;
采用Go开发的国内企业:如阿里云、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。
下面着重介绍几个:
Docker
简介:Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理服务器上快速运行一个或多个实例。基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。例如,启动一个 CentOS 操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。项目链接:https://github.com/docker/dockerKubernetes
简介:Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。
项目链接:https://github.com/kubernetes/kubernetes
etcd
项目链接:https://github.com/coreos/etcd
简介:一款分布式、可靠的 KV 存储系统,可以快速进行云配置。什么是最致命的有毒动物?
世界上最致命的动物是蚊子,它以每年杀死725000人的数据高居“世界危害最大动物排名”的榜首,但是蚊子是无毒的,它只是会传播细菌和病毒而已。
来源:2014年Gates Notes那么,在自然界中,什么是最致命的有毒动物呢?我认为这个问题不能单单从毒性一方面考虑,因为有毒动物的毒性固然重要,但是排毒量以及伤人多寡都是“最致命”的影响因素。从上面杀人数量最多的动物排行中,我们能看到“毒物”中毒蛇是最靠前的,仅次于蚊子和人类。
因此,下面我们就来从毒蛇中找到毒性又强,杀人数量最多、排毒量最大的蛇,符合这些条件的蛇无疑就是世界上最致命的有毒动物了。(下图为传统的“五毒”)
世界上最毒的动物?美国《世界野生生物》在征求了世界各地顶级的生物学家的意见后,整理出了“世界十大毒王”,在这“十大毒王”中在澳大利亚分布的就有7个,其中就包含了目前已知的世界上最毒的蛇-内陆太攀蛇以及最毒的动物澳洲箱水母。
说到毒性,相信经常看猎奇君蛇类科普文的小伙伴都已经很熟悉,在这里我还是简单地说一下,让不太了解的小伙伴做一下简单的了解。毒性都有一个相对准确的数值,它是经过科学家们将某种毒物的毒液注入到一批小白鼠的体内,然后观察和计算出杀死一半以上的小白鼠所需要的最小的毒液剂量,单位为mg/kg,英文缩写LD50,数值越接近零,毒性越强。
其中内陆太攀蛇的LD50为0.025mg/kg,澳洲箱水母的LD50为0.011mg/kg,所以世界上最毒的动物是澳洲箱水母,最毒的毒蛇是内陆太攀蛇。(大家如果搜索一下“世界十大毒王”会看到第二名是艾基特林海蛇,但其实它就是青环海蛇,LD50为0.17,连银环蛇的毒性都不如,所以人家才加一句“排名仅供参考”;下图中是小白鼠毒性测试常用的方法:皮下注射)
最毒不等于杀人最多在上面两种最毒的动物中,澳洲箱水母一次的毒素足以杀死60位成年人,但是澳洲箱水母与人的互动相对较少,而且大多数都是被局部刺伤的,死亡的案例比较的少。
至于内陆太攀蛇,它的毒性仅次于澳洲箱水母,而且生活在陆地上的它们按理说更容易接触到人,但是它们在澳洲主要分布在中部的沙漠地区,这里人迹罕至,所以到目前为止,没有一例内陆太攀蛇杀人的案例发生。
由此可见,毒性最强的动物不一定是最致命的,因为还要考虑伤人的数量才行。
真正的最致命的有毒动物?在2014年Gates Notes给出的数据看,毒蛇每年杀死约5万人,这五万人其实是五大洲所有毒蛇杀人的数量总和,由于不同的蛇栖息地迥异,所以每一个大洲其实都有“杀人王”存在,由于北美以及欧洲的毒蛇相对较少,南美的毒蛇又主要分布在人迹罕至的热带雨林中,所以,我们只看一下毒蛇分布较为密集且种类较多的大洋洲、非洲以及亚洲。(下图为眼镜蛇科蛇类的世界分布图)
首先是大洋洲。大洋洲虽然是五大洲中最小的洲,但是上面的毒蛇可不少,而且世界上最毒的五种蛇均分布在大洋洲,确切地说是澳大利亚。在如此多的剧毒蛇类中,伤人数量最多的就是毒性排名第二的东部拟眼镜蛇。
虽然关于东部拟眼镜蛇伤人数据没有官方的具体统计,但是根据国外网站统计了80名医生的接诊数据看,每年被东部拟眼镜蛇咬伤的人数在100人以上,其中致死率在31-40%之间。因此,东部拟眼镜蛇虽然毒性比内陆太攀蛇差,但是它的致命性更强。(生活在森林、林地、稀树大草原及干燥的灌丛林中的东部拟眼镜蛇与人相遇的机会更多,而且本身东部拟眼镜蛇的攻击性就很强)
其次是非洲。非洲也是毒蛇云集的地方,这一点从上面眼镜蛇科蛇类的分布图就可以看出来了,非但如此,非洲的蝰蛇种类和数量也不在少数。在非洲,最毒的毒蛇是有着“死神”之称的黑曼巴蛇,它的LD50为032mg/kg。
但是,黑曼巴蛇却不是杀人最多的蛇,在非洲杀人最多的蛇是鼓腹咝蝰,这是一种几乎全非洲都有分布的蝰蛇(除了沙漠和热带雨林),虽然它的LD50只有4-7mg/kg。但是它有着平均250毫克、最大700毫克的单次排毒量,属于排毒量前五的毒蛇。
鼓腹咝蝰完美地诠释了“毒性不够,毒量来凑”,凭借着巨大的排毒量和广泛的分布,鼓腹咝蝰成功的超越了众多毒蛇中伤人数最多的毒蛇。在非洲有约90%的毒蛇咬伤是鼓腹咝蝰干的。
从这个角度看,鼓腹咝蝰的毒性虽然不及东部拟眼镜蛇,但是它要比后者更致命。
最后是亚洲。亚洲是五大洲中面积最大的,同样也是毒蛇种类和数量最多的,不过,由于蛇是变温动物,所以它们的分布会随着温度带的变化而变化,从整体上看,东南亚和印度地区是毒蛇密度最大的区域,尤其是印度,这里不但蛇多,玩蛇的人也多,所以才有了世界毒蛇看亚洲,亚洲毒蛇看印度的说法。
当然,这个说法主要是针对毒蛇伤人,在亚洲,每年被毒蛇咬伤的人超过十万,其中有超过一半集中在印度,而且在这些伤人的毒蛇中,最常见的就是锯鳞蝰蛇。(下图为蝰蛇的世界分布图)
锯鳞蝰蛇是蝰科锯鳞蝰属下的毒蛇,它的毒性到现在没有一个确切的数值,这并不是因为科学家们没有测试过,恰恰相反的是因为测试的太多,所以数据波动太大,从0.44-24.1mg/kg,都是科学家们通过小白鼠的注射实验得出的。不过,从最强的毒性来看,它已经是蝰蛇中毒性比较强的存在了。虽然锯鳞蝰蛇分布在亚洲和非洲,但它主要集中在印度次大陆(印度、斯里兰卡、孟加拉国及巴基斯坦),而它咬人最多的区域集中在印度。据统计,锯鳞蝰蛇每年咬死约20000人,其中大部分集中在印度。总结一下世界上最毒的动物是澳洲箱水母,但是箱水母伤人较多,致死得较少,所以不能算是最致命的“毒物”。从已知的数据看,毒蛇是最致命的有毒动物,但是在如此多的毒蛇中,并不是毒性越强越致命,而且那些分布又广、毒性可能不强,但排毒量巨大的毒蛇才是最致命的毒物,也就是毒王,符合这一条件的就是锯鳞蝰蛇无疑了(世界范围内伤人最多、杀人最多)。
ltd域名为什么便宜?
因为ltd域名可以在国内注册所以便宜
Ltd是国际通用域名,是“责任公司”含义,是newgTLD域名的一种。于2016年6月23日开放注册,2017年3月8日通过国家工信部的备案审批,可以在中国境内合法注册和建站使用。
World是什么意思?
New World n.新世界,新大陆 新世界;新世界大酒店;新天地;新的世界 Old World 英 [ˈəʊldˈwɜ:ld] 美 [ˈoldˈwɚrld] n.旧大陆,东半球 旧大陆;旧世界;东半球;东半球的
5g注册流程详解?
如果UE的Registration,Request消息携带5g-GUTI进行注册,并且AMF发生了变化,此时新的AMF会向UE原来注册的AMF请求UE上下文信息,包括SUPL、GPSL、5GMM
Capability等参数。
new,AME采用POST方法调用old
AME的Namf_Communication_UEContextTransfer服务。具体使用的URI格式为:
{apiRoot}/namf-comm/.<apiVersion>/ue-contexts/{ueContextld}/transfer
调用该服务携带的请求消息内容为:UeContextTransferReqData。
注:
(1)通用的URI结构为:
{apiRoot}/<apiName>/<apiVersion>/<apiSpercificResourceUriPart>
(2)对于SBI接口采用POST方法的区别
服务的生产者选择资源的标识符和URI,则采用POST方法;服务的消费者选择资源的标识符和URI,则采用PUI方法。
该字段和我们日常上网,在IE地址栏中输入的内容一样,以Http或者HTTPS开头的地址,后面是IP地址和端口号等信息;
该字段和我们日常上网,在IE地址中输入的内容一样,以http或者HTTPS开头的地址,后面是IP地址和端口号等信息;
AMF上用于信息传递的API名称。其它API名字为:“namf-mt”、“namf-loc”、“namf-evts”
目前在R16版本中全部为“v1”,后续如果有大的功能变更,可能会有更新的版本。
请求UE,Context的固定值。
请求的UE,Context的标识,可以为5G-GUTI、SUP或者PEI,使用的格式如下:(1)5G-GUTI:5g-guti-[0-9]{5,6}[0-9a-FA-F]{14}
(2)SUPI:(imsi-[0-9]){5,15}|nai-,+|.+)
(3)(IMEI-[0-9]){15}|imeiv-[0-9]{16}|.+
3Gpp使用正则表达式进行描述,我们只需要知道对应的标记(5g-guti、imsi、nai、imei、imeiv)加上短横线,再加上具体的值即可。IMEI和IMEISV用于紧急注册,目前在国内不会遇到。我们能够遇到的基本就是5g-guti或者IMSI。
传递已经存在的UE,Context的方法。其它的可能方法有:transfer-updata、release、assign-ebi。
SBI接口的消息内容采用JSON编码。