0x5C2AAD80
QuicNetは、以下に説明するQUICプロトコルの.NET実装です。この実装は、QUIC-Transport Draftの32番目のバージョンに沿ったままであり、以下の関連ドラフトの実装をまだ提供していません。
最小限の作業例
using System ;
using System . Text ;
using QuicNet ;
using QuicNet . Streams ;
using QuicNet . Connections ;
namespace QuickNet . Tests . ConsoleServer
{
class Program
{
// Fired when a client is connected
static void ClientConnected ( QuicConnection connection )
{
connection . OnStreamOpened += StreamOpened ;
}
// Fired when a new stream has been opened (It does not carry data with it)
static void StreamOpened ( QuicStream stream )
{
stream . OnStreamDataReceived += StreamDataReceived ;
}
// Fired when a stream received full batch of data
static void StreamDataReceived ( QuicStream stream , byte [ ] data )
{
string decoded = Encoding . UTF8 . GetString ( data ) ;
// Send back data to the client on the same stream
stream . Send ( Encoding . UTF8 . GetBytes ( "Ping back from server." ) ) ;
}
static void Main ( string [ ] args )
{
QuicListener listener = new QuicListener ( 11000 ) ;
listener . OnClientConnected += ClientConnected ;
listener . Start ( ) ;
Console . ReadKey ( ) ;
}
}
} using System ;
using System . Text ;
using QuicNet . Connections ;
using QuicNet . Streams ;
namespace QuicNet . Tests . ConsoleClient
{
class Program
{
static void Main ( string [ ] args )
{
QuicClient client = new QuicClient ( ) ;
// Connect to peer (Server)
QuicConnection connection = client . Connect ( "127.0.0.1" , 11000 ) ;
// Create a data stream
QuicStream stream = connection . CreateStream ( QuickNet . Utilities . StreamType . ClientBidirectional ) ;
// Send Data
stream . Send ( Encoding . UTF8 . GetBytes ( "Hello from Client!" ) ) ;
// Wait reponse back from the server (Blocks)
byte [ ] data = stream . Receive ( ) ;
Console . WriteLine ( Encoding . UTF8 . GetString ( data ) ) ;
// Create a new data stream
stream = connection . CreateStream ( QuickNet . Utilities . StreamType . ClientBidirectional ) ;
// Send Data
stream . Send ( Encoding . UTF8 . GetBytes ( "Hello from Client2!" ) ) ;
// Wait reponse back from the server (Blocks)
data = stream . Receive ( ) ;
Console . WriteLine ( Encoding . UTF8 . GetString ( data ) ) ;
Console . ReadKey ( ) ;
}
}
}QUICは、Googleが設計したRFC 9000に準拠した標準化されたトランスポートレイヤープロトコルであり、接続指向のWebアプリケーションのデータ転送を高速化することを目指しています。このアプリケーションレベルのプロトコルは、いくつかの手法を使用してTCP転送に似ている間にTCPからUDPに切り替えることを目的としています。また、接続の握手を減らしながら、異なるデータエンティティを転送中に相互に補強できる方法で賢明なマルチプレックス手法を提供することを目的としています。
接続は、2つのエンドポイント間の通信を表す最初のティア論理チャネルです。接続が確立されると、2つのエンドポイント間で接続IDがネゴシエートされます。接続IDは、Wi-Fiの変更やWi-Fiからモバイルデータへの切り替えなど、低いプロトコルレイヤーで変更が発生した場合でも、接続を識別するために使用されます。このメカニズムは、交渉フローの再起動と復活データの再起動を防ぐ接続移行と呼ばれます。
ストリームは、データのストリームを表す第2層の論理チャネルです。単一の接続には、交渉された数のストリーム(たとえば最大8)があり、マルチプレックスエンティティとして機能します。すべてのストリームには、転送されるさまざまなデータオブジェクトを識別するために使用される独自の生成されたストリームIDがあります。すべてのデータが読み取られたときにストリームは閉じられ、またはネゴシエートされた最大データ転送に到達します。
パケットはデータ転送ユニットです。パケットヘッダーには、このパケットが送信されている接続に関する情報と暗号化情報が含まれています。追加の転送情報を剥がした後、残っているのはデータのフレームです(パケットには複数のフレームがあります)。
フレームは、握手交渉、エラー処理などのアクションに必要なエンドポイントまたはプロトコルパケットに移動する必要があるデータを含む最小のユニットです。
フォークに続いて、Githubワークフローをプルします。
詳細については、貢献をお読みください
Quic-ransportドラフトは、Quic-Transportで前述したように、見つけることができます。
QUICをテストして追加情報を見つけるために、QUICで遊ぶことができます。
公式のC ++ソースコードは、proto-quicで見つけることができます。