NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 NAME netconfig - configure network kernel options SYNOPSIS netconfig [ <variable-name> [value] ] ... DESCRIPTION Netconfig is a tool for managing network configuration variables. Kernel network software includes a number of configurable variables inside the running kernel. Netconfig allows one to change those variables' values. With no options, netconfig prints out values of all the network options that it knows about and can find in the kernel. Netconfig interprets its command line as a series of requests to set or get a variable's contents. A request to set a variable consists of the name of a kernel variable followed by a value for that variable. A request to get a variable's value consists only of the name of the variable. It is possible to request both a get and a set of a variable; writes are performed before reads, so that would amount to confirmation that a write really has been performed. Netconfig implements variable typing. Each variable is treated as either numeric or boolean. Numeric variables (such as TCP output buffer size) expect numeric values upon being set. Boolean variables expect either 'on', 'off', or a number as a value; a nonzero numeric value is the same as the 'on' value, and a numeric value of zero is the same as the 'off' value. Netconfig ignores underscores for purposes of matching variable names on the command line with actual variable names. For example, 'tcpsendspace' would succeed in matching 'tcp_sendspace'. The kernel memory special device /dev/kmem, which netconfig relies upon to read and write its values, is usually installed with extremely restrictive permissions. Thus, it is suggested that one install netconfig setgid kmem, or setuid root if there is no group kmem. If netconfig is installed setuid or setgid, it only uses the special access to allow anybody to run netconfig and find out what the values of kernel variables are. In order to change kernel variables, the user running the program must already have permission to write to /dev/kmem; normally, one must either be root or in group kmem. OUTPUT FORMAT Netconfig prints out its variables grouped by protocol. The format of each line is as follows: Input Buffer Size (tcp_sendspace): 28672 "Output Buffer Size" is a description of what the variable controls. "tcp_sendspace" is a the actual name of the variable that one would use in configuration. 28672 is the value tcp_sendspace is currently set to in kernel memory. USAGE NOTES One can find out what kernel variables may be set in one's kernel by looking at the output of netconfig run without options. The variable names are the lowercase names in parenthesis. Many vendors ship - 1 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 machines with values of network configuration variables that track current network technology and memory prices slowly. Some values made sense when a 2 megabyte VAX was pretty impressive. Netconfig can be used to automatically set network variable values upon boot. We place the following invocation in our /etc/rc.local to do this: if [ -f /usr/local/bin/netconfig ]; then /usr/local/bin/netconfig `cat /etc/netconfig.conf` 2>/dev/null fi The effect of this is that network variable settings are read from /etc/netconfig.conf upon boot. Three sample 'netconfig.conf's are provided with the netconfig distribution: netconfig.conf contains values consistent with highest performance without a danger of loss of safety or interoperability. netconfig.conf.hiperf contains values that give highest performance, at a small risk of loss of interoperability. netconfig.conf.bigwin contains values that give highest performance on machines supporting big windows (this will also activate the big windows implementation) WARNING: don't use netconfig.conf.bigwin on machines not supporting big windows - check by running netconfig and looking for the presence of tcp_dont_winscale - packets may silently stop being received. EXAMPLES To set tcp_recvspace (TCP input buffer size) to 28672: netconfig tcp_recvspace 28672 Another way to set tcp_recvspace to 28672, making use of the underscore-ignoring feature: netconfig tcprecvspace 28672 To show the value of tcp_recvspace: netconfig tcp_recvspace VARIABLE MEANINGS AND SUGGESTED SETTINGS This section provides description of and suggested settings for some of the variables. These suggestions are only meant as starting points; you should consider your environment and application carefully before deciding what appropriate settings are. I have attempted to be conservative in my suggestions, but neither I nor the University of California will be responsible if these settings result in explosions or other disasters. TCP MAX WINDOW SIZES - TCP_SENDSPACE AND TCP_RECVSPACE Tcp_sendspace and tcp_sendspace control TCP maximum window size. For a TCP connection to operate at maximum speed over a given connection, the TCP maximum window must be at least as large as the product of the round-trip delay of the connection and the max bandwidth of the connection. For full speed TCP over local Ethernet, that comes out to around 5k, but it goes up for FDDI and remote connections. The maximum window size also potentially controls the maximum time it could take a TCP window to drain over a slow SLIP link. Memory prices suggest that a machine on a LAN should have as large a TCP window size as possible. Unfortunately, limitations on some implementations of TCP and assorted performance quirks reduce the optimal conservative value to <32k - mbuf cluster length>. Mbuf cluster length varies by OS, but is so far never over 8k in size, - 2 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 yielding a safe value for everyone of: tcp_sendspace 24576 tcp_recvspace 24576 Getting Gutsy: Raising Max Window Size: If you are feeling slightly gutsy or have a need for a larger window size, you could raise these values to 48k (49152) each. Environments in which I have heard of trouble with such values are ones in which machines are present that process TCP window sizes using 16-bit signed variables - some PC TCP/IPs. Note that, depending upon your machine, one can go as high as somewhere between 52428 and (64k - 1). I do NOT recommend pushing above 52428 unless you know what you're doing (see sbreserve source code in uipc_socket2.c) (but see the discussion of TCP Big Windows and tcp_dont_winscale, below). Even pushing above 48k can be a bad idea because most TCP/IP implementations exhibit slightly inefficient behavior when faced with windows that are not even multiples of the cluster mbuf size - and worse still, the inefficiency will affect even connections that do not need a large TCP window size, which is most TCP connections. TCP BIG WINDOWS - TCP_DONT_WINSCALE Even raising the TCP window size to its usual maximum of 64k is sometimes not enough. Over high-bandwidth WAN links, the window size may need to go higher to not act as a limit on bandwidth. For example, if one were able to move data at the theoretical maximum speed of the NSFNET backbone all the way across the country (forget it, unless both you and the thing you're connecting to have a dedicated T3 link or work on the same campus as an NSF backbone node), one might need as much as 3/4 of a megabyte of window size. Most of the time it doesn't matter, because one rarely gets that sort of bandwidth across the NSFNET, not because of the backbone but because of the much slower regional networks and hookups to the regionals and the contention for those links. However, if you are privileged to work with a high-bandwidth (>= T3) WAN or be on the same campus as an NSF backbone link, you may find it useful to raise window size. Some hosts support a TCP extension to do exactly this. Tcp_dont_winscale controls this extension. If it's off, then window scaling is on. Unfortunately, while vendors do often ship with TCP window scaling on, they usually neglect various other necessary adjustments. One must raise tcp_recvspace and tcp_sendspace to take advantage of this. Additionally, one cannot raise tcp_recvspace and tcp_sendspace to above 64k without raising another parameter, called sb_max (see just below). Note that this has no effect on performance on most current hosts - it generally is not needed for LAN communication, and is usually only really needed across links with extraordinary bandwidth (T3 or higher) or latency (high-bandwidth satellite link). 256k seems to me to be a usefully high starting point for setting all three variables if you need TCP big windows - it's enough to fill a T3 network running the length of the US East or West Coast or a 2 Mbit satellite channel at geosynch. However, this is the sort of thing that can get pretty application-specific, so I recommend calculating it yourself (see above on how to calculate TCP max window size). Note that even if you do have access to a high- bandwidth WAN link, big windows may still not help you if your machine doesn't have the horsepower to pump out packets faster than it's - 3 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 already doing. SYSTEM OVERALL SOCKET BUFFER LIMIT - SB_MAX Sb_max controls how large a socket buffer limit can get. Normally this is statically limited to 64k, but machines shipped with support for TCP big windows often have an option to raise that limit so that it is possible to specify a bigger window. You must appropriately set all of sb_max, tcp_dont_winscale, tcp_sendspace, and tcp_recvspace to use TCP big windows. UDP MAX QUEUE LENGTH - UDP_SENDSPACE AND UDP_RECVSPACE Udp_sendspace and udp_recvspace control how large a UDP packet your machine is able to send or receive. In addition, udp_recvspace controls how much UDP data is allowed to enqueue on a given socket awaiting user process reception. I have never seen any reason to limit these in general for most modern workstations (user processes requiring latency limits can override these values on a per-socket basis): udp_sendspace 49152 udp_recvspace 49152 ROUTING ON/OFF - IPFORWARDING, IPSENDREDIRECTS Ipforwarding controls whether a host is willing to route packets if it has at least two network interfaces. If you do not intend a machine to be used as a router, you can avoid the unexpected by setting ipforwarding on that machine to 0. It must be 1 for routers. On suns only, ipforwarding has an additional valid value: -1 means that no matter how many interfaces the machine has, no routing will be done (the presence of this additional value is why ipforwarding is not considered to be a boolean). A value of 0 means that the value should be set to 1 if a second network interface is ifconfig'ed up. For the purposes of this program, unless you run netconfig before ifconfig, either in your /etc/rc.* files or by hand, the meaning is that a value of 1 indicates routing is on, and anything else indicates routing is off. This is subtly different, but enough to force me to stop calling ipforwarding a boolean. Ipsendredirects controls whether a host should send an ICMP redirect when it receives a datagram that it forwarded to a different router on the same subnet as the subnet it came in on; in effect the redirect tells the host that sent the datagram to update its routing table to send directly to the router to which the datagram was forwarded in the future. This can act, in effect, as a kind of cheap routing protocol, and usually at worst acts to reduce the severity of certain kinds of mistakes made by network administrators. It should probably be set Ipgateway's functionality depends upon the host operating system. Under OSF/1, it acts as an alternative to ipforwarding, with the addition that statistics on traffic between interfaces are kept, and arp tables are enlarged if this is set at boot time. Under Ultrix, it determines whether a non-routing host should send an ICMP Network Unreachable message when it receives an IP packet not destined for itself (e.g., to be routed). It is unclear what ipgateway is supposed to do. CHECKSUMMING ON/OFF - UDP_CKSUM, TCP_CKSUM, AND NOCKSUM Udp_cksum controls whether UDP packets sent by the host checksum their data or not. Some vendors ship machines with udp_cksum turned off. That is because the checksumming data is extremely time-consuming and one can improve NFS performance noticeably by doing so. Turning off checksums results in a risk - if - 4 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 packets are corrupted, one can end up with corrupted data. Since almost all NFS is done over LANs with hardware checksum protection, the risk is often worth the benefit. However, any NFS across a long distance (mounting from a remote site, mounting an Internet archive such as wuarchive, mounting across a SLIP link) carries a much larger risk of data corruption. A host that participates as either client or server in such transactions should probably have udp_cksum turned on. If you are uncertain of whether your hosts often send "long-distance" UDP packets, you should set udp_cksum 'on.' Tcp_cksum decides if a host should checksum TCP packets that it receives. Many TCP connections are over long distances, so by the reasoning of the last paragraph this should almost always be 'on'. Nocksum decides if a host should do any TCP/IP checksumming routine at all, for all protocols. When this is set, the TCP/IP checksum routine returns zero without actually examining any data. USE WITH CAUTION. Turning this on has the effect of disabling networking with any machine that does not also have this flag set. It also removes ALL of the checksum protection described above, plus some not described in this document. REDUNDANT CHECKSUM AVOIDANCE CONTROL - TCPLCLSUM AND UDPLCLSUM Tcplclsum and udplclsum control whether checksum redundancy avoidance it is used, if it is available in your kernel. Checksum redundancy avoidance is software that avoids the need for the udp_cksum flag above - it detects whether packet transmissions are local or remote and avoids performing data checksums only on packets that cross a single LAN. One can tell if one has checksum redundancy avoidance by checking to see if tcplclsum and udplclsum appear in the list of variables that appears when one runs netconfig with no arguments. For most environments, they should be 'off', which turns checksum redundancy avoidance on. If your application requires reliability higher than is normally found in a workstation environment, you should set them to 'on'. KEEPALIVES - TCP_KEEPIDLE, TCP_KEEPLEN, TCP_KEEPINTVL Tcp_keepidle, tcp_keeplen, and tcp_keepintvl control the TCP keepalive option. The keepalive mechanism times out connections on which keepalives are on and no packet has been seen for some time. A connection with keepalives on that has not seen any packets for tcp_keepidle half-seconds starts sending a packet every tcp_keepidle half-seconds. That has the effect of telling the remote TCP that the connection is still alive. In addition, the remote TCP must send an acknowledgement, telling the local host that the connection is still alive. If the sender sends eight keepalive packets without a response, TCP will conclude that the remote host is either unreachable or crashed and close the connection. Tcp_keeplen controls how much data to include in a keepalive. Data sent in a keepalive is carefully chosen so that the receiving TCP must throw out the data but still acknowledge the packet, so that no extraneous data appears to user programs. A single byte of data is usual, because it suffices and some implementations ignore zero-length packets. I recommend the following (usual) settings: tcp_keepidle 14400 tcp_keepintvl 150 tcp_keeplen 1 - 5 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 TIME TO LIVE - UDP_TTL, TCP_TTL, MAXTTL The internet time to live (TTL) governs how many IP routers a packet travels through before being discarded. If this value is set low, packets may not be able to travel from your host to all areas of the Internet. The IETF currently recommends a value of 64 for this. In general operational experience, 20 intermediate routers seems to be typical for crossing the US, 30 a current upper limit on numbers of hops needed to reach remote international locations, so 64 permits continued growth for a while. It is unclear to me why this parameter is not just set to its potential max of 255 - the only drawback to setting the parameter high is that it takes longer to discard packets caught in router loops. The difference is unlikely to be annoying, much less a problem, unless the router loop is made up of SLIP links. Each of the *_ttl parameters determines the default max ttl for a different kind of packet. Tcp_ttl determines the default TTL for TCP packets, udp_ttl determines the default TTL for UDP packets, and maxttl, despite its name, only determines the TTL for ICMP packets. SEE ALSO adb(1), dbx(1), (DECstation and SGI only) kvar(8), traceroute(1) R. Stevens, TCP/IP Illustrated, Volume 1. J. Postel, "Transmission Control Protocol," Internet Request for Comments 793. R. Braden, J. Postel, "Requirements for Internet Gateways," Internet Request for Comments 1009. R. Braden, "Requirements for Internet Hosts -- Communication Layers," Internet Request for Comments 1122. D. Borman, R. Braden, V. Jacobson, "TCP Extensions for High Performance," Internet Request for Comments 1323. S. J. Leffler, M. K. Mckusick, M. J. Karels, J. S. Quarterman, "Interprocess Communication," The Design and Implementation of the 4.3BSD UNIX Operating System, Addison- Wesley, Nov. 1989. Compressed SLIP distribution, available from ftp.ee.lbl.gov. Fastnet (incl. checksum redundancy avoidance) distribution, available from ucsd.edu:pub/csl/fastnet. AUTHOR Jon Kay (jkay@ucsd.edu) of the Computer Systems Lab at the University of California, San Diego. ACKNOWLEDGEMENTS I gratefully acknowledge help from Kim Claffy, of the University of California, San Diego Computer Systems Lab (kc@cs.ucsd.edu) with the documentation. BUGS It doesn't work on Solaris 2.3 or Linux. I can't do anything about Linux because it doesn't have appropriate variables - every such thing MUST be configured at kernel build time. Solaris is a different matter - the problems there are that the variables are stored in loadable kernel modules which netconfig doesn't know how to deal with, and that the variable names are different from BSD. The netconfig software distribution should be a distribution of a general kernel - 6 - Formatted: January 15, 2025 NETCONFIG(1) NETCONFIG(1) 2 Aug 1993 variable access program. Netconfig's functionality would be implemented as a script on top of the more general program. Though it'd have be be VERY talented to also work on Solaris. Netconfig attempts to track a moving target, and the author will probably require external assistance to track new network configuration kernel variables (hint!). - 7 - Formatted: January 15, 2025