TCP Congestion Control and Dynamic Systems
I have recently been reading Donella Meadows’s book “Thinking in Systems: A Primer.” The core insight of the book is that there are certain types of organizing structures called ‘systems’. ‘Systems’, in this parlance, consist of feedback loops that control stocks (a quantity of a thing: population, capital, number of frogs) via flows (increase or decrease in the stock). The interesting thing about systems is that they are capable of adapting to a variety of situations.
One of the types of systems she included was a system where a stock has a reinforcing loop - basically a positive feedback loop (think of how interest accumulates) and a balancing loop (thing that keeps the stock from growing infinitely). If there is delay in the information that arrives to the thing that controls the stock, there is overshoot as the loop tries hard to compensate for the change. However, by the time it has compensated, it may have actually gone up too much and so the balancing loop kicks in to get it down again. This creates an oscillatory pattern.
I had filed this away mentally as “pretty cool concept”. Perhaps it was related to boom and bust cycles in the economy? But today browsing YouTube I found a video titled “why do downloads look like a wave.” I was curious because I had noticed this before but thought it was random. It turns out this is because of something called TCP Congestion Control. TCP is the protocol that controls packet transfer on the internet (how we can download stuff).
So, back in the day, there was an issue where too many people were downloading stuff. The rate of growth was quite dramatic. However, eventually the system reached capacity. Worse, the servers saw that the packets were not being sent and kept sending even MORE packets. This caused a collapse and nothing could get through. (This sort of collapse is also characteristic of systems, but that’s not relevant right now.)
They came up with something called Congestion Control, which would allow the rate at which packets were sent to change depending on how many successful or failed packets were going through. You start with a small amount of packets and then, as the number of successful packets increases, you increase the number of packets. (This is called a slow start.) Eventually, you start getting failed packets and you dial back how many packets come through. Once a certain acceptable point is reached, you start to dial up again, and so forth.

Looking at this, it seemed to me that this was an example of an oscillation caused by delay! Remember that it does not know right away how many failed packets are coming through. It has to wait until it gets enough to then correct. It then has to compensate for that.
It was very interesting to see an application of systems theory like this in the wild. I hope this was interesting to you too.