| * Why ENet? |
| |
| ENet evolved specifically as a UDP networking layer for the multiplayer |
| first person shooter Cube. Cube necessitated low latency communcation 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. |
| |
| * 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. |
| |
| * 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 |
| guarentees 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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). |
| |
| |