# Improving Congestion Control of TCP for Constrained IoT Networks
## 2 Related Work
### Studies on Congestion Control for CoAP  
In devising a congestion control mechanism of TCP for constrained networks, it is worthwhile to refer to CoAP, which was defined by the IETF (Internet Engineering Task Force) CoRE (Constrained RESTful Environments) Working Group. For CoAP running over UDP, lightweight reliability is supported using confirmable (CON) messages and ACK messages. If the sender does not receive any ACK message acknowledging a CON message before the retransmission timer expires, the CON message is retransmitted as long as the retransmission counter does not exceed MAX_RETRANSMIT, which is usually set to four. The basic congestion control of CoAP is carried out by setting RTO without measuring RTT and by limiting the number of outstanding CON messages. For each new CON message, the initial RTO is randomly chosen between \(1\times\text{ACK\_TIMEOUT}\) and \(\text{ACK\_RANDOM\_FACTOR}\times\text{ACK\_TIMEOUT}\). Since the default values of \(\text{ACK\_TIMEOUT}\) and \(\text{ACK\_RANDOM\_FACTOR}\) are 2 s and 1.5, respectively, RTO is chosen randomly between 2 and 3 s by default. CoAP employs a binary exponential backoff mechanism which doubles RTO whenever a timeout occurs. Among numerous efforts to enhance the basic congestion control of CoAP, the best-known congestion control mechanism for CoAP is CoCoA [19; 20]. The key features of CoCoA include weak RTO estimator and variable backoff factor (VBF). The weak RTO estimator also uses retransmitted segments when updating RTT estimates. We describe CoCoA in more detail in Section 3. CoCoA was examined by a number of studies. In Reference [25], the authors reported that CoCoA can perform significantly worse than default CoAP, especially with bursty traffic and in networks with few clients as a result of an improper selection of the retransmission timeouts. CoCoA 4-state-strong [26] addresses the performance issue of CoCoA in lossy networks. The authors reported that CoCoA underperformed the default CoAP in highly lossy networks due to inaccurate measurement of the weak RTT estimator and excessive RTO backoff on channel losses. CoCoA 4-state-strong attempts to enhance the accuracy of RTT measurement by using a retransmission ID or by measuring the time from the latest transmission. CoCoA 4-state-strong uses four states to determine the RTO backoff factor and the weight for the overall RTO calculation. Each CoAP transaction starts in state 1. The state transitions according to (re)transmission and acknowledgement. For each transmission, the transaction moves to the next higher state. Conversely, for each acknowledgement, the transaction moves to the next lower state. For a higher state, the backoff factor is set to a higher value. For a large RTO value, a small backoff factor is used. Precise congestion control algorithm (pCoCoA) [27] is another scheme to overcome the limitations of CoCoA by enhancing the accuracy of RTT. The authors pointed out that CoCoA may incur many spurious retransmissions at some offered loads close to congestion and that the weak estimator is not effective in adapting to changing traffic loads. pCoCoA eliminates the use of the weak estimator by introducing a CoAP option named the transmission count (TC) option to match each ACK message with the corresponding CON message even when it is a retransmitted CON message. To adapt more effectively to changing traffic load, pCoCoA computes RTO in a similar way to Linux TCP. It is notable that that several studies including CoCoA 4-state-strong and pCoCoA suggested measuring RTT more accurately by using the (re)transmitted ID or counter option in CoAP messages [26; 27]. However, this approach is not suitable for TCP because it is not feasible to use a field in the TCP header for a specific purpose. Since TCP is a widely used transport-layer protocol, the TCP option used for special networks is likely to be easily ignored by the counterpart TCP which is a general implementation. The early version of CoCoA [28] is slightly different from the current version.