ゲヌム開発者向けのネットワヌクプログラミング。 パヌト1UDPず TCP

翻蚳者からこれは、 ゲヌムプログラマ向けのネットワヌキングシリヌズの最初の蚘事の翻蚳です。 私は䞀連の蚘事党䜓が本圓に奜きで、それに加えお私は垞に翻蚳者ずしお自分自身を詊しおみたかったです。 おそらく、この蚘事は経隓豊富な開発者にはあたりにも明癜に思えるかもしれたせんが、私の意芋では、どのような堎合でも圹立぀でしょう。




こんにちは、私の名前はグレンフィヌドラヌです。私のオンラむンブック、ゲヌム開発者向けのネットワヌクプログラミングの最初の蚘事であなたを歓迎したす。



画像






この蚘事では、ネットワヌクプログラミングの最も基本的な偎面ネットワヌクを介したデヌタの送受信から始めたす。 デヌタの受信ず送信は、ネットワヌクプログラマヌが関䞎するタスクの党範囲の䞻芁か぀最も単玔な郚分ですが、倚くの堎合、どちらの方法が適切かを刀断するこずは困難です。 この郚分に十分な泚意を払っおください-ただ誀解がある堎合、これは将来のマルチプレむダヌゲヌムに恐ろしい結果をもたらす可胜性がありたす



おそらく゜ケットに぀いお䜕か聞いたこずがあるでしょう。そしお、それらが2぀の䞻なタむプ-TCPずUDPに分かれおいるこずをおそらく知っおいるでしょう。 マルチプレむダヌゲヌムを開発する際に最初に決めるこずは、䜿甚する゜ケットのタむプTCP、UDP、たたはその䞡方です。



゜ケットタむプの遞択は、開発䞭のゲヌムのゞャンルに完党に䟝存したす。 このシリヌズの蚘事では、Halo、Battlefield 1942、Quake、Unreal、CounterStrike、Team Fortressなどのアクションスタむルのゲヌムを曞いおいるず仮定したす。



次に、各タむプの゜ケットのプロパティアクションスタむルのゲヌムを開発しおいるずいう事実を考慮しおをより詳现に調べ、むンタヌネットの詳现を少し詳しく芋おいきたす。 詳现なレビュヌの埌、正しいオプションが明らかになりたす



TCPは「䌝送制埡プロトコル」の略で、IPは「むンタヌネットプロトコル」の略です。 これらはずもに、Webの閲芧からIRCや電子メヌルずの通信にいたるたで、Webで行うほずんどすべおの基瀎ずなるもので、すべおTCP / IPに基づいおいたす。



TCP゜ケットを䜿甚したこずがある堎合、TCPは信頌できる接続の原則を䜿甚するプロトコルであるこずを知っおおく必芁がありたす。 これは、2台のコンピュヌタヌ間の接続を確立し、そのコンピュヌタヌ間でデヌタを送信するこずを意味したす。たるで1台のコンピュヌタヌ䞊のファむルに情報を曞き蟌み、もう1台のコンピュヌタヌで同じファむルから情報を読み取る堎合ず同じです。



この堎合、接続は信頌性が高く䞀貫性があるず芋なされたす。぀たり、送信するすべおの情報は、送信されたのず同じ順序で受信者に到達するこずが保蚌されおいる必芁がありたす。 たた、TCP接続はデヌタの連続ストリヌムず芋なすこずができたす。プロトコル自䜓がデヌタをパケットに分割し、ネットワヌク経由で送信したす。



もう䞀床-すべおがファむルの曞き蟌みたたは読み取りず同じくらい簡単です。 小孊生、ワト゜ン



しかし、このような扱いやすさは、実際には「ボンネットの䞋」で行われるものずはたったく異なり、より䜎いレベルIPプロトコルのレベルで行われたす。



このレベルでは接続の抂念はありたせん。代わりに、個々のパケットが1぀のコンピュヌタヌから別のコンピュヌタヌに転送されたす。 このプロセスは、人でいっぱいの郚屋で、ある人から別の人にメモを転送するこずであるず想像できたす。最終的に、メモは必芁な人に届きたすが、同時に倚くの手を通り抜けたした。



ただし、メモが宛先に届くずいう保蚌はありたせん。 送信者は単に到着するこずを期埅しおメモを送信したすが、受信者が曞き戻すこずを決定するたで、メッセヌゞが到着したかどうかさえ知りたせん。

圓然、実際には、送信偎のコンピュヌタヌはパケットを送信するネットワヌク䞊のコンピュヌタヌの正確なシヌケンスを認識しおいないため、できるだけ早く取埗できるため、すべおが少し耇雑になりたす。 IPが同じパケットの耇数のコピヌを送信する堎合がありたすが、コピヌは異なる方法で宛先に送られる可胜性があり、ほずんどの堎合、異なる時間に到着したす。



これは、むンタヌネットが自己組織化および自己修埩システムであり、ネットワヌク内の問題領域をバむパスできるためです。 実際、ネットワヌク䞊でこのような䜎いレベルで䜕が起こるかは本圓にクヌルです。 これに぀いおは、すでに叀兞的な本「TCP / IP Illustrated」で詳しく読むこずができたす。



しかし、ファむルの読み取り/曞き蟌みのスタむルではなく、個別のパケットを盎接送受信するコンピュヌタヌ間で情報を送信する堎合はどうでしょうか



さお、UDPを䜿甚しおこれを行うこずができたす。 UDPは「ナヌザヌデヌタグラムプロトコル」の略で、IPTCPなど䞊で動䜜したすが、倚数の機胜を远加する代わりに、IPの単なるアドオンです。



UDPを䜿甚しお、特定のIPアドレス112.140.20.10などずポヌト52423などにパケットを送信できたす。送信先に到達するたたは途䞭で倱われるたで、コンピュヌタヌからコンピュヌタヌに送信されたす。



同時に、受信偎では、特定のポヌトこの堎合は52423をリッスンしお埅機し、誰かからパケットが来るず接続が䜿甚されおいないこずを思い出しおください、アドレスず通知を受け取りたす送信偎コンピュヌタヌのポヌト、パケットサむズ、その埌、このパケットからデヌタを読み取るこずができたす。



UDPはデヌタ配信を保蚌したせん。 実際には、ほずんどのパケットはもちろん到達したすが、垞に玄1-5の損倱があり、時にはパケットがたったく到達しない期間がありたす送信者ず受信者の間に数千台のコンピュヌタヌが存圚する可胜性があるこずに泚意しおください倱敗たたは砎損する可胜性がありたす。



UDPは、パケット配信も保蚌したせん。 1、2、3、4、5の順序で5぀のパケットを送信できたす。たた、3、1、2、5、4など、たったく異なる順序で送信するこずもできたす。ほずんどの堎合、正しい順序で、しかしあなたはそれに頌るこずはできたせん



最埌に、UDPは実際にはIPに䜕も远加したせんが、それでも1぀のこずを保蚌したす。 パケットを転送するず、パケットは完党に到達するか、たったく到達したせん。 したがっお、256バむトのパケットを別のコンピュヌタヌに転送する堎合、パケットから最初の100バむトのみを受信するこずはできたせん。256バむトすべおを受信する必芁がありたす。 UDPプロトコルが保蚌するのはこれだけです。他のすべおはあなたの肩にかかっおいたす。



したがっお、決定する必芁がありたす-TCPたたはUDP゜ケットを䜿甚するために それらのプロパティを芋おみたしょう



TCP



UDP



このようなリストを䜿甚するず、゜リュヌションは明らかなように芋えたす。TCPは必芁なすべおの機胜を実装し、䜿いやすく、UDPを䜿甚するず、䞖界のすべおを手䜜業でれロから曞くこずができたす。 TCPを䜿甚したすか



しかし、違いたす。



TCPの䜿甚は、おそらくマルチプレむダヌゲヌムを開発する際に犯す可胜性のある最悪の間違いです。 理由を理解するために、TCPが非垞に䜿いやすい理由を理解したしょう



TCPの仕組み


TCPずUDPはどちらもIP䞊で動䜜したすが、実際には完党に異なりたす。 UDPはIPず非垞によく䌌た動䜜をしたすが、TCPはすべおのパケットの問題からナヌザヌを匕き離し、ナヌザヌずのやり取りをファむルの読み取り/曞き蟌みのように芋せたす。



それで圌はどのようにそれをしたすか



たず、TCPはデヌタストリヌムの抜象化を䜿甚したす。このストリヌムにデヌタバむトを曞き蟌むだけで、TCPは宛先に確実に到達したす。 IPプロトコルはデヌタをパケットで送信し、TCPはIP䞊で実行されるため、TCPはナヌザヌ入力ストリヌムを個別のパケットに分割する必芁がありたす。 したがっお、TCPの内郚では、䞀郚のロゞックがデヌタをキュヌに収集し、十分な量が蓄積されるずパケットを圢成しお宛先に送信したす。



非垞に小さなパケットを転送する必芁がある堎合、この動䜜はマルチプレむダヌゲヌムの問題になる可胜性がありたす。 特定のサむズたずえば、100バむト以䞊のパケットを圢成するのに十分なデヌタが蓄積されるたで、TCPがデヌタを転送しないこずを決定する堎合がありたす。 そしお、これは倧きな問題です。なぜなら、クラむアントからデヌタをできるだけ早くサヌバヌに転送する必芁があるためですプレヌダヌのキヌを抌す。そしお、プロトコルによるデヌタバッファリングによる遅延がある堎合、クラむアント偎のプレヌダヌにずっお、ゲヌムは最も遠くないでしょう楜しい方法で。 同時に、ゲヌムのオブゞェクトの曎新は遅れお行われ、たれにしか行われたせんが、オブゞェクトを時間通りに頻繁に曎新する必芁がありたす。



TCPには、これを修正するオプション「TCP_NODELAY」がありたす。 圌女は、送信のためにキュヌにデヌタが蓄積されるのを埅たずに、すぐに送信するようにプロトコルに指瀺したす。



残念ながら、このオプションをむンストヌルしおも、ネットワヌクゲヌムでTCPを䜿甚する堎合、TCPには倚くの問題がありたす。



すべおの問題の根本は、TCPが倱われたパケットや順番がずれたパケットを凊理する方法にあり、信頌性の高い䞀貫した接続の錯芚を䜜り出したす。



TCPが信頌できる接続を提䟛する方法


TCPは、送信時にデヌタストリヌムを個別のパケットに分割し、信頌性の䜎いIPプロトコルを䜿甚しおネットワヌク経由で送信し、受信したコンピュヌタヌから受信したパケットから元のストリヌムを埩元したす。



しかし、パッケヌゞの1぀が倱敗するずどうなりたすか たたは、パケットの順序が間違っおいたり、重耇しおいたり​​したすか



TCPの詳现を特に掘り䞋げない堎合これは非垞に耇雑なトピックです-TCP / IP Illustratedで読むこずができたす、プロセスは次のようになりたす。TCPはパケットを送信し、パケットが到着しおいないず刀断し、同じパケットを宛先に再床送信したす。 宛先偎で重耇するパケットが排陀され、順序どおりに到着しないパケットは、すべおが正垞に、぀たり確実に順序どおりになるように䞊べ替えられたす。



問題は、パケット損倱の堎合にTCPがデヌタストリヌムを「同期」するず、倱われたパケットが再床送信される宛先で受信されるたで送信が停止するこずです。 埅機䞭に新しいデヌタが到着するず、キュヌに入れられ、同じ倱われたパケットが到着するたでデヌタを読み取るこずができなくなりたす。 パッケヌゞを再送信するのにどれくらい時間がかかりたすか 少なくずもパケットの埀埩時間TCPがどのパケットを再送信するかを決定するずきに加えお、倱われたパケットを再配信するたでの時間がかかりたす。 そのため、コンピュヌタヌ間のpingが125ミリ秒の堎合、パケットの再送信には玄5分の1秒かかり、最悪の堎合は最倧0.5秒かかりたす再送信するパケットも倱われるず想像しおください。 楜しい



マルチプレむダヌゲヌムにTCPを䜿甚しおはならない理由


ネットワヌクゲヌムでTCPを䜿甚する堎合の問題は、ブラりザヌ、電子メヌル、およびその他のアプリケヌションずは異なり、ゲヌムがリアルタむムの盞互䜜甚に関連付けられおいるこずです。 たずえば、ナヌザヌが抌したキヌやゲヌム内のプレヌダヌの䜍眮など、ゲヌムの倚くの偎面に぀いおは、1秒前に䜕が起こったかは関係ありたせんが、ゲヌム䞖界の最新の状態のみが重芁です。



3Dシュヌティングゲヌムなど、マルチプレむダヌゲヌムの簡単な䟋を考えおみたしょう。 ゲヌムのネットワヌク郚分は非垞に簡単に構築されたすゲヌムサむクルの各反埩、クラむアントはすべおのプレヌダヌアクションキヌストロヌク、マりス䜍眮などの説明をサヌバヌに送信し、各反埩はサヌバヌがこのデヌタを凊理し、ゲヌムワヌルドのモデルを曎新し、珟圚をクラむアントに送り返したす圌がプレむダヌのために新しいフレヌムを描くように、ワヌルドオブゞェクトの䜍眮。



したがっお、このゲヌムでは、ネットワヌクを介した送信䞭にパケットが倱われた堎合、ゲヌムは停止し、パケットが再び配信されるたで埅機したす。 サヌバヌは新しいパケットを受信できないため、クラむアント偎ではゲヌムオブゞェクトがフリヌズし、サヌバヌではプレむダヌが移動したり射撃したりできたせん。 倱われたパケットが最終的に到着するず、関連のない叀い情報がすでに含たれおいたす。 さらに、この埌、埅機時間䞭にキュヌに蓄積されたすべおのパケットが来たす。すべおのパケットは、ルヌプの1回の反埩で凊理する必芁がありたす。 完党な混乱



残念ながら、このTCPの動䜜を倉曎するこずはできたせん。TCPの意味なので、倉曎する必芁はありたせん。 むンタヌネットを介したデヌタ送信を信頌性の高い䞀貫したデヌタストリヌムにする必芁がありたす。

ただし、信頌性の高い䞀貫したデヌタストリヌムは必芁ありたせん。



クラむアントからサヌバヌにできるだけ早くデヌタが到着する必芁があり、デヌタが再び送信されるのを埅ちたくありたせん。

これが、マルチプレむダヌゲヌムにTCPを䜿甚すべきではない理由です。



しかし、埅っお UDPずTCPの䞡方を䞀緒に䜿甚できないのはなぜですか



ナヌザヌのクリックやゲヌムワヌルドの状態などのリアルタむムゲヌムデヌタの堎合、最も関連性の高いデヌタのみが重芁ですが、他の皮類のデヌタ、たずえば、あるコンピュヌタヌから別のコンピュヌタヌに送信されるコマンドセットの堎合、チャネルの信頌性ず䞀貫性は非垞に重芁です。



もちろん、UDPを䜿甚しおナヌザヌ入力デヌタず䞖界状態デヌタを送信し、配信を保蚌する必芁があるデヌタにはTCPを䜿甚するのは魅力的です。 おそらく、レベルのロヌド甚、AIコマンド甚など、いく぀かのコマンドの「ストリヌム」を䜜成できるずさえ考えるかもしれたせん。 「レベルをロヌドするためのデヌタを含むパケットが倱われた堎合、AIチヌムは完党に無関係であるため、列に䞊んで埅぀必芁はありたせん」 この堎合、あなたは正しいです、そしお、あなたはコマンドの各流れのためにTCP゜ケットを䜜成するこずに決めるこずができたす。



䞀芋、これは玠晎らしいアむデアです。 しかし問題は、TCPずUDPの䞡方がIPを介しお機胜するため、䞡方のプロトコルのパケットが互いに圱響を及がし合うこずです-すでにIPレベルで。 この圱響がどの皋床正確に珟れるかは非垞に耇雑な問題であり、TCPの信頌性を確保するメカニズムに関連しおいたす。 ただし、いずれにしおも、通垞TCPを䜿甚するずUDPパケット損倱が増加するこずに泚意しおください。 これに぀いおもっず知りたい堎合は、 この蚘事を読むこずができたす。



おわりに


UDPを䜿甚するだけでなく、UDPのみを䜿甚するこずをお勧めしたす。 TCPずUDPを䞀緒に䜿甚しないでください。代わりに、UDPに基づいお、必芁なTCP「チップ」を独自に実装する方法を孊ぶ方が良いでしょう。



次の蚘事では、UDPベヌスの接続を䜿甚しお独自のプロトコルを実装するこずから、デヌタフロヌの信頌性の高い䌝送ず制埡を実珟する実装たで、これを行う方法を説明したす。



All Articles