mirror of
https://github.com/lsalzman/enet
synced 2024-11-21 14:29:05 -07:00
126 lines
5.9 KiB
Text
126 lines
5.9 KiB
Text
/**
|
|
@page Features Features and Architecture
|
|
|
|
ENet evolved specifically as a UDP networking layer for the
|
|
multiplayer first person shooter Cube. Cube necessitated low latency
|
|
communication with data sent out very frequently, so TCP was an
|
|
unsuitable choice due to its high latency and stream orientation. UDP,
|
|
however, lacks many sometimes necessary features from TCP such as
|
|
reliability, sequencing, unrestricted packet sizes, and connection
|
|
management. So UDP by itself was not suitable as a network protocol
|
|
either. No suitable freely available networking libraries existed at
|
|
the time of ENet's creation to fill this niche.
|
|
|
|
UDP and TCP could have been used together in Cube to benefit somewhat
|
|
from both of their features, however, the resulting combinations of
|
|
protocols still leaves much to be desired. TCP lacks multiple streams
|
|
of communication without resorting to opening many sockets and
|
|
complicates delineation of packets due to its buffering behavior. UDP
|
|
lacks sequencing, connection management, management of bandwidth
|
|
resources, and imposes limitations on the size of packets. A
|
|
significant investment is required to integrate these two protocols,
|
|
and the end result is worse off in features and performance than the
|
|
uniform protocol presented by ENet.
|
|
|
|
ENet thus attempts to address these issues and provide a single,
|
|
uniform protocol layered over UDP to the developer with the best
|
|
features of UDP and TCP as well as some useful features neither
|
|
provide, with a much cleaner integration than any resulting from a
|
|
mixture of UDP and TCP.
|
|
|
|
@section CM Connection Management
|
|
|
|
ENet provides a simple connection interface over which to communicate
|
|
with a foreign host. The liveness of the connection is actively
|
|
monitored by pinging the foreign host at frequent intervals, and also
|
|
monitors the network conditions from the local host to the foreign
|
|
host such as the mean round trip time and packet loss in this fashion.
|
|
|
|
@section Sequencing Sequencing
|
|
|
|
Rather than a single byte stream that complicates the delineation of
|
|
packets, ENet presents connections as multiple, properly sequenced
|
|
packet streams that simplify the transfer of various types of data.
|
|
|
|
ENet provides sequencing for all packets by assigning to each sent
|
|
packet a sequence number that is incremented as packets are sent. ENet
|
|
guarantees that no packet with a higher sequence number will be
|
|
delivered before a packet with a lower sequence number, thus ensuring
|
|
packets are delivered exactly in the order they are sent.
|
|
|
|
For unreliable packets, ENet will simply discard the lower sequence
|
|
number packet if a packet with a higher sequence number has already
|
|
been delivered. This allows the packets to be dispatched immediately
|
|
as they arrive, and reduce latency of unreliable packets to an
|
|
absolute minimum. For reliable packets, if a higher sequence number
|
|
packet arrives, but the preceding packets in the sequence have not yet
|
|
arrived, ENet will stall delivery of the higher sequence number
|
|
packets until its predecessors have arrived.
|
|
|
|
@section Channels Channels
|
|
|
|
Since ENet will stall delivery of reliable packets to ensure proper
|
|
sequencing, and consequently any packets of higher sequence number
|
|
whether reliable or unreliable, in the event the reliable packet's
|
|
predecessors have not yet arrived, this can introduce latency into the
|
|
delivery of other packets which may not need to be as strictly ordered
|
|
with respect to the packet that stalled their delivery.
|
|
|
|
To combat this latency and reduce the ordering restrictions on
|
|
packets, ENet provides multiple channels of communication over a given
|
|
connection. Each channel is independently sequenced, and so the
|
|
delivery status of a packet in one channel will not stall the delivery
|
|
of other packets in another channel.
|
|
|
|
@section Reliability Reliability
|
|
|
|
ENet provides optional reliability of packet delivery by ensuring the
|
|
foreign host acknowledges receipt of all reliable packets. ENet will
|
|
attempt to resend the packet up to a reasonable amount of times, if no
|
|
acknowledgement of the packet's receipt happens within a specified
|
|
timeout. Retry timeouts are progressive and become more lenient with
|
|
every failed attempt to allow for temporary turbulence in network
|
|
conditions.
|
|
|
|
@section FaR Fragmentation and Reassembly
|
|
|
|
ENet will send and deliver packets regardless of size. Large packets
|
|
are fragmented into many smaller packets of suitable size, and
|
|
reassembled on the foreign host to recover the original packet for
|
|
delivery. The process is entirely transparent to the developer.
|
|
|
|
@section Aggregation Aggregation
|
|
|
|
ENet aggregates all protocol commands, including acknowledgements and
|
|
packet transfer, into larger protocol packets to ensure the proper
|
|
utilization of the connection and to limit the opportunities for
|
|
packet loss that might otherwise result in further delivery latency.
|
|
|
|
@section Adaptability Adaptability
|
|
|
|
ENet provides an in-flight data window for reliable packets to ensure
|
|
connections are not overwhelmed by volumes of packets. It also
|
|
provides a static bandwidth allocation mechanism to ensure the total
|
|
volume of packets sent and received to a host don't exceed the host's
|
|
capabilities. Further, ENet also provides a dynamic throttle that
|
|
responds to deviations from normal network connections to rectify
|
|
various types of network congestion by further limiting the volume of
|
|
packets sent.
|
|
|
|
@section Portability Portability
|
|
|
|
ENet works on Windows and any other Unix or Unix-like platform
|
|
providing a BSD sockets interface. The library has a small and stable
|
|
code base that can easily be extended to support other platforms and
|
|
integrates easily. ENet makes no assumptions about the underlying
|
|
platform's endianess or word size.
|
|
|
|
@section Freedom Freedom
|
|
|
|
ENet demands no royalties and doesn't carry a viral license that would
|
|
restrict you in how you might use it in your programs. ENet is
|
|
licensed under a short-and-sweet MIT-style license, which gives you
|
|
the freedom to do anything you want with it (well, almost anything).
|
|
|
|
*/
|
|
|