Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

我司使用kcp制作上线的网络游戏,出现了比tcp更不稳定的网络状况 #100

Closed
hubinix opened this issue Aug 31, 2017 · 49 comments

Comments

@hubinix
Copy link

hubinix commented Aug 31, 2017

强烈建议大型网络游戏公司不要考虑使用kcp的协议。
kcp在流控和丢包处理方面,实现的太过于幼稚。

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

初步估计,因为使用kcp造成了玩家流失和经济损失
在4G环境下,尤其是联通网络,非常影响游戏体验。

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

发在这里,希望大家引以为戒,以免重蹈覆辙。

@notlazychen
Copy link

你司CTO可以下岗了

@en
Copy link

en commented Aug 31, 2017

建议你们公司不要做大型网络游戏

@FAKERINHEART
Copy link

是CTO在技术选型不行以及对KCP驾驭不足的原因吧。目测CTO要背大锅,这就苦了底层打工的劳动人民啊~

@skywind3000
Copy link
Owner

用kcp成功的项目多的是,你们自己搞不定整套网络集成来怪kcp干嘛?窗口设好了么?参数配对没?发送端用户层流控做了没?大项目?倩女幽魂用kcp传输语音数据,国战40万pcu,不是dau,不比你们项目规模小吧?

@skywind3000
Copy link
Owner

丢包处理幼稚在哪里?能不能具体点?比tcp更丰富的策略到你这里用不来就成幼稚了。

流控出问题了?延迟越来越大了?还是内存越来越大?比如:

#93

这些问题我在issue里回答过好几次了,你们这么大的项目上线不读读wiki和issue?即便不读,但凡有点基础知识都不会犯这种乱用的错误。

大项目?损失上千万?

这么大项目上线前不做重复压力测试?什么问题非要正式推广让用户当小白才能暴露。

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

这种问题还是压力测试测试出来的吗?
黑龙江的大片电信用户,浙江的大片联通用户,连接状态差,能通过压力测试测出来?

@skywind3000
Copy link
Owner

压力测试为什么做不出来?你们模拟丢包了没?模拟延迟了么?这两项模拟了能帮你们找出多少问题?如果不模拟基本等于没测试过网络。

@skywind3000
Copy link
Owner

联通用户应该引导链接联通服务器,电信用户引导链接电信线路服务器,或者都链接到bgp网络上,不要夸网传输,尤其夸网p2p

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

你回答的问题是2017年,我们2015年就立项了,投资大几千万,开发两年半。当时模拟并没有发现问题。
投入到正式运营,导入24万用户后发现问题,对某些省的运营商4G状况极差。

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

我们用的腾讯云的环境。

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

我们的核心战斗的所有数据走的是kcp,而且是fps的实时战斗。玩家反馈经常出现10秒钟,服务器不响应任何操作。用来聊天的tcp连接保持正常,战斗的kcp没响应了。

@skywind3000
Copy link
Owner

nodelay打开了么?窗口大小根据你们的流量重新设置过没?缓存积累有处理么?默认的类tcp流控关掉没?只要用对了,你们这点战斗数据根本不算啥,好些产品和cdn用kcp传高清视频,比你们流量大吧?

@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

fps游戏数据要求的是实时,跟流量无关,我这边tcp 80ping,同时的kcp响应时间是180ms

@skywind3000
Copy link
Owner

skywind3000 commented Aug 31, 2017

肯定用的有问题啊,你的参数怎么设的,网络层怎么调用的?

@hubinix hubinix changed the title 我司使用kcp制作上线的网络游戏,出现了比tcp更不稳定的网络状况,造成了重大的损失。 我司使用kcp制作上线的网络游戏,出现了比tcp更不稳定的网络状况 Aug 31, 2017
@hubinix
Copy link
Author

hubinix commented Aug 31, 2017

楼上这帮。。只能编辑一下了。

@caoli5288
Copy link

建议你司直接付个几百万将韦先生请去调试,不是什么事情都解决了嘛。

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

问题解决了,kcp就没想过ack包丢了会发生什么吗?一个udp报文里面带的ack个数可是不少的,当环境稳定丢包的时候,这个udp包一丢,直接堵发送缓冲区。。而且rto_max默认是60秒。。

@caoli5288
Copy link

caoli5288 commented Sep 4, 2017

20170904102327

kcp用了UNA没错,UNA的干嘛的要不要帮你谷歌下?稳定丢包这个形容很厉害啊,ack包占报文比例多少,稳定到到逢ack必丢?当快速重传不存在的?如果网络真的稳定到到逢ack必丢,tcp能应付?
rto_max是60有什么问题吗,嫌大,tcp的多少啊?
说实话,你家一个几千万投资的项目,出问题了赖到kcp这样一个区区几百行的库上,技术上已经很丢脸了,还扯什么经济损失,难道你项目做成功了会给韦先生付费?当你们意识到可能是kcp导致的问题的情况下,第一时间就应该联系韦先生并洽淡付费咨询,结果你们怎么处理的?只能充分突出你司项目经验的不足和幼稚。

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

对kcp而言ack确认包丢失的问题不解决,在网络游戏的控制指令的传输,不建议用kcp来做。
因为目前机制里面rto_max会经常触发到,玩家的体验,是不如tcp的。有些udp的传输协议比如fasp协议,是用tcp来传ack的。

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

一个udp报文里面的ack有可能会很多。丢了就是阻塞一大堆。tcp丢ack是一个一个丢的,kcp丢一个有可能翻一车,好几百个ack就没了。。这好几百个发送报文就堆在发送缓冲区里面了。

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

小概率事件大量重复就会发生,比如1%的丢包的情况下,玩家玩一天,遇到一次网络正常情况下的莫名断线,就会认为服务器网络不好的。

@ghost
Copy link

ghost commented Sep 4, 2017

@hubinix 我想知道最终怎么解决问题的

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

加入udt的Ack2机制,给确认包发确认包。。

@sin5678
Copy link

sin5678 commented Sep 4, 2017

何不如直接 UDT 呢 , 各种重复造轮子 大把视频传输项目用的UDT 好的很~

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

已经上线的游戏了,不敢动太多。

@caoli5288
Copy link

20170904112551

把这个comment删了干嘛哦?

@hubinix
Copy link
Author

hubinix commented Sep 4, 2017

突然想到换udt不是换包的问题。。整个网络底层不知道会发生什么。。因为可能session机制也要改。

@notedit
Copy link

notedit commented Sep 4, 2017

你在这抱怨解决不了问题 付费咨询韦先生不更快解决问题么

@skywind3000
Copy link
Owner

skywind3000 commented Sep 4, 2017

你们项目挣钱,我不会要你们一分;有问题我可以给你付费电话解答,或者到贵公司提供相关方面的交流和讲座;你也可以在 github 上提问题,我会免费给你用文字解答。

但是如果你既不想花钱,又想通过抹黑本项目的方式来逼我来为你们提供各种大力支持,我会马上在 github 上将你屏蔽掉。你自己项目出了问题,有压力可以理解,来 github 我也能无偿为你解答,但有问题说问题,你要因为自己能力不足被老大骂了,在公司背了锅了,要来我这里抹黑 kcp 解气,还到我其他 issue 里上串下跳的说各种,那么对不起,再有下次我也马上拖黑。


再来说说你的画色舔足,ACK2模式,UDT 的 ACK2 模式,多年前我自己的实验中就被 KCP击败了,asio-kcp 的作者 zhangyun 后面同样再现了这个实验结果,并把他的测试代码和数据都放到了网上。

KCP 的代码你都没读通就自作聪明的加了 ACK2,我只能告诉你,你这样很危险,本身用法问题不正确,KCP的性能被你阻碍了,自己加个 ACK2,是丢了西瓜捡了颗芝麻。

还有你所谓的 “tcp丢ack是一个一个丢的,kcp丢一个有可能翻一车,好几百个ack就没了”?

用不着你教我 TCP是怎么样,因为你不管对 TCP 还是 KCP 都只是一知半解,我 2011年设计 KCP协议之前,已经实现过 5 套不同方向的传输协议,包括反照 BSD 4.4 Lite 完整的类 TCP实现,我当然知道 TCP是什么样子,也读过各种论文和类似 libenet, raknet, libjingle 之类的传输实现,不然后续谈何改进,所以不要以为这些实现和参数都是我拍拍脑袋弄出来的。

你以为 KCP的丢包确认只靠 ACK?naive ,你没看到 UNA 这个东西的存在么?TCP只有 UNA,KCP是 ACK + UNA,丢几个 ACK包根本不在乎,UNA立马补充掉,UNA是写在包头的,你每个数据包或者ACK包都包含该数据 ,相互补充和支持的机制,丢了 UNA也有 ACK来补充,此外还有 fastack 来应对ack丢失,所以说你看了半天就压根没看懂,还想当然的觉得问题在哪里。

另,我一再强调的缓存积累延迟,你到底处理了没有?没处理的话,读读下面的 wiki:

如何避免缓存积累延迟

我不管你现在改成什么样子了,我就问问你关于当初版本的几个问题:

  1. nodelay 你到底打开了没有?参数是多少?默认的类 tcp 保守流控模式关闭了么?
  2. snd_wnd, rcv_wnd 重新计算过没有?使用过 ikcp_wndsize 设置过没有?
  3. ikcp_update 是否按要求频率调用?
  4. 发送前是否检查 ikcp_waitsnd 的值判断是否有缓存积累?积累了是否有处理?
  5. kcp->minrto 是否设置过,是否设置到类似 10ms 之类的较小的值,而不是默认值。
  6. kcp->interval 是否设置成更小的 10ms 或者 5ms
  7. 想追求快速传送,每次发送以后是否手动调用了 ikcp_flush ?
  8. 当初你们大几千万的项目 2015年立项到现在,模拟丢包和模拟延迟到底做过还是没做过?

做完上面这 8 项再来提 KCP的问题,你如果代码没问题,的确处理好了上面 8个需要注意的地方,获得一个比 tcp 快一倍的传输性能是很轻松的事情,进一步你还可以给 kcp 配套 fec 系统,获得更快的传输性能。

这些问题,但凡有点网络常识,或者扫过一遍 issue 或者 wiki 的都不会犯,你能不能说说你们上线的版本是不是这些问题都有注意到并考虑周全了?

@hubinix
Copy link
Author

hubinix commented Sep 5, 2017

本来解决问题就没需要你的支持,如果以为我是为了寻求支持来这里发言就把我屏蔽,那么说你的气量也就这么多。
我只是来这里反应一个情况,就是kcp并没有比tcp好,理由是ack丢失的问题会导致玩家连接的中断。

@hubinix
Copy link
Author

hubinix commented Sep 5, 2017

不要解决不了问题,就把提出问题的人解决掉。。

@hubinix hubinix closed this as completed Sep 5, 2017
@skywind3000
Copy link
Owner

skywind3000 commented Sep 5, 2017

我上面的问题你都没本事回答呢,就来这乱喷。你到现在都没看懂,还没意识到自己的观点错在哪里,KCP单纯靠ACK?UNA 是用来干嘛的?你把ack全丢了una都可以照样工作完成确认的事情,上面都有人说了,要不要帮你百度一下?你到现在都还以为KCP光靠ACK?你确定自己知道TCP的ack具体怎么回事么?所以我才说你是一知半解。

@songsmith
Copy link

不要解决不了问题,就把提出问题的人解决掉。。

大哥,没有谁天生有义务为你解决问题,而且还是这种看不懂的问题。

@tsingson
Copy link

技术选型前的评估/测试根本没作到位( 可能没作过商用环境下的对比测试, 至少是移动端的典型商用环境下没作充分测试..................), 出了问题来责怪开源作者, 这样的" issue " 让人无语了.............

@jo3yz
Copy link

jo3yz commented Nov 5, 2019

真是无语,人家也没收你钱啊。这个价值观真是让人语塞

@Homqyy
Copy link
Contributor

Homqyy commented Sep 14, 2021

强烈建议大型网络游戏公司不要考虑使用kcp的协议。
kcp在流控和丢包处理方面,实现的太过于幼稚。

你可真是丢人丢到家了。

@Alisheng
Copy link

Alisheng commented Nov 6, 2021

时隔多年,我也想问这个CTO就是你自己吧?

@lysShub
Copy link

lysShub commented Jun 17, 2022

有没有可能是运营商qos了你的udp

@weatune
Copy link

weatune commented Aug 16, 2023

客观点, 如果使用KCP需要很深的网络底层知识, 需要自己处理很多底层问题, 一般项目还是不要用了, 也用不着冷嘲热讽人家, 人家是实际使用kcp遇到的问题, 如果实际使用会遇到这些问题, 应该考虑怎么让大家更少频次的碰到, 降低使用难度, 更利于推广. 不要动不动吹嘘自己的技术多牛, 人家多蠢, 你专精于网络, 这方面你强一点, 有啥呢?

@weatune
Copy link

weatune commented Aug 16, 2023

也不知道是不是故意高深, 你能把别人想的哦醋, 也能这么认为你自己, 故意留点不到位, 好拿咨询费吗?

@skywind3000
Copy link
Owner

skywind3000 commented Aug 16, 2023

@weatune 咨询费个屁,这个项目从发布到现在我就没收过一分钱咨询费,我又不靠这个挣钱,也从来不打算靠这个项目挣啥钱,issue 里正常问问题,比这复杂疑难的,所有我都解答,我是看不惯有些人自己不懂,态度还扭曲,好好问问题不肯,上来就抹黑的行为,挣个屁的咨询费啊,你自己心理龌龊,看所有人都是龌龊。

我业余时间维护,该写的文档写了,该回答的问题也回答了,开源项目,不欠任何人什么,别天天一副巨婴嘴脸,不把东西喂到嘴里还撒娇。

@weatune
Copy link

weatune commented Aug 16, 2023

你自己把别人想的阴暗啊, 老哥, 说别人摸黑你, 是为了逼你技术支持, 这是原话啊, 你自己不成熟啊, 还别人巨婴. 直接回他, 底层包没处理好, 就是喽.

@Homqyy
Copy link
Contributor

Homqyy commented Aug 16, 2023

客观点, 如果使用KCP需要很深的网络底层知识, 需要自己处理很多底层问题, 一般项目还是不要用了, 也用不着冷嘲热讽人家, 人家是实际使用kcp遇到的问题, 如果实际使用会遇到这些问题, 应该考虑怎么让大家更少频次的碰到, 降低使用难度, 更利于推广. 不要动不动吹嘘自己的技术多牛, 人家多蠢, 你专精于网络, 这方面你强一点, 有啥呢?

客观点,没点实力老实用tcp不就好了,喜欢套个壳说自研就算了,自己掌控不了还非要怨天怨地,自己心里没点数能行么?

@Homqyy
Copy link
Contributor

Homqyy commented Aug 16, 2023

你自己把别人想的阴暗啊, 老哥, 说别人摸黑你, 是为了逼你技术支持, 这是原话啊, 你自己不成熟啊, 还别人巨婴. 直接回他, 底层包没处理好, 就是喽.

也就得亏你写的是中文,从这条 issue 开始就不受任何开发待见。有时候我也在想一件事,为什么用别人的东西获得的所有成功都是自己的,但当出问题时第一时间想到的一定是别人的? 哪怕退一万步说,从评审落地的那一刻起,所有结果都应只与自己有关。这是我们平时告诫下面每一位 ctrl + v 的同学的原话,支持 ctrl + c ,但是你必须为每一个 ctrl + v 负责!

@Homqyy
Copy link
Contributor

Homqyy commented Aug 16, 2023

在此我补充几个问题:

  1. 是否认真做了技术选型 和 可行性分析?
  2. 在使用不熟悉的开源项目时是否做好了风险分析和应对措施?
  3. 正式上线前是否做好了足够的测试环节,包括公测?

几千万的项目应该能做好这些基本工作吧?

@skywind3000
Copy link
Owner

skywind3000 commented Aug 16, 2023

@weatune

你自己把别人想的阴暗啊, 老哥, 说别人摸黑你, 是为了逼你技术支持, 这是原话啊, 你自己不成熟啊, 还别人巨婴. 直接回他, 底层包没处理好, 就是喽.

我已经说了,但凡他好好问问题,比这复杂的情况我都会回答,你去翻翻 issue 里其他正常问题,但如果上来就乱喷,指望我帮你解决问题,对不起,即便答案只有一个 hello world 我都懒得说。

你就是巨婴啊,话都看不懂,说话做事,总觉得全世界所有人都欠你一样,
懂不懂点基本的礼貌?

拉黑不送。

@FAKERINHEART
Copy link

FAKERINHEART commented Aug 16, 2023

也不知道是不是故意高深, 你能把别人想的哦醋, 也能这么认为你自己, 故意留点不到位, 好拿咨询费吗?

我也没有看懂 一个牛逼的过万star的开源项目 自己没看懂源码和文档 出了线上事故 来这里bb叨 是为了什么 是为了找喷吗? 还在这个帖子下面 持续了那么久时间 也是醉了

Repository owner locked as off-topic and limited conversation to collaborators Aug 16, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests