Flow control is important because it is possible for a sending computer to transmit information at a faster rate than the destination computer can receive and process them. This can happen if the receiving computers have a heavy traffic load in comparison to the sending computer, or if the receiving computer has less processing power than the sending computer.
Transmit flow control may occur between data on and off terminal equipment (DTE) and a switching center, via data circuit-terminating equipment (DCE), or between two DTEs. The transmission rate may be controlled because of network or DTE requirements. Transmit flow control can occur independently in the two directions of data transfer, thus permitting the transfer rates in one direction to be different from the transfer rates in the other direction. Transmit flow control can be either stop-and-go or use a sliding window.
Flow control can be done either by control lines in a data communication interface (see serial port and RS 232), or by reserving in-band control characters to signal flow start and stop (such as the ASCII codes for XON/XOFF). Common RS 232 control lines are RTS (Request To Send)/CTS (Clear To Send) and DSR (Data Set Ready)/DTR (Data Terminal Ready), which is usually referred to as "hardware flow control". XON/XOFF is usually referred to as "software flow control". In the old mainframe days, modems were called "data sets", hence the survival of the term.
Hardware flow control typically works by the DTE or master end first raising or asserting its line, such as RTS, which signals the opposite end (the slave end such as a DCE) to begin monitoring its data input line. When ready for data, the slave end will raise its complementary line, CTS in this example, which signals the master to start sending data, and for the master to begin monitoring the slave's data output line. If either end needs to stop the data, it lowers its respective line. For PC-to-modem and similar links, DTR/DSR are raised for the entire modem session (say a dialup internet call), and RTS/CTS are raised for each block of data.
An earlier version of this section was based on Federal Standard 1037C.