It’s because bits per second is almost always correct. Bytes are not always 8-bits.
I’m sure most people who know anything about computers will tell you a byte is 8-bits. For the longest time, the byte is 8-bits. However, this wasn’t always the case in the history of computers. According to Wikipedia, which has four citations on this, a byte has been anywhere from 1 to 48 bits. Since getting pieces of hardware to talk to each other has been around since computers have been a thing, one could see some confusion if a communication bus listed bytes per second and see two different numbers because one computer thinks 8-bits is a byte while another thought 12-bits was a byte.
There’s also the physical aspect of this. When computers talk to each other, typically they use voltage levels to say what’s a 0 and what’s a 1. In an example case, let’s say 0V is a binary 0, and 5V is a binary 1, and the communication interface transfer one bit a time (this is actually common, but more on that in a later post). Given this, here’s a question: assuming 8-bits per byte, how do you transmit 0000 0000? Or a byte value of 0? While the obvious answer is to say “transmit 0V eight times!”, here’s a problem: how does the receive know it received something? If the communication idle voltage is 0V, then if you look at the voltage it looks like nothing happened. Also, even if the receiver knew a transmitter was sending something, how does it know when to stop listening?
With this, we have two problems that need to be solved:
- How does a receiver know when to start listening?
- How does a receiver know when to stop listening?
This is similar to how people communicate over radios. You don’t want the radio to continuously listen as it wastes power and the radio operator in some situations may not want to constantly listen and pick out important data. Likewise, the radio operator needs to know when to stop listening so they know whoever was talking to them is done, such as if the radio operator is receiving orders.
Fortunately the solution to this is simple: spend a bit to tell a receiver “hey, I’m transmitting now” and another to say “okay, I’m done transmitting.” Optionally, another bit known as a parity bit may be added to provide a hint if the data transmitted had errors.
In an 8-bit per byte data system, these two bits aren’t going to be spent in the actual 8-bit byte itself. Rather, they’re tacked onto the data. So the resulting information that’s transmitted in our example is actually 10 bits per “byte.” While this implies you could just say “add two bits on top of your data and say that’s a byte”, the problem is that the number of bits to mark start, stop, and parity can change. In common basic serial communication, the stop marker could be 1, 1.5, or 2 bits.
Another part that can throw people off is the assumption that “bits per second” also means how many times the voltage levels can shift between whatever is binary 0 and binary 1. This isn’t always the case. One important piece to computer communication is how fast the communication is done between them. Sometimes this is predetermined ahead of time (e.g., two computers will always talk at 1,000 bits per second) or a separate clock signal is sent, requiring another wire. However, some communication standards embed the clock signal in the data itself, with the receiver able to figure out the clock signal from how the signal it receives behaves. This at the minimum requires two “bits” to be spent on the actual data, with every “bit” spent on embedding this clock signal. An example of this is Manchester Code.
This is why the qualifier “almost always” was put in the tl;dr, it’s because bits per second itself can mean something different. Instead, the term “baud” is used to describe how often the voltage signal can swing in a second. In the Manchester Code example, baud is twice as much as the bit rate. But a vast majority of the time, I’ve seen bits per second to equal baud.
Another example to add more “bits” to the data byte is to spend more bits in order to achieve what is called DC Balance, or more technically, a DC bias of 0V. This is often used in high-speed communication, as they have filters in the form of capacitors on the circuit to help keep the signal clean. If over time there was not a DC bias of 0V, the capacitors will charge up allowing the communication line to have some non-zero voltage. If this gets too high, then the communication line will appear to be frozen at a particular binary value. An example of signal coding used for this purpose is 8b/10b encoding. This is used in many modern PC communication standards including HDMI, USB 3.0, SATA, and PCI-Express (until 3.0, which uses 128/130b encoding).
Overall, the primary reason why computer data communication is expressed in bits per second is that “bytes per second” has no real meaning. 8-bits aren’t always a byte and extra bits on top of the data is used for other purposes.