[13] | 1 | * Why ENet? |
---|
| 2 | |
---|
| 3 | ENet evolved specifically as a UDP networking layer for the multiplayer |
---|
| 4 | first person shooter Cube. Cube necessitated low latency communcation with |
---|
| 5 | data sent out very frequently, so TCP was an unsuitable choice due to its |
---|
| 6 | high latency and stream orientation. UDP, however, lacks many sometimes |
---|
| 7 | necessary features from TCP such as reliability, sequencing, unrestricted |
---|
| 8 | packet sizes, and connection management. So UDP by itself was not suitable |
---|
| 9 | as a network protocol either. No suitable freely available networking |
---|
| 10 | libraries existed at the time of ENet's creation to fill this niche. |
---|
| 11 | |
---|
| 12 | UDP and TCP could have been used together in Cube to benefit somewhat |
---|
| 13 | from both of their features, however, the resulting combinations of protocols |
---|
| 14 | still leaves much to be desired. TCP lacks multiple streams of communication |
---|
| 15 | without resorting to opening many sockets and complicates delineation of |
---|
| 16 | packets due to its buffering behavior. UDP lacks sequencing, connection |
---|
| 17 | management, management of bandwidth resources, and imposes limitations on |
---|
| 18 | the size of packets. A significant investment is required to integrate these |
---|
| 19 | two protocols, and the end result is worse off in features and performance |
---|
| 20 | than the uniform protocol presented by ENet. |
---|
| 21 | |
---|
| 22 | ENet thus attempts to address these issues and provide a single, uniform |
---|
| 23 | protocol layered over UDP to the developer with the best features of UDP and |
---|
| 24 | TCP as well as some useful features neither provide, with a much cleaner |
---|
| 25 | integration than any resulting from a mixture of UDP and TCP. |
---|
| 26 | |
---|
| 27 | * Connection management |
---|
| 28 | |
---|
| 29 | ENet provides a simple connection interface over which to communicate |
---|
| 30 | with a foreign host. The liveness of the connection is actively monitored |
---|
| 31 | by pinging the foreign host at frequent intervals, and also monitors the |
---|
| 32 | network conditions from the local host to the foreign host such as the |
---|
| 33 | mean round trip time and packet loss in this fashion. |
---|
| 34 | |
---|
| 35 | * Sequencing |
---|
| 36 | |
---|
| 37 | Rather than a single byte stream that complicates the delineation |
---|
| 38 | of packets, ENet presents connections as multiple, properly sequenced packet |
---|
| 39 | streams that simplify the transfer of various types of data. |
---|
| 40 | |
---|
| 41 | ENet provides sequencing for all packets by assigning to each sent |
---|
| 42 | packet a sequence number that is incremented as packets are sent. ENet |
---|
| 43 | guarentees that no packet with a higher sequence number will be delivered |
---|
| 44 | before a packet with a lower sequence number, thus ensuring packets are |
---|
| 45 | delivered exactly in the order they are sent. |
---|
| 46 | |
---|
| 47 | For unreliable packets, ENet will simply discard the lower sequence |
---|
| 48 | number packet if a packet with a higher sequence number has already been |
---|
| 49 | delivered. This allows the packets to be dispatched immediately as they |
---|
| 50 | arrive, and reduce latency of unreliable packets to an absolute minimum. |
---|
| 51 | For reliable packets, if a higher sequence number packet arrives, but the |
---|
| 52 | preceding packets in the sequence have not yet arrived, ENet will stall |
---|
| 53 | delivery of the higher sequence number packets until its predecessors |
---|
| 54 | have arrived. |
---|
| 55 | |
---|
| 56 | * Channels |
---|
| 57 | |
---|
| 58 | Since ENet will stall delivery of reliable packets to ensure proper |
---|
| 59 | sequencing, and consequently any packets of higher sequence number whether |
---|
| 60 | reliable or unreliable, in the event the reliable packet's predecessors |
---|
| 61 | have not yet arrived, this can introduce latency into the delivery of other |
---|
| 62 | packets which may not need to be as strictly ordered with respect to the |
---|
| 63 | packet that stalled their delivery. |
---|
| 64 | |
---|
| 65 | To combat this latency and reduce the ordering restrictions on packets, |
---|
| 66 | ENet provides multiple channels of communication over a given connection. |
---|
| 67 | Each channel is independently sequenced, and so the delivery status of |
---|
| 68 | a packet in one channel will not stall the delivery of other packets |
---|
| 69 | in another channel. |
---|
| 70 | |
---|
| 71 | * Reliability |
---|
| 72 | |
---|
| 73 | ENet provides optional reliability of packet delivery by ensuring the |
---|
| 74 | foreign host acknowledges receipt of all reliable packets. ENet will attempt |
---|
| 75 | to resend the packet up to a reasonable amount of times, if no acknowledgement |
---|
| 76 | of the packet's receipt happens within a specified timeout. Retry timeouts |
---|
| 77 | are progressive and become more lenient with every failed attempt to allow |
---|
| 78 | for temporary turbulence in network conditions. |
---|
| 79 | |
---|
| 80 | * Fragmentation and reassembly |
---|
| 81 | |
---|
| 82 | ENet will send and deliver packets regardless of size. Large packets are |
---|
| 83 | fragmented into many smaller packets of suitable size, and reassembled on |
---|
| 84 | the foreign host to recover the original packet for delivery. The process |
---|
| 85 | is entirely transparent to the developer. |
---|
| 86 | |
---|
| 87 | * Aggregation |
---|
| 88 | |
---|
| 89 | ENet aggregates all protocol commands, including acknowledgements and |
---|
| 90 | packet transfer, into larger protocol packets to ensure the proper utilization |
---|
| 91 | of the connection and to limit the opportunities for packet loss that might |
---|
| 92 | otherwise result in further delivery latency. |
---|
| 93 | |
---|
| 94 | * Adaptability |
---|
| 95 | |
---|
| 96 | ENet provides an in-flight data window for reliable packets to ensure |
---|
| 97 | connections are not overwhelmed by volumes of packets. It also provides a |
---|
| 98 | static bandwidth allocation mechanism to ensure the total volume of packets |
---|
| 99 | sent and received to a host don't exceed the host's capabilities. Further, |
---|
| 100 | ENet also provides a dynamic throttle that responds to deviations from normal |
---|
| 101 | network connections to rectify various types of network congestion by further |
---|
| 102 | limiting the volume of packets sent. |
---|
| 103 | |
---|
| 104 | * Portability |
---|
| 105 | |
---|
| 106 | ENet works on Windows and any other Unix or Unix-like platform providing |
---|
| 107 | a BSD sockets interface. The library has a small and stable code base that |
---|
| 108 | can easily be extended to support other platforms and integrates easily. |
---|
| 109 | |
---|
| 110 | * Freedom |
---|
| 111 | |
---|
| 112 | ENet demands no royalties and doesn't carry a viral license that would |
---|
| 113 | restrict you in how you might use it in your programs. ENet is licensed under |
---|
| 114 | a short-and-sweet MIT-style license, which gives you the freedom to do anything |
---|
| 115 | you want with it (well, almost anything). |
---|
| 116 | |
---|
| 117 | |
---|