[ENet-discuss] Optimizing ENet Protocol ?
Emmanuel Rivoire
manu.n02 at laposte.net
Thu May 24 04:42:10 PDT 2012
Hello,
At 18:05 24/05/2012, you wrote:
>The length is needed because ENet does all sorts of aggregation. The
>packet boundaries are not 1:1. If you have 10 ENet packets in one
>UDP protocol packet, well, there's no way to find the packet
>boundaries without length. This would only be possible for the last
>ENet packet in a protocol packet, but you are still subject to one
>final caveat with this that makes it not really worth it... Packet
>lengths themselves as reported by UDP are not reliable: routers are
>free to fragment, chop up, etc. packets as will, as is the OS itself
>before it even sends it to the router, and the OS on the receiving
>end even as it hands the packet off to the user. By the time the
>packet gets to you, you have no indication that this packet mangling
>happened without one of two mechanisms: either a checksum or a
>length. So length has multiple useful functions here.
I looked everything in enet_protocol_receive_incoming_commands() then
enet_socket_receive(), and I cannot see anything else than 1 UDP
packet = 1 ENet message for unsequenced messages : there's no
concatenation at all, only packet dropping if dataLength isn't big enough.
I guess there's some for ENetProtocolSendFragment , but it should
happen only if you detect the message size is bigger than MTU, no ?
As far as I can tell, DirectPlay doesn't handle packet length, and I
never had trouble with packets arriving cut in half...
>Moreover, I'm planning to remove
>ENetProtocolSendUnsequenced::unsequencedGroup which is not mandatory
>at ENet level (this is an arguable opinion ;) ), mainly because I
>already have the attached functionality in the high level part of my
>network code, but using less bits, so it's redundant and less
>effective at ENet level.
>2 more bytes saved.
>
>Lastly, if I understood the code correctly
>ENetProtocolSendUnsequenced::header::reliableSequenceNumber isn't
>needed (it's always set to 0), so that's 2 bytes wasted (only for
>unsequenced message case).
>
>Unsequenced is not simply a normal UDP packet, it is unsequenced,
>but still not redundant, not quite what you're thinking. It was done
>this way mainly for uniformity with the other packet types to keep
>things simple; conceivably you could squish the unsequenced group
>number into the reliable sequence number space or if you don't care
>about redundant just remove both somehow. On the other hand, I'm not
>really interested in breaking protocol compatibility for all users
>at this point over a feature that isn't really of central utility to
>most users. In the future I could maybe implement a truly
>unsequenced/redundant (= truly unreliable) packet type if there was
>ever sufficient demand, but I think the current unreliable type is
>the main backbone packet for most people and is generally the most
>efficient type to use anyway - there is no real efficiency gain from
>using unsequenced in the current protocol, it's just a semantic
>thing for when you really need to violate the packet sequencing
>restrictions for some reason.
It's not the packet which is redundant, but the code, coz I thought I
already did that in my high level network code... :) (I call this
high level because I did this above DirectPlay)
But I may have understood wrongly what you did. I thought
unsequencedGroup was used to drop packets that arrive way too late. I
guess I'd have to dig a bit more in the code to get it all right, but
if you tell me I can chop it out, it's all I need to know for now..!
>So the main changes you're left with is you could save that one byte
>of space for the peer id, and conceivably up to 4 bytes in the
>unsequenced packet's header by removing the unsequenced group
>functionality (2) and not including the reliable sequence number
>(2). So between those two if it's a substantial use case for you you
>could save 4-5 bytes per unsequenced user packet if it is really an
>important use case for you. Though I don't think I can do this for
>the general ENet because it would break compatibility with older
>versions and all the hassle that causes. You are of course free to
>make these changes in your own project as that's why I kept the
>source code small, understandable, and open in the first place: I
>did want it to be a library that people could dig in and make
>whatever personal customizations they needed for their project.
Thanks for your help.
I was not asking to do that for me, just the feasibility... ;)
I'm going to do a feature request in a new thread on something
different, though, just in case..!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cubik.org/pipermail/enet-discuss/attachments/20120524/7d3e3632/attachment.html>
More information about the ENet-discuss
mailing list