{{Short description|TCP congestion avoidance algorithm}} {{Use American English|date=January 2019}} {{Use mdy dates|date=January 2019}} {{primary sources|date=April 2012}}
'''BIC TCP''' ('''Binary Increase Congestion control''') is one of the congestion control algorithms that can be used for Transmission Control Protocol (TCP). BIC is optimized for high-speed networks with high latency: so-called long fat networks. For these networks, BIC has significant advantage over previous congestion control schemes in correcting for severely underutilized bandwidth.<ref>{{Cite web|url=http://www4.ncsu.edu/~rhee/export/bitcp/bicfaq.htm|title=BIC FAQ|website=www4.ncsu.edu|access-date=2018-12-25|archive-date=December 12, 2018|archive-url=https://web.archive.org/web/20181212214333/http://www4.ncsu.edu/~rhee/export/bitcp/bicfaq.htm|url-status=dead}}</ref>
BIC implements a unique congestion window (cwnd) algorithm. This algorithm tries to find the maximum cwnd by searching in three parts: binary search increase, additive increase, and slow start. When a network failure occurs, the BIC uses multiplicative decrease in correcting the cwnd.<ref>{{Cite journal|title=Binary increase congestion control (BIC) for fast long-distance networks - IEEE Conference Publication|language=en-US|doi=10.1109/INFCOM.2004.1354672|s2cid=11750446}}</ref>
BIC TCP is implemented and used by default in Linux kernels 2.6.8 and above. The default implementation was again changed to CUBIC TCP in the 2.6.19 version.
== Algorithm == Define the following variables: S<sub>max</sub>: the maximum increment S<sub>min</sub>: the minimum increment w<sub>max</sub>: the maximum window size β: multiplicative window decrease factor cwnd: congestion window size bic_inc: window increment per RTT (round trip time)
'''At every RTT interval update cwnd with the following:'''
If no packets are dropped, the congestion window (cwnd) increases in three distinct ways: binary search increase, additive increase, and slow start. In each step, one is used as an increment.
'''One step of increasing cwnd:''' if (cwnd < w<sub>max</sub>) // binary search OR additive bic_inc = (w<sub>max</sub> - cwnd) / 2; else // slow start OR additive bic_inc = cwnd - w<sub>max</sub>; if (bic_inc > S<sub>max</sub>) // additive bic_inc = S<sub>max</sub>; else if (bic_inc < S<sub>min</sub>) // binary search OR slow start bic_inc = S<sub>min</sub>; cwnd = cwnd + (bic_inc / cwnd); If one or more packets are dropped, the cwnd is reduced using multiplicative decrease. This requires β, which is used in decreasing cwnd by (100×β)%. In the case of two flows, one with a large cwnd and the other a small cwnd, ''fast convergence'' is used to decrease the greater cwnd flow's w<sub>max</sub> at a greater rate than the smaller cwnd's flow to allow faster convergence of the greater cwnd's flow when increasing its cwnd.
'''One step of decreasing cwnd:''' if (cwnd < w<sub>max</sub>) // fast convergence w<sub>max</sub> = cwnd * (2-β) / 2; else w<sub>max</sub> = cwnd; cwnd = cwnd * (1-β);
==See also== * TCP congestion avoidance algorithm * {{section link|Transmission Control Protocol|Development}} * SCTP * CUBIC TCP
==References== {{Reflist}}
==External links== *[https://archive.today/20121212100254/http://research.csc.ncsu.edu/netsrv/?q=content/bic-and-cubic] Home Page.
Category:TCP congestion control