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 a small fraction 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 behavior is broken:
| Side | What it sees |
|---|---|
| Full-duplex side | It transmits whenever it wants. The half side is transmitting too, so frames collide 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
