What an Ethernet frame is
A frame is the envelope that Ethernet uses to carry data across one link: from a computer to a switch, from a switch to another switch, or from a switch to a router. It has a header at the front (addresses and a type code), the payload in the middle (the data being carried), and a trailer at the end (an error check).
You met Ethernet in Ethernet fundamentals. Here you look inside the envelope. The format shown is Ethernet II, which carries almost all traffic on modern networks.
💡 In simple terms: a frame is like a parcel label stuck on a box. The label says who it is for, who sent it and what kind of thing is inside. The box holds the goods. A seal on the box shows whether it was damaged on the way.
Why frames exist
A cable can only carry a stream of bits: 1s and 0s. On its own, that stream has no meaning. The receiving device needs answers to a few questions:
- Where does a message start and end? The preamble and the frame's length answer this.
- Is this message for me? The destination MAC address answers this.
- Who sent it? The source MAC address. The reply goes back to it.
- What is inside? The EtherType: an IPv4 packet, an IPv6 packet or an ARP message.
- Did it arrive undamaged? The FCS answers this.
Framing turns a raw stream of bits into separate, addressed, checkable messages. That is the main job of Layer 2, the Data Link layer, in the OSI model.
Where the frame sits
When an application sends data, each layer wraps it in its own header (this is encapsulation). The Ethernet frame is the last, outermost wrapper before the bits go onto the cable:
Data: The application produces data, such as an HTTPS request.A complete Ethernet frame
- Data · application
- Segment · transport
- Packet · network
- Frame · data link
Data: The application produces data, such as an HTTPS request. Segment: TCP adds a header with the source and destination ports. Packet: IP adds a header with the source and destination IP addresses. Frame: Ethernet adds MAC addresses in front and an error check (FCS) at the end.
So the frame carries the IP packet, and the IP packet carries the TCP or UDP segment, and the segment carries the application data. The frame only lives for one link. A router removes it, reads the IP packet, and builds a fresh frame for the next link.
The fields, one by one
| Field | Size | Part | What it does |
|---|---|---|---|
| Preamble + SFD | 8 bytes | Wire only | A wake-up pattern of alternating 1s and 0s, then a marker that says “the frame starts now”. It lets the receiver lock on to the signal. |
| Destination MAC | 6 bytes | Header | The MAC address of the interface that should receive the frame, or a broadcast/multicast address. |
| Source MAC | 6 bytes | Header | The MAC address of the interface that sent the frame. Switches learn from this field. |
| EtherType | 2 bytes | Header | A code that says what is inside the payload, so the receiver hands it to the right protocol. |
| Payload | 46–1500 bytes | Data | The data being carried, usually an IP packet. Short payloads are padded up to 46 bytes. |
| FCS | 4 bytes | Trailer | Frame Check Sequence: a CRC number calculated over the frame, so the receiver can spot corruption. |
Preamble and SFD (briefly)
Before the frame proper, the sender transmits 7 bytes of preamble (the pattern 10101010 again and again) and 1 byte called the Start Frame Delimiter, 10101011. The preamble gives the receiver's electronics time to synchronise its clock with the signal. The two 1s at the end of the SFD say “the next bit is the first bit of the destination MAC”.
The network card adds and removes these 8 bytes in hardware. They are never counted in the frame size, and capture tools such as Wireshark never show them.
Destination MAC address (6 bytes)
The MAC address of the receiver. It can be:
- Unicast: one specific interface, such as
02:00:00:00:00:bb. - Broadcast:
ff:ff:ff:ff:ff:ff, meaning every device on the LAN. - Multicast: a group address such as
01:00:5e:00:00:fb.
The lesson Unicast, broadcast and multicast covers these three in depth.
Source MAC address (6 bytes)
The MAC address of the interface that sent the frame. It is always a unicast address, because a frame always comes from one interface. Switches read this field to learn where each device is (see How a switch learns MAC addresses).
EtherType (2 bytes)
A number that tells the receiver which protocol is inside the payload. Without it, the receiver would not know whether to pass the data to its IPv4 software, its IPv6 software or its ARP software.
| EtherType | Payload is… | Where you meet it |
|---|---|---|
0x0800 | An IPv4 packet | Most web, email and app traffic today |
0x86DD | An IPv6 packet | Growing share of all traffic |
0x0806 | An ARP message | ARP requests and replies |
0x8100 | A VLAN tag follows (802.1Q) | Trunk links between switches (a CCNA topic) |
Going deeper
In the original IEEE 802.3 format this same 2-byte field held the payload length instead of a type. The two formats can share a network because of a simple rule: a value of 1500 or less is a length, and a value of 1536 (0x0600) or more is an EtherType.
Payload (46 to 1500 bytes)
The data being carried. Usually this is a whole IP packet, headers and all. Two limits apply:
- Maximum 1500 bytes. This is the MTU (Maximum Transmission Unit) of standard Ethernet. An IPv4 packet bigger than this must be split up, or the sender must use smaller packets. With a 20-byte IPv4 header and a 20-byte TCP header, that leaves 1460 bytes of actual data per frame.
- Minimum 46 bytes. If there is less data, the sender adds padding (zero bytes) to reach 46. An ARP message is only 28 bytes, so it always gets 18 bytes of padding.
That gives a frame size (destination MAC to FCS) of 64 to 1518 bytes: 14 bytes of header, 46 to 1500 of payload, and 4 of FCS.
FCS: the error check (4 bytes)
The Frame Check Sequence is a 32-bit CRC (Cyclic Redundancy Check). The sender runs a fixed calculation over every byte from the destination MAC to the end of the payload and puts the result in the FCS. The receiver runs the same calculation. If its answer is different, at least one bit was changed on the way, and the frame is dropped.
⚠️ Ethernet does not ask for a damaged frame to be resent. It just throws it away and counts it as a CRC or FCS error on the interface. TCP notices the missing data later and resends it; UDP traffic is simply lost.
Why the destination comes first
The destination MAC is the very first thing after the preamble. That is on purpose. A device can decide what to do with a frame after reading only 6 bytes:
- A computer's network card compares it with its own MAC address. If it does not match (and it is not a broadcast or a group it has joined), the card ignores the rest of the frame without bothering the operating system.
- A switch can look up the destination in its MAC table while the rest of the frame is still arriving. Some switches (“cut-through” switches) even start sending the frame out of the right port before it has fully arrived.
💡 Think of it like a letter where the address is printed on the outside of the envelope. The postal worker never needs to open it to know where it goes.
What a switch reads
A switch is a Layer 2 device. It works with the frame header and does not need to understand the payload. For each frame it:
- Reads the destination MAC and looks it up in its MAC address table to choose the outgoing port.
- Reads the source MAC and records which port it arrived on (learning).
- Checks the FCS (store-and-forward switches) and drops the frame if it is damaged.
- Sends the frame on unchanged. The MAC addresses, EtherType and payload stay exactly the same.
- 1. PC builds a frame: destination is the router's MAC (the default gateway), source is the PC's own MAC, EtherType 0x0800.
- 2. The switch forwards it unchanged: same MACs, same payload. It only chose the port.
- 3. The router builds a new frame: it strips the old Ethernet header, keeps the IP packet (still to 203.0.113.10) and wraps it in a new frame for the next link.
You will follow this hop-by-hop behaviour in detail in Different-subnet communication.
A real frame, decoded
Here is a complete ARP request, the frame a PC sends when it wants to find the MAC address of its default gateway. The PC has MAC 02:00:00:00:00:aa and IP 192.168.1.10, and it is asking “who has 192.168.1.1?”. Every byte below is the real value, including a correctly calculated FCS.
ARP request: 192.168.1.10 asks for 192.168.1.1
64 bytes| Field | Bytes | Raw value | Meaning |
|---|---|---|---|
| Destination MAC | 6 | ff ff ff ff ff ff | Broadcast: every device on the LAN |
| Source MAC | 6 | 02 00 00 00 00 aa | The PC's own MAC address |
| EtherType | 2 | 08 06 | 0x0806 = ARP is inside |
| Payload: ARP message | 28 | 00 01 08 00 06 04 … | Request (opcode 1): sender 02:00:00:00:00:aa / 192.168.1.10, target ?? / 192.168.1.1 (c0 a8 01 01) |
| Padding | 18 | 00 00 00 00 00 00 … | 18 zero bytes to reach the 46-byte minimum payload |
| FCS | 4 | 07 1c 5d 89 | CRC-32 over the 60 bytes before it |
Now the same frame as a capture tool shows it. Notice the length: when you capture on the sending PC, the tool sees the frame before the network card adds the padding and FCS, so it reports 42 bytes, not 64.
$ sudo tcpdump -e -n -i eth0 arp or tcp port 443 listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes 10:14:02.118204 02:00:00:00:00:aa > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.1.1 tell 192.168.1.10, length 28 10:14:02.118731 02:00:00:00:00:01 > 02:00:00:00:00:aa, ethertype ARP (0x0806), length 60: Reply 192.168.1.1 is-at 02:00:00:00:00:01, length 46 10:14:02.118802 02:00:00:00:00:aa > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 74: 192.168.1.10.51514 > 203.0.113.10.443: Flags [S], seq 3518220411, win 64240, options [mss 1460,sackOK,TS val 1873310 ecr 0,nop,wscale 7], length 0
-e option prints the Ethernet header: source MAC > destination MAC, then the EtherType. Line 1 is the broadcast ARP request decoded above. Line 2 is the router's unicast reply: it arrived from the wire already padded, so it shows 60 bytes (the FCS is removed by the card). Line 3 is the first packet of an HTTPS connection: EtherType 0x0800, sent straight to the router's MAC.A real-world example: loading a web page
You open https://routelearn.net on a laptop at home. Before any web page arrives, your laptop sends a burst of frames, and each one has a different job:
| Frame | Destination MAC | EtherType | Payload |
|---|---|---|---|
| 1. Find the router | ff:ff:ff:ff:ff:ff | 0x0806 | ARP request (if the router's MAC is not cached) |
| 2. Ask DNS for the name | Router's MAC | 0x0800 | IPv4 + UDP port 53 (DNS query) |
| 3. Open the connection | Router's MAC | 0x0800 or 0x86DD | IPv4 or IPv6 + TCP SYN to port 443 |
| 4. Fetch the page | Router's MAC | 0x0800 or 0x86DD | Encrypted HTTPS data, up to 1460 bytes per frame |
Notice that the destination MAC is the router every time, never the web server. The server is on another network, so the frame only needs to reach the first router. See What happens when you open a website? for the full journey.
When frames go wrong
| Problem | What happens | Usual cause |
|---|---|---|
| CRC / FCS errors | Frames fail the check and are dropped | Damaged or badly terminated cable, interference, a faulty port, or a duplex mismatch |
| Runts | Frames shorter than 64 bytes, dropped | Collisions on half-duplex links, a faulty NIC |
| Giants | Frames longer than the port allows, dropped | Jumbo frames sent to a port set for 1500 bytes |
| MTU mismatch | Small packets work but large ones vanish: pages half-load, file copies hang | A link or tunnel on the path carries less than 1500 bytes of payload |
💡 A classic sign of an MTU problem: ping works, small websites work, but big downloads or VPN connections stall. The small packets fit; the full-size ones do not.
Troubleshooting and useful commands
You cannot see frames with your eyes, but you can see their counters and capture them:
| Goal | Windows | Linux / macOS |
|---|---|---|
| See error counters | netstat -e | ip -s link show eth0 (Linux), netstat -I en0 (macOS) |
| See the MTU | netsh interface ipv4 show subinterfaces | ip link show (Linux), ifconfig en0 (macOS) |
| Capture frames | Wireshark | sudo tcpdump -e -n -i eth0 or Wireshark |
| Test the full 1500-byte MTU (IPv4) | ping -f -l 1472 192.168.1.1 | ping -M do -s 1472 192.168.1.1 (Linux) |
Why 1472 in the last row? 1472 bytes of ping data + 8 bytes of ICMP header + 20 bytes of IPv4 header = 1500, exactly the MTU. The extra option stops the packet being split, so if it fails, something on the path has a smaller MTU.
$ ip -s link show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 02:00:00:00:00:aa brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped missed mcast 912833410 702144 0 0 0 1312 TX: bytes packets errors dropped carrier collsns 88213004 341207 0 0 0 0
mtu 1500 is the payload limit. link/ether is this card's MAC; brd is the broadcast address. Rising RX errors usually means frames arriving with bad FCS values: check the cable first.Common mistakes
- Thinking the frame goes all the way to the server. A frame only crosses one link. The packet inside goes end to end.
- Counting the preamble in the frame size. The 64–1518 byte range starts at the destination MAC and ends at the FCS.
- Confusing MTU with frame size. MTU (1500) is the payload limit; the full frame is up to 1518 bytes.
- Expecting Ethernet to resend bad frames. It only detects errors; recovery is TCP's job.
- Thinking a switch rewrites MAC addresses. It does not. Only routers (and other Layer 3 devices) build new frames.
- An Ethernet frame = 14-byte header (destination MAC, source MAC, EtherType) + 46–1500 byte payload + 4-byte FCS.
- The preamble and SFD are sent first but are not part of the frame size.
- EtherType says what is inside: 0x0800 IPv4, 0x86DD IPv6, 0x0806 ARP.
- Destination comes first so devices can decide quickly what to do with the frame.
- The FCS detects damage; damaged frames are dropped, not repaired.
- Switches forward frames unchanged; routers build a new frame for every link.
Check yourself
A frame arrives with EtherType 0x86DD. Which software in the receiver handles the payload?
A receiver calculates a CRC that does not match the frame's FCS. What does it do?
An ARP message is 28 bytes long. How big is the payload field of the frame that carries it?
A PC sends a frame to a web server on the internet. Whose MAC is in the destination field as it leaves the PC?
Where to go next
Next, look closely at the addresses in the header in MAC addresses, then see how a switch uses them in How a switch learns MAC addresses. The ARP message decoded above is explained step by step in ARP fundamentals.