turn协议的工作原理

turn协议的工作原理,第1张

a) 客户端A向STUN Port发送Allocate请求(图中绿色部分)
b) STUN服务器接收到客户端A的Allocate请求,服务器一看是Allocate请求,则根据relay端口分配策略为A分配一个端口。
c) 服务器发送response成功响应。在该response中包含XOR-RELAYED-ADDRESS属性。该属性值就是A的relay端口的异或结果。
d) 客户端接收到response后,就知道了自己的relay地址。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户 端,只要将数据发送到A的relay地址就可以了,具体的转发原理请看下一小节。

任何想要联系客户端A的人,只要知道客户端A的relay地址就可以了。

如上图所示:因为客户端A位于NAT后,所以其他客户端无法和A建立直接的通信。但是客户端A在STUN服务器上申请了一个端口(上图中:A的relay端口),其他客户端想要和A通信,那么只需要将信息发送到“A的relay端口”,STUN服务器会将从relay端口接收到的信息通过STUN Port发送给A。

A应答其他客户端发来的消息的时候,是通过原路返回的。

思考
1STUN服务器为什么不直接从A的relay端口把数据转发给A呢(如下图所示)?而非要从STUN端口发送?

STUN服务器给客户端A分配的relay地址都具有一定的有效时长,可能是30秒或者1分钟或者几十分钟。客户端如果需要STUN服务器一直为它开启这个端口,就需要定时的向STUN服务器发送请求,该请求用刷新relay端口的剩余时间。
在标准的TURN(RFC 5766)协议中,客户端A向STUN服务器发送Allocate请求,STUN服务器在响应消息中添加了一个“LifeTime”的属性,该属性表示relay的存活时间。 客户端需要在relay的存活时间内周期性的调用REFRESH请求,服务端接收到REFRESH请求后,刷新剩余时间;当REFRESH请求中的lifetime属性为0时,说明是客户端主动要求关闭relay地址。

由于与STUN服务器通信使用的是UDP,所以为了保持一个长连接,需要客户端周期性的向STUN服务器的STUN Port发送心跳包。
周期性心跳包的目的就是,使得NAT设备对客户端A的反射地址(Server Reflexive Address)一直有效。使得从STUN Port发送的数据能通过A的反射地址到达A。此处不理解的可以查阅“NAT 类型的分类以及NAT的作用”。
此处解释了,7223中的第一个问题,因为客户端A没有和relay Port保活,又由于NAT的特性,数据直接通过relay port转发给A时,NAT直接就丢弃了,所以A是收不到的。所以数据必须经过STUN服务器的STUN Port发送。

如上图所示是B主动给A发消息:“Hello”,A回应“Hi”的过程。
序号1、2、3、4、5为B的发送请求(蓝色箭头方向);
序号6、7、8、9、10为A的回应,原路返回(绿色箭头方向)。
注意:在“Hello”发送的过程中,1、2阶段时,发送的数据为裸的UDP数据。在4、5过程中,是被STUN协议包装过的“Hello”,称之为Data indication。
同样在“Hi”发送的过程中,6、7阶段为被STUN协议包装过的“Hi”,称之为Send indication,9、10是裸的UDP数据。
在4、5阶段,由于数据是从STUN Port转发下来的,为了能够让客户端A知道这个包是哪个客户端发来的,所以,STUN 协议对“Hello”进行了重新的包装,最主要的就是添加了一个XOR-PEER-ADDRESS属性,由裸数据包装成STUN协议的过程,我们称之为添加了STUN头。XOR-PEER-ADDRESS的内容就是客户端B的反射地址(Server Reflexive Address)。
在6、7阶段,A的响应原路返回,为了能够让A的relay port知道最终发往哪个客户端,因此也为“Hi”添加了STUN头,也是添加了XOR-PEER-ADDRESS属性,内容就是客户端B的反射地址(Server Reflexive Address)。这样A的relay port就知道“Hi”的目的地址。
第3阶段是:从A的relay端口收到数据,添加STUN头后,最后从STUN Port 发出的过程。
第8阶段是:从STUN Port 接收到带STUN 头的数据,去掉STUN头,最后从A的relay端口发出的过程。

客户端B主动发送信息给A的交互流程如上图所示,那么客户端A主动发送信息给客户端B的交互流程是怎样的呢,你能画出来吗?
要知道客户端A主动发消息给客户端B,应该将消息发往客户端B的relay port哦。。

魔兽私服服务器架设完全资料①
一服务器安装
1首先下载服务器端wowWDDG_Identity
2安装,一直按照说明,下一步就可以,注意硬盘空间不要小于35G
3装完以后他会提醒你选择wow目录,选择你安装的客户端目录即可。或者运行/maps/BatCreatorexe也可以
4然后运行,开始解压地图,注意第一个选择Y,第二个选择N
5在安装服务器端的目录下建立accounts目录,运行Account Creatorexe建立帐号
6运行IP-Configurationexe定义自己的ip和一些服务器属性,包括回血,回魔速度,服务器类型,自动保存等界面上的英文很好懂,真的不懂就查查金山词霸好了,呵呵!
7最后运行服务器即可。
二服务器常用设置
很多服务器新人出生钱的问题(那个出来可以卖10银币变10金币的改法):
修改scripts/itemsscp
找到[item 40000]
class=12
level=1
material=-1
model=3331
name=10 Silver Certificate 修改为10 GOLD Certificate
quality=1
buyprice=1000 修改为100000
sellprice=1000 修改为100000
stackable=100
1魔兽私服服务器架设完全资料经验值获得倍率修改
修改文件:/scripts/emuconf, /scripts/startuptcl
修改步骤:
(1) emuconf中修改save_text_ppoints=yes
(2) startuptcl中set xp [expr { 20+((($victim_level/4)+5)$victim_level)倍率 }],倍率是一个你想获得经验值得倍率,应该是数字
2怪物掉宝率修改
修改文件:/scripts/creaturesscp
(1) creaturesscp 文件里的loot=xxx xxx
前面一个数是物品代码,后面一个就是爆率
比如loot=3300 22620001 就是代码为3300的物品 爆率是22620001
其中3300是代表/scripts/itemsscp中的物品代码
3地图上增加新NPC的方法
(1) 需要用GM帐号进入游戏到需要增加新NPC的地点
(2) addspawn 99999 在GM站立的地方安放一个NPC的刷新点。
(3) setspawndist 2 4 该刷新点刷新的怪物自主移动范围为2-4 yards
(4) setspawntime 60 300 该刷新点刷新怪物的时间间隔为 60-300秒。
(5) 出现小人(既刷新点)等几秒钟 出现新NPC
(6) 清除刷新点,游戏里选定你要删除的小人,输入del即可
4如何备份帐号信息
(1) 备份accounts文件夹下的所有帐户文件
(2) 备份saves文件夹下的playerssave
5骑乘指南
(1) 用GM帐号进入游戏
(2) add xxx 其中xxx为坐骑代码(附C)
(3) learn xxx 其中xxx为技能代码(附C)
6魔兽私服如何学习穿皮甲,链甲,板甲
(1) 用GM帐号进入游戏
(2) 选中需要学习穿装技能的人物
(3) 然后输入 learnsk xxx 其中xxx代表需要学习的技能代码
也可以修改用户的存档这个在下面的文件分析中会提到的
(4) 布甲技能代码 415 皮甲技能代码 414 链甲技能代码 413 板甲技能代码 293
7如何瞬移去指定地点
(1) 用GM帐号进入游戏
(2) gotrigger XXX 这里XXX是个数字,代表地区代码(附D)
8如何增加各种物品到背包中
(1) 用GM帐号进入游戏
(2) add xxx 这里xxx是一些数字, 代表各种物品代码(附B)
7如何迅速升级
(1) 用GM帐号进入游戏
(2) 要先点选需要升级的人物
(3) setxp xxx 这里xxx是一些数字, 代表需要增加的经验值
(4) 或者 setlevel xx 这里xxx是一些数字, 代表你想要的级数
8如何刷钱
(1) 用GM帐号进入游戏
(2) add 944 1000 是N个杖~卖到商店2000+金
9如何修改各物品价格
修改文件:/scripts/itemsscp
(1) 在itemsscp文件中修改物品的sellprice=即可
提示:你可以用UltraEdit软件打开,因为可以用正则表达式进行查找
10如何修改个技能学习的价格
修改文件:/scripts/spellcostscp
(1)在spellcostscp文件中修改price即可
提示:你可以用UltraEdit软件打开,因为可以用正则表达式进行替换
11如何修改人物的属性
修改文件:/saves/playerssave
(1) 查找需要修改的人物名称 NAME=人物名称
(2) 修改你需要修改的数据即可(那些英文很简单的)
注意: 修改时需要先关闭服务器端,修改好以后再启动服务器即可
三服务器端文件分析
/accounts/ 放置所有帐号
/logs/ 放置服务器的运行记录
/saves/ 放置服务器端的人物保存,地图保存等记录
/scripts/ 放置一些服务器的脚本文件
/maps/ 放置了服务器端的地图
/saves/playerssave 这个文件中主要是保存游戏中各个人物的信息
文件中的部分内容解释
[OBJECT]
GUID=0720C89
LEVEL=42 //人物等级
XYZ=-3623293701 -2347990967 91682785 4186294 //人物所在的地图坐标
MAXHEALTH=1494 //生命值
MAXPOWERS=2212 1000 0 500 0 //最大能量
SIZE=1300000 //人物形状大小
XP=28238 //经验值多少
MONEY=7087 //所拥有的钱多少,以铜币为单位
NAME=Bloodtears //人物名称,这个可以作为修改指定人物的索引
RACE=6 //在/scripts/definesscp文件中对种族的宏定义,这里的6表示种族牛头人(tauren)
CLASS=11 //在/scripts/definesscp文件中对职业的宏定义,这里的11表示职业德鲁伊(druid)
BINDPOINT=1 215 -2917580078 -257980011 52996799 //游戏中你绑定的地点,也就是你死后灵魂出现的地点
SPELL=6478 0 //你掌握的魔法

SKILL=415 1 1 //你掌握的技能,包括能够穿装备的技能! 这里的415代表能够穿布甲
//你可以添加SKILL=413 1 1使该人物能够穿链甲,而414(布甲),293(板甲),412(盾牌) 其他类推即可

QUEST=5723 0 0 0 0 0 //你的任务代码
/scripts/areatriggersscp 这个文件中主要是地区的代码
文件中的内容典型的为:
[areatrigger 1740] //地区代码为1740
pos=1 -7874180176 -1806300049 -271459015 //地图中的坐标
name=The Marshlands - Un'goro Crater //地区名称
/scripts/classesscp 这个文件中主要是定义各个种族和职业的原始属性
如果你要修改一个种族或一个职业的初始属性,以及人物出生时携带者的物品,你可以修改这个文件即可
本文件中都有详细的英文注释,只要懂英语的应该可以看懂的,我在这里不再罗嗦了
这里只举两个简单的例子,抛砖引玉
目标1:使战士出生时就可以穿板甲
步骤:
(1) 找到[class #CLASS_WARRIOR]条目,该条目下面的数据代表战士出生时的初始属性
(2) 找到//Armor Proficiencies条目,该条目下面的数据代表战士出生时掌握的装备技能
(3) 你可以找到skill=415 1 1 // Cloth
skill=414 1 1 // Leather 代表战士出生时就可以穿布甲和皮甲
(4) 添加 skill=413 1 1 //链甲
skill=293 1 1 //板甲
skill=412 1 1 //盾牌 来使战士出生时就可以使用链甲,板甲,盾牌
目标2:使人族的战士出生时携带一匹马
步骤:
(1) 找到[startitems #RACE_HUMAN #CLASS_WARRIOR]条目,该条目下的数据代表人族战士出生时携带的物品,初始魔法和技能
(2) 其中item=26 25 代表在人物的第26个位置放置代码为25的物品,代码为25的物品你可以在itemsscp中查到
(3) 添加item=28 13334 //代码13334代表Green Skeletal Warhorse
/scripts/creaturesscp 这个文件中定义地图上所有NPC的属性
如果你要添加修改NPC,你可以修改这个文件即可包括你可以添加一个卖蓝色装备的NPC,也可以修改某NPC的装备爆率以及伤害值等一系列属性
文件中的典型内容为:
[creature 6] //NPC的代码,如你可以在addspawn 6 来添加该NPC到指定地点
name=Kobold Vermin //NPC的名字
attack=1986 2185 //NPC的攻击伤害值
bounding_radius=0561000 //绑定范围,也就是说该NPC在0561yards范围内将攻击玩家
combat_reach=756 //战斗范围,也就是在该NPC攻击玩家的时候,只有当玩家逃出756yards范围外才会停止攻击
maxhealth=57 //血多少
maxmana=45 //魔法值多少
speed=093 //速度
loot=2770 001 //对代码为2770的物品爆率为001(1%)
举例
目标1:使上面的NPC能够爆Elemental Mage Staff(元素之杖,法师的极品杖),爆率为005(5%)
步骤:
(1) 找到[creature 6]条目
(2) 添加loot=944 005 即可 //代码944代表itemsscp文件中的定义的元素之杖
目标2:在游戏地图上添加卖灵魂之石的NPC
步骤:
(1) 在该文件的最后添加以下代码:
[creature 3456789]
name=Soul Shard Seller
attack=1613 1774
bounding_radius=1000000
combat_reach=800
damage=32 42
flags1=08400046
guild=Soul Shard Seller
level=30 30
maxhealth=757
maxmana=605
model=9261
speed=135
type=7
npcflags=4
faction=35
family=7 //以上是对该NPC的一般属性的定义
sell=6265 //这个是主要的,代码6265代表灵魂之石,在itemsscp中定义
(2) 魔兽私服服务器用GM帐号进入游戏,到达需要添加NPC的地点
(3) 输入 addspawn 3456789 即可
/scripts/definesscp 这个文件中主要是一些宏定义,只要在需要的时候去查就可以了
举例:
(1) 在/save/playerssave文件中有race=4的条目
(2) 在/scripts/definesscp文件中找到// races ---------条目
(3) #define RACE_NIGHT_ELF 4 就是说race=4 是夜精灵族
/scripts/emuconf 这个文件主要是服务器的一些基本配置,包括回血,回魔速度,自动保存时间设置
你可以直接修改这个文件修改服务器的一些基本配置,也可以用wowWDDG_Identity自带的的IP-Configurationexe来修改服务器的基本配置
举例:
目标:修改服务器的可以支持1000同时在线
步骤:
(1) 找到max_players=xxx条目
(2) 修改max_players=1000即可
/scripts/itemsscp 这个文件主要是对服务器物品的定义
文件中的典型内容(部分):
[item 25] //物品的代码
buyprice=35 //从NPC中购买的价格
class=2 // 头饰, 这个可以中definesscp文件中的//itemtypes---条目下查到
durability=20 //耐久度
inventorytype=21 //存货量
level=2 //等级
name=Worn Shortsword //物品名称
sellprice=7 //物品价格
subclass=7 // 这个可以在definesscp文件中的//subclasses---条目下查到
/scripts/questsscp 这个文件主要是对各个任务的描述,回报
如果你想汉化游戏中的人物的话,你可以翻译这个文件即可
/scripts/spellcostscp 这个文件是对每一个技能学习的价格定义
文件中的典型内容:
[spell 8402] //技能代码
name=Fireball Rank 7 //魔法名称为Fireball,7级
reqspell=8401 //需要的技能点8401
price=100 //学习该技能的价格为100铜币
附A 魔兽世界,GM命令大全
addgo : 在你的坐标添加游戏对象
add : 添加项目到你的背包中
addnpc : 添加NPC到游戏
del : 删除目标NPC
setlevel : 设置个人或NPC的等级
setmodel : 给NPC或个人设置模型数量
learn : 学习魔法的数目
save : 保存文件
rehash : 改写目标
flag1 : 设置有毛病的标记
ppon : 打开pp系统
ppoff :关闭pp系统
turn : 转动NPC面朝你
come : NPC来到你的位置
go : 去世界坐标
gotrigger: 进入世界范围的位置,参数: trigger_number
kill : 杀死选择的NPC或个人
killallnpc : 杀死所有的NPC的形象
resurrect : 复活选择的个人
setsize : 设置NPC的大小
setspeed : 设置NPC或个人的速度
setflags : 设置NPC或OG的面具 参数: 〈ftype〉 〈flags〉
addspawn : 添加大量的点到你的位置 参数 : [〈npc entry〉] [〈npocs number〉]
setnpcspawn : 添加条目和数目作成大量NPC到大量的点
setnpcgo : 设置条目由于大量游戏目标到大量点
setspawndist : 设置小和大距离到大量
setspawntime : 设置小和大的时间到大量
setxp : 设置经验到个人
paralyse : 不动和动到个人或NPC
setaura : 设置预兆数目
exploration : 打开你地图的位置
dismount : 卸下你
listsp :列出你的魔法
listsk :列出你的技能
delsp : 忘记魔法
delsk : 忘记技能
info : 附近NPC的信息
online : 显示在线玩家数目
goname : 移动到输入名字的个人或NPC
goguid : 移动到行会
targetgo : 尝试移动到最近的玩家(定位最近的object)
targetlink : 尝试到连接目标OF选择目标
move :传送目标
retcl : 重装TCL
rescp : 重装 SCP
clearqflags : 清楚寻找标记
bytes : for debug
pingmm : 制造点在你的地图
adddyn : 测试到竞技
魔兽私服服务器架设完全资料你会了嘛

台风天,风大雨大,困在家里,左右无事。。延续上一篇拙文“
高通QRD vs 联发科TK, 刚刚开始的战争
”,看到不少网友留言,关于Turn-key的话题觉得意犹未尽,因此再攒一篇。
Turn-key中文一般翻译为“交钥匙方案”。意味着交给你一把“钥匙”,你就可以上路了。也有叫Total solution, 也有叫“公板设计”的,意思差不多,区别可能在强度上吧。目前似乎只有MTK的Turn-key大家认为做到位。Turn-key 看似是个动词,不过个人觉得这个词应该是个名词,除了描述交付行为之外与,还要暗含背后为了打造这把钥匙而涉及到的哪些人和事,这是本文想了解的重点。
谈到turn-key的交付,直观来看无非是这些东西:硬件,软件,设计文档,应用文档,测试报告,等等。这些地球人都知道。。不多说。
而Turn-key本身,应该指的是一个持续的工程,远非一个简单的“交钥匙”可以概括。这个工程中有大量的工作要做,暂且笼统称它们为“交付的适配”。
这样描述还有点抽象,如果给这些适配工作的特质按照时间线再分个类,大约可以分为这几个要素:交付的精确定位;交付的稳定性和易用性;交付的可扩展性;交付之后的升级;交付后的服务。
(1)交付的精确定位:相当于平台feature 定位;不必说这个是在交付发生很早前就需要确定的事情。
用汽车打个比方:交付的东西必须是市场所需要的;打比方如果客户需要的是台大众,你交付了个丰田;或者客户需要的是帕萨特,你交付了个途观。那么这个交付不管厂商花了多少心血,从客户的观点来看基本都是垃圾。这个要考验平台商对于市场需求的前瞻性洞察:国内的市场瞬息万变,某些产品特性需要提前半年到一年布局。而且有时候平台商甚至能够“引导市场需求”。
(2)交付的稳定性和易用性;拿MTK的Turn-key举例:
在MTK的Turn-key出现之前,常见的模式,是平台商推一个“半成品”给客户,客户拿来捣鼓个几个月半年稳定下来,再化几个月产品化--产品化过程里面要是碰到和芯片相关的良率问题,那项目基本就挂掉了。所以那时候有人开玩笑:如果某客户采用某个平台商的未量产套片,就会被戏称为“白老鼠”。。
MTK的turn-key,在交付之前做大量的测试(从芯片,到软件,硬件,应用,以及产品级别测试)--通过严格的质量控制,把复杂的状况搞简单了,大多数“白老鼠”会遇到的问题都被解决掉了--这是其在国内大获成功的核心竞争力。客户只需要关心最终产品化。虽然是以牺牲了部分“差异化”为代价,但是客户确实节省了资源,也就缩短了开发周期。
(3)交付的可扩展性
还是打汽车的比方:大众系的客户需求不会只有一种(比如A客户要途安,B客户要Polo, C客户要帕萨特。。),每个客户的需求也是多元化(比如A客户要换低音炮,B客户要换防滑胎,C客户要无钥匙启动。。);
(4)交付的升级
升级不能是补丁包式升级,而是功能性升级--好歹你也要补丁+新功能买一送一式升级吧,客户最最烦这个补丁包式升级,能免则免能少则少吧;
升级也不能是频繁的硬件改动。这对于客户来说是灾难。
比如MT6575-MT6577就是软硬件升级的典范。
软件升级,合理的版本管理和发布流程是避免灾难性事件的关键,严格的测试则是手段,不能牺牲稳定性和质量来换取时间。
对于熟悉开发流程以及版本管理的同学,想必看得出(2)(3)(4)里面的水有多深。。
(5)交付之后的服务。应该说典型的Turn-key是为中国客户服务的--国内习惯了Turn-key的客户,有这么几个特点:
项目都很紧,压力都很大,项目组织管理一般比较松散,工程师都很忙常常几个项目一肩挑,所以不耐烦看文档,比较喜欢直接现场指导。。所以,服务就显得重要了。服务的目的,是帮助终端客户快速解决问题,是光纤入户最后那一公里,是直接决定客户体验的事情。
虽然,过于依靠平台商,对于客户个体能力的培养和研发组织的成长都是不利的。但是在现如今这样的大环境下,遇到疑难杂症最快的方式还是找支持。不然老板就要给脸色了,没时间给你自我锻炼,这是现实。。也许在这样的状态下面还能维持一定的自我学习机制的,只能是大公司,因为可以多投入一点人力资源和容忍“浪费”多一点时间。
后记:在之前一篇博文“里面看到一些网友的评论,也是我攒这篇文章的初衷之一。Turn-key不是想当然Copy&Paste别人的交付,不是召集工程师做几台手机出来,而越来越是一个系统工程,考验整个公司综合布局,需要上升到战略性决策的高度。为何?因为完整的Turn-key需要调动各个方面的资源,贯穿整个产品链条始终,需要和组织结构,个人行事方式相融合,才有长久成功的把握。君不见MTK凭此已经独步天下,高通QRD还在这里阵痛挣扎,展讯据说发布过于频繁屡屡被客户诟病,其它各家要么三心二意随便搞搞,要么还在原始的Copy and Paste里面摸索。
放眼看看现在的手机行业,已经是典型的消费类电子市场。从纯技术角度来看,IP互联总线标准化,综合工具能力强大,DFT提供成熟的validationprocess,这一切使得IC设计越来越接近标准化设计。大家不再单纯比拼单纯的硬件或者软件研发实力,而是比拼综合实力—综合实力里面最重要的是软硬件整合能力。
做出一个技术领先的方案不再是困难的事情,更困难的是尽快把方案快速的转化为生产力。任何能提高TTM的措施,都是会有人买单的。技术还是基石,但是时间,只有时间现在才是王道!!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10774760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存