CC_NEWRENO(4)

πŸ’– cc_newreno(4) β€” NewReno Congestion Control Algorithm πŸ’–

okay bestie, gather round, because we're about to talk about cc_newreno, and it's literally the default TCP congestion control algorithm β€” like, the main character of your TCP stack. this is a Kernel Interfaces Manual page, section 4, and it's giving absolute legend energy. the algorithm deets live in RFC5681 if you wanna go read the source material. iykyk 🫢


✨ NAME ✨

cc_newreno β€” the NewReno Congestion Control Algorithm. that's it, that's the name, no notes πŸ’…


🌸 SYNOPSIS 🌸

#include <netinet/cc/cc_newreno.h>

πŸ¦‹ DESCRIPTION πŸ¦‹

so the NewReno congestion control algorithm is the default for TCP. yes, THE default. the moment. the blueprint. if you didn't pick anything else, congrats, you're already running it πŸŽ€

want the full lore? all the algorithm details live in RFC5681. go read it, bestie, it's right there.


πŸŽ€ Socket Options πŸŽ€

the cc_newreno module supports a bunch of socket options under TCP_CCALGOOPT β€” and heads up, tcp(4) and moc_cc(9) have the details on that whole situation. you set these with setsockopt(2) and you can peek at them with getsockopt(2). obsessed with a round trip ✨

these socket options use this struct, which is defined in <sys/netinet/cc/cc_newreno.h>:

struct cc_newreno_opts {
        int name;
        uint32_t val;
}

now, the options themselves:

  • CC_NEWRENO_BETA β€” the multiplicative window decrease factor, expressed as a percentage, that gets applied to the congestion window when a congestion signal shows up, like: cwnd = (cwnd * CC_NEWRENO_BETA) / 100. the default is 50. half off, but make it congestion control 🫢
  • CC_NEWRENO_BETA_ECN β€” same idea, but this is the multiplicative window decrease factor, as a percentage, applied to the congestion window in response to an ECN congestion signal when net.inet.tcp.cc.abe=1, like: cwnd = (cwnd * CC_NEWRENO_BETA_ECN) / 100. the default is 80. softer touch, very demure πŸ’œ

🧚 MIB Variables 🧚

the algorithm exposes these variables in the net.inet.tcp.cc.newreno branch of the sysctl(3) MIB:

  • beta β€” the multiplicative window decrease factor, specified as a percentage, applied to the congestion window in response to a congestion signal per: cwnd = (cwnd * beta) / 100. default is 50.
  • beta_ecn β€” the multiplicative window decrease factor, specified as a percentage, applied to the congestion window in response to an ECN congestion signal when net.inet.tcp.cc.abe=1 per: cwnd = (cwnd * beta_ecn) / 100. default is 80.

πŸ‘‘ SEE ALSO πŸ‘‘

also, the reading list, because we are cultured:

  • Mark Allman, Vern Paxson, and Ethan Blanton, TCP Congestion Control, RFC 5681.
  • Naeem Khademi, Michael Welzl, Grenville Armitage, and Gorry Fairhurst, TCP Alternative Backoff with ECN (ABE), RFC 8511.

πŸ’œ ACKNOWLEDGEMENTS πŸ’œ

ngl, the dev and testing of this software were made possible in part by grants from the FreeBSD Foundation and the Cisco University Research Program Fund at Community Foundation Silicon Valley. funding girlies came through, and we love that for them 🌈


🌸 HISTORY 🌸

  • the cc_newreno congestion control algorithm first appeared in its modular form in FreeBSD 9.0. glow-up era ✨
  • the module was first released in 2007 by James Healy and Lawrence Stewart, whilst they were working on the NewTCP research project at Swinburne University of Technology's Centre for Advanced Internet Architectures, Melbourne, Australia. that whole thing was made possible in part by a grant from the Cisco University Research Program Fund at Community Foundation Silicon Valley. more details live at:
http://caia.swin.edu.au/urp/newtcp/

⭐ AUTHORS ⭐

  • the cc_newreno congestion control module was written by James Healy <jimmy@deefa.com>, Lawrence Stewart <lstewart@FreeBSD.org> and David Hayes <david.hayes@ieee.org>. dream team fr fr πŸ”₯
  • support for TCP ABE was added by Tom Jones <tj@enoti.me>.
  • this manual page was written by Lawrence Stewart <lstewart@FreeBSD.org>.

πŸ’– that's the whole page, bestie! no cap, every flag, every default, every formula, every reference β€” all accounted for. slay πŸ’…

and for the cute sign-off: this beauty comes from Debian, dated August 6, 2019 β€” so go forth, tune your beta, and remember: NewReno is the default for a reason, periodt πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from