オンラインゲームの遅延ソリューションについての講演

我々は通常など伝説のリーグ/栄光の王/ PUBG、などのオンラインゲームの多くを再生するには、理由はあなたの速度のが、理由は、多くの場合ではない、そのようなLOL米国のサービスゲームサーバなどのネットワークによって生じる遅延のカトンを感じます米国、そしてあなたは、中国中央部、中国でLOLにサービスを提供する米国を再生し、その後、あなたが米国から中国華中へのネットワーク要求はルートの多くを通過する必要があるため発生した場合、多くの時間が消費されます、およそ300ミリ秒の遅延もあり彼らはあなたのゲーム体験に影響を与える傾向があるときに遅れて再送が必要とされているパケット損失は、しばしば成長倍加が、以上150msの遅延します。

市場は、いくつかのゲームアクセラレータがあるだろう、彼らはあなたの要求は、ゲームの遅延を低減するために、迅速に処理できることを保証するために、ラインを構築するために、外国にサーバーを置きます。

今すぐ適用低レイテンシは、多くのゲームやライブ放送は、優秀な方、TCPのような信頼性の高いトランスポートの送信のために、通常は再利用ネイティブTCPやUDPではありませんが、上の両方に基づいて変更されて拡張必要がありますUDP伝送速度。

それは新しいファンの今月に言及しなければならないことになるとどんなに注意してもしすぎることは本当に信頼性の高い、非常に奇妙な感じ、いわゆるTCP上で、コンピュータネットワークにおける信頼性の高い伝送をTCP / UDPのコースを学習するまでの時間を考えてみて、そして慎重「この明らかにスーパー勇敢あまりにも慎重に。」

1

昨日は最初の言葉を見て、パンク!

パッケージいくつかのタイムアウト場合、毎回倍増し、次の再送パケットは、長い時間を必要としないことをされてTCPに戻って来て、それがRTOの再送タイムアウトを感じ、この遅延は、テーブルの上ではないのですか?そして、あなたは信頼性を保証することができますが、すべてのパッケージの再送信の後、彼は、パッケージに再送信する必要があり、過度の注意を失ったが、それは、インスタント・メッセージング・アプリケーションなどをミリ秒私たちに非常にフレンドリーません。

この文脈では、TCPやUDP上、特にオンラインゲームだけでなく、本明細書中にオーディオとビデオ通話遅延のために基づいて、多くの改良と、この契約はKCPであると言います。

プロトコルKCPとは何ですか

KCPは30%-40%減少し、平均遅延、遅延伝送を低減する三回の最大値と引き換えに帯域幅のコストの10%-20%とすることができるよりも高速で信頼性の高いプロトコル、TCP廃棄物です。

純粋なアルゴリズムは、トランシーバは基本的なプロトコル(例えばUDP)の原因ではないが、ユーザ自身がコールバック方式のKCPに提供されるパケットデータの基礎となる伝送方式を定義する必要があります。

でも、何の内部システムコールは存在しません、渡された外部クロックを必要とします。

有一种叫KCPtun的实现,可以把我们的TCP请求转化成KCP+UDP在公网上传输。

1

KCP与TCP的比较

TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。

TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。

KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:

  • RTO翻倍vs不翻倍(RTO超时重传):

TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。

  • 选择性重传 vs 全部重传:

TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。

  • 快速重传:

发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。

  • 延迟ACK vs 非延迟ACK:

TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。

  • UNA vs ACK+UNA:

ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。

  • 非退让流控:

KCP通常モード、TCPウィンドウサイズがによって決定された送信公正な妥協法使用のように:バッファサイズを送信し、バッファサイズ、パケット損失と遅いスタートを受け、残りの受信機は、決定の四つの要素を認めます。しかし、選択的に構成手順、最初の2つだけをスキップして送信周波数を制御するために、小さなデータの高い適時性要件を送信する場合。公平性と帯域幅利用の費用の一部を犠牲にして、BTを駆動する効果と引き換えに伝達をスムーズにすることができます。

2

ネットワークは決してカード、KCP / TCPの性能は似ていますが、ネットワーク自体が信頼できないと、パケット損失やジッタを避けることができない場合(あるいは信頼性の高いプロトコルの様々なをやって)。このイントラネットは、直接比較ではほぼ全員ほぼ理想的な環境ですが、状況下では、3G / 4Gネットワ​​ークに、公衆インターネットを置く、またはネットワークパケット損失シミュレーションの使用において、ギャップは非常に明確です。公共のピーク時には透過率変化のカードを許可するより悪い中の紛失、無線LAN / 3G / 4Gの10%近くの平均を、持っています。

たぶん、あなたは多くのゲームをプレイする、またはアクセラレータを使用して、我々は、待ち時間を短縮するためにKCPを使用しています。

使い方

ここだけ、あなたのプロトコル・スタックに2つのファイルが使用できikcp.h、ikcp.cする必要がKCPのGitHubの上のアドレスは、です。

https://github.com/skywind3000/kcp

KCPは、オブジェクトを作成しました:

// 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双
// 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针
ikcpcb *kcp = ikcp_create(conv, user);

コールバック関数を設定します。

// KCP的下层协议输出函数,KCP需要发送数据时会调用它
// buf/len 表示缓存和长度
// user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
  ....
}
// 设置回调函数
kcp->output = udp_output;

サイクルコールアップデート:

// 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位)
// 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用
ikcp_update(kcp, millisec);

低い入力データパケット:

// 收到一个下层数据包(比如UDP包)时需要调用:
ikcp_input(kcp, received_udp_packet, received_udp_size);

KCPが正常に動作することができ、入力/出力プロトコルの下位層プロトコルを処理した後、リモートikcp_sendにデータを送信するために使用されます。そしてikcp_recv他端(KCP、PTR、サイズ)は、データを受信します。

おすすめ

転載: www.cnblogs.com/LexMoon/p/wlyx.html