Mental model
Layer-1 and layer-2 problems don’t always announce themselves. A cable that’s marginal, a duplex mismatch, or a bent pin can leave the link up but the throughput at 1% of what you’d expect. The counters on show interfaces are how you diagnose it — they tick up silently while users complain the network is “slow”.
Duplex mismatch — the classic
Full-duplex = send and receive at the same time (no collisions possible). Half-duplex = one at a time; use CSMA/CD to detect collisions on the wire.
If one end is full-duplex and the other is half-duplex, both ends think they’re right and the link stays up — but the behaviour is broken:
| Side | What it sees |
|---|---|
| Full-duplex side | It transmits whenever it wants. The half side is transmitting too — collisions on the wire. But the full side won’t detect them (it’s not listening for collisions). It sees CRC errors and runts (frames chopped off by collisions). |
| Half-duplex side | It backs off on collisions (CSMA/CD). But since the full side keeps hammering, the half side sees late collisions — collisions after the first 512 bit-times, which should be impossible in a healthy half-duplex network. |
Net effect: the link “works” but at ~10-30% of nominal throughput, with retransmissions everywhere.
Speed mismatch
Modern Ethernet auto-negotiates speed AND duplex. If one side is hard-coded to 100/full and the other is set to auto, the auto side can usually detect speed via parallel detection but defaults to half-duplex — giving you the mismatch above.
Rule of thumb: don’t mix. Either both sides auto or both sides hard-coded to the same values.
Reading the counters
SW1# show interfaces GigabitEthernet0/1
GigabitEthernet0/1 is up, line protocol is up
...
Full-duplex, 1000Mb/s, media type is 10/100/1000BaseTX
...
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 watchdog, 0 multicast, 0 pause input
0 input packets with dribble condition detected
0 packets output, 0 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 unknown protocol drops
0 babbles, 0 late collisions, 0 deferred
0 lost carrier, 0 no carrier, 0 pause output
| Counter | What it means | Likely cause |
|---|---|---|
| CRC | Frame arrived, its FCS doesn’t match | Bad cable, EMI, duplex mismatch (full side) |
| runts | Frame < 64 bytes | Chopped by a collision; duplex mismatch, bad cable |
| giants | Frame > MTU | MTU mismatch, jumbo-frame misconfig |
| input errors | Umbrella (CRC + runts + giants + frame + overrun + ignored) | Look at the sub-counters |
| collisions | Normal on half-duplex, always zero on full | Presence on a “full-duplex” port = mismatch |
| late collisions | Collision after the first 512 bit-times | Cable too long, or duplex mismatch (half side) |
| input drops / no buffer | Interface can’t keep up | Micro-bursts, undersized buffer |
| interface resets | Link flapped | Bad cable, SFP, or negotiation loop |
Deliberate fix — real IOS
If auto-negotiation is misbehaving, hard-code both ends. Do this on both switches so they agree:
SW1(config)# interface GigabitEthernet0/1
SW1(config-if)# speed 1000
SW1(config-if)# duplex full
To go back to auto (recommended on modern kit):
SW1(config-if)# speed auto
SW1(config-if)# duplex auto
Cable / physical checks
- Wrong pinout — straight-through vs crossover mattered on old gear. Modern switches with Auto-MDIX handle either. If you disabled MDIX (
no mdix auto), you’re back to caring about pinouts. - Cable category too low for the speed — Cat5 unshielded on a 10 Gbps port will not negotiate at 10 Gbps (see cable categories).
- Bent pin or loose connector — CRC spikes on one port only, other ports fine.
- EMI near industrial equipment — CRC on the whole switch stack. Move the cables away from the motor / VFD / fluorescent ballast.
The #1 mistake
Assuming “link up” = “link healthy”. The Ethernet link-status LED will happily glow green while the port is dropping 40% of frames to CRC and running at effective 30 Mbps on a gigabit port. Always check the counters after any change, and reset them (clear counters GigabitEthernet0/1) so you’re looking at fresh data.
Related topic-page verification lab
Try it on the live console:
SW1# clear counters
SW1# show interfaces Gi0/1 | include duplex|error|collision
SW1# configure terminal
SW1(config)# interface Gi0/1
SW1(config-if)# speed 100
SW1(config-if)# duplex half
SW1(config-if)# end
SW1# show interfaces Gi0/1 | include duplex
