The transmission function may have multiple levels of complexity. For instance, a function employed by a congestion control module, which captures a simplified version of PCC Allegro's rate computation scheme, can be described as follows: After selecting a transmission rate of r (for instance, 9 Megabits per second) for a specific time interval, the congestion control module evaluates, over the course of the two following time intervals, the implications for performance of transmitting at a rate x % higher than r, for some parameter x, and of transmitting at a rate x % lower than r, for the same parameter x. Each of these two transmission rates, the higher rate and lower rate, is associated by the congestion control module with performance-related data such as throughput, that is, the rate at which data packets arrive at the destination device, and the packet loss rate experienced while sending at this rate. The performance-related data associated with each rate and time interval is then fed into a so-called utility function, which aggregates the performance-related data into a numerical utility value reflecting a performance score associated with the evaluated rate at the relevant time interval. For example, the utility value associated with a specific transmission rate at a specific time interval might be of the form U=aT?bL, where T and L are the throughput and the packet loss rate associated with the specific transmission rate. The parameters a and b are coefficients that reflect the importance for rate computation of each of the two metrics comprising the utility function: maximizing throughput and minimizing packet loss rate. For example, setting b=0 implies that rate optimization at the congestion control module disregards packet loss rate entirely, whereas setting b to be very high implies that rate computation is very sensitive to even a small increase in packet loss rate. After deriving the utility values for the higher and lower transmission rates, the congestion control module selects the transmission rate out of the two for which the utility value is higher. This process is then repeated for the new rate.