Full duplex networking isn’t just about sending and receiving at the same time; it’s about doing so without any possibility of collision, effectively doubling your theoretical throughput.
Let’s see it in action. Imagine two computers, hostA and hostB, connected by a switch. We’ll use iperf3 to push data.
On hostB, start a server:
iperf3 -s
On hostA, start a client connecting to hostB:
iperf3 -c 192.168.1.100
The output on hostA will show a bandwidth number. Now, while hostA is sending data to hostB, start another iperf3 client on hostB sending data back to hostA.
On hostB (in a new terminal):
iperf3 -c 192.168.1.100
Notice that both transfers continue at near-full speed, unimpeded. This is full duplex. If this were half duplex, the second transfer would have to wait for the first to finish, or they’d collide, leading to retransmissions and dramatically lower throughput.
The magic behind full duplex lies in the physical layer and the network interface card (NIC). Ethernet, since its 100BASE-TX (Fast Ethernet) and certainly with Gigabit Ethernet (1000BASE-T) and beyond, uses separate wire pairs within the cable for transmitting and receiving. A standard Cat 5e or Cat 6 cable has four pairs of wires. For 100BASE-TX, two pairs are used: one for transmitting and one for receiving. For 1000BASE-T, all four pairs are utilized, with each pair capable of transmitting and receiving simultaneously using a technique called echo cancellation.
Your NIC and the switch port it connects to negotiate this capability during the link-up process. This negotiation, known as Auto-Negotiation (802.3u for Fast Ethernet, 802.3ab for Gigabit Ethernet), allows devices to agree on the highest common speed and duplex mode they both support. If both devices support full duplex at a given speed, they will establish a full duplex link. If one device only supports half duplex, or if the negotiation fails, they might fall back to half duplex.
The problem this solves is the inherent inefficiency of half-duplex communication, a hallmark of older Ethernet hubs. With hubs, all devices shared a single collision domain. When two devices tried to transmit at the same time, a collision occurred, forcing both to stop, wait a random amount of time, and try again. This "carrier sense multiple access with collision detection" (CSMA/CD) protocol drastically reduced effective bandwidth as more devices joined the network or as traffic increased. Full duplex eliminates collisions entirely by providing dedicated send and receive paths.
The key levers you control are the NIC settings on your endpoints and the configuration on your switch. While auto-negotiation is the default and usually works perfectly, you can manually set duplex and speed. For example, on Linux, you might use ethtool:
sudo ethtool eth0
This shows current settings. To set eth0 to 1000 Mbps full duplex:
sudo ethtool -s eth0 speed 1000 duplex full
On a Cisco switch, you’d typically configure the interface:
interface GigabitEthernet1/0/1
speed 1000
duplex full
Crucially, duplex mismatch is a common cause of performance issues. If one end is set to full duplex and the other to half duplex, even if they negotiate to the same speed, packets will be dropped. The full-duplex device sends data assuming the other end can receive indefinitely, while the half-duplex device can only transmit half the time and will drop packets it receives while it’s busy transmitting. This leads to retransmissions, high latency, and significantly degraded throughput, often appearing as intermittent network problems or slow application performance. Always ensure both ends of a link (e.g., NIC and switch port) are set to the same duplex mode, preferably full duplex, and that auto-negotiation is working correctly.
The next concept you’ll encounter is flow control, a mechanism that complements full duplex by allowing a receiving device to signal a sending device to pause transmission when its buffers are full.