Okay. This si from memory but…
B.U.L.L.E.T. or Bills Ultimatew Latency Lage Elmination Technology worked as follows.
Background Information:
In order to understand BULLET you have to understand a tiny bit about TCP/IP. The first thing to realzie is that, under normal conditions, TCP and UDP perform almost identically. The difference in behavior, and thus performance, is when a packet is lost en-route. UDP just ignores it and keeps flowing the packets-- the data is lost. TCP/IP stops the flow of pacekts and sends a packet back asking for a re-transmirt of the lsot data. Because TCP gaurantees in-order delivery it cannot deliver the later packets until it gets that lost one so it queues them up. The result is a latency spike and then a whole bunch of packets being delievered one right after the other.
What BULLET did was to cover that latency spike with a second channel of data. In addition to sending the packets via TCP, they were collected and periodically sent as a “window” of packets in a UDP channel. We found it was fairly rare for BOTH the TCP and the relevent UDP packet to be lost at the same time. So if the UDP packet arrives with packets that the TCP channel hasnt delivered yet, we just continue the flow by sending those to the client. When the blocked up TCP does arrrive, we throw away the already seen packets.
Because order is not gauranteed in UDP its possible we mkight recieve the “windows” out of order. We handle this by locally storing any “future” windows until we’ve passed through their packets.
Obviosuly we cant use the TCP layer’s packet numbering for this ebcause its not exposed to us, so all these packets have a few bytes of packet nukmber pre-pended before they are sent.
We found that this radically reduced the ocassional laytency spikes you see in TCP and which caused us so much grief in gameplay.
It was preferrable in our judgement to a pure UDP reliability scheme for two reasons:
(1) For various reasons, the network-layer-level TCP has advantages over an attempt to do the same thing at the user level. For instance, internet routers can reckognize TCP packets and thus give them priority over UDP packets when the router backs up.
(2) Its not reinventing the wheel. TCP was already there so why take the extra cost and added bugs-risk of building reliable in order delivery ourselves out of UDP?