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