# Two-Level Congestion Control Mechanism (2 LCCM) for Information-Centric Networking
## 4 Implementation
### Congestion Control Algorithm  
To accommodate the receiver-driven transmission mode of ICN, as shown in Figure 4, we adapt the TCP data packets and acknowledgment packets to the request packets and response packets in ICN, where the dashed lines are control packets and the solid lines are data packets. During the chunk transmission, the request sending rate is adjusted by the congestion control module at the receiver to avoid link congestion while making full use of the spare bandwidth. ICN congestion control algorithms can refer to classical TCP congestion control algorithms such as Reno [29], Cubic [38], and BBR [39], but need to be redesigned to receiver-driven mode. For example, the chunk transmission of ICTP directly uses the  
Figure 4: Transmission mode comparison of TCP and ICN. Figure 3: The data structure of NST. Reno algorithm to adjust the rate. Receiver-driven congestion control algorithms usually maintain the required congestion control parameters, including congestion window (_cwnd_), RTT, and request queue at the receiver side to increase or decrease the request sending rate. In addition, the initial request sending rate at the receiver side can be determined based on the transmission history information, thus enabling a fast start during the congestion control algorithm. The loss-based congestion control algorithm introduces the _bufferbloat_[40] problem making the end-to-end delay higher, and causing the problem of poor bandwidth utilization due to the inability to distinguish between random packet loss and congestion loss [41]. Therefore, the link capacity-based BBR algorithm is redesigned into a receiver-driven congestion control algorithm based on the ICN scenario instead of using a loss-based congestion control algorithm in this paper. BBR no longer determines network congestion state by packet loss, and only retransmits packets after packet loss occurs. It calculates the RTT by matching the relationship between the request packets and the response packets. It obtains the link bandwidth based on the actual data volume carried in the response packets. Both current network bandwidth and RTT are dynamically detected and calculated. Only when the number of packets is greater than the bandwidth-delay product (BDP) as Equation (7) shows, BBR considers the network is congested. \[BDP=\text{B}_{\text{max}}\times\text{RTT}_{\text{min}} \tag{7}\]  
Among them, \(\text{B}_{\text{max}}\) and \(\text{RTT}_{\text{min}}\) are two important parameters. BBR approximates the bottleneck bandwidth of the network as \(\text{B}_{\text{max}}\) by continuously estimating the network transmission rate at the receiver and maintains a minimum RTT of 10 s called \(\text{RTT}_{\text{min}}\). The BBR smoothly sends out the data requests according to the rate _pacing_rate_, and it controls the total amount of inflight data allowed to be sent to the current link based on the congestion window _cwnd_. The transmission rate and congestion window are calculated as shown in Equations (8) and (9), respectively. \[pacing\_rate=\text{B}_{\text{max}}\times\text{pacing\_gain} \tag{8}\]  
\[cwnd=BDP\times\text{cwnd\_gain} \tag{9}\]  
The _pacing_gain_ and _cwnd_gain_ are the transmission rate gain factor and the congestion window gain factor, respectively. The BBR algorithm can be divided into four states, _STARTUP_, _DRAIN_, _PROBE_BW_, and _PROBE_RTT_. The BBR starts from the _STARTUP_ state and increases the transmission rate rapidly in a multiplicative incremental manner, with the _pacing_gain_ and _cwnd_gain_ both being 2/ln2. When the maximum bandwidth detected in the _STARTUP_ state does not increase by more than 25% for three consecutive rounds, the BBR considers the link is full and enters the _DRAIN_ state to empty the link queue of excess data, and the _pacing_gain_ is reduced to ln2/2. When the size of the data in the link is reduced to BDP, the BBR enters the _PROBE_BW_ state to detect the available bandwidth of the network link.