4 Aralık 2018 Salı

Ethernet II Frame

Giriş
İlki 1978 yılında Xerox, Intel ve DEC tarafından geliştirilmiştir. Yapısı şöyledir.
+-----------+-------+---------+---------+--------+------------------+---------+ 
|  Preamble |  SFD  |   DA    |   SA    |   TL   | Data (Payload)   | CRC-32  | 
|  6 bytes  |1 Byte | 6 bytes | 6 bytes |2 bytes | 46 to 1500 bytes | 4 bytes |
+-----------+-------+---------+---------+--------+------------------+---------+
Kod ile şöyledir.
/* Ethernet addresses are 6 bytes */
#define ETHER_ADDR_LEN  6

/* Ethernet header */
struct ethheader {
    u_char  ether_dhost[ETHER_ADDR_LEN];    /* destination host address */
    u_char  ether_shost[ETHER_ADDR_LEN];    /* source host address */
    u_short ether_type;                     /* IP? ARP? RARP? etc */
};
Neden Frame Olarak Adlanrılıyor
Geleneksel olarak Layer 2'deki veri Frame, Layer 3'teki veri ise Packet olarak adlandırılıyor.
A Frame is a combination of the L2 header and the Data being carried
A Packet is a combination of the L3 header and the Data being carried.

Flow Control
Layer 2'de genellikle flow control olmaz. Ancak pause frame denilen ve beniö hiç görmediğim bir frame türü de varmış. Bu frame storage network'lerde kullanılıyor deniliyor. Açıklaması şöyle
The first and most commonly implemented flow control system for Ethernet used "pause frames". Pause frames were intended as a means of implementing "back pressure" within the Ethernet network so that switch buffers did not overflow as the speed of sending nodes was limited to what the downstream devices could tag. Unfortunately they created problems where one congested flow could cause blocking of other uncongested flows, so they are often disabled in practice.
Random Access Özelliği
Ethernet random access özelliğini Aloha'dan miras almıştır. Ethernet'te Flow Control denilen bir mekanizma var ama ne olduğunu tam anlamadım.

Frame şu kısımlardan oluşur.
Preamble | Delimiter | Mac Headers | Payload | Pad | CRC
Switch
Ethernet artık bus yapısında değil. Modern switch'ler sadece ilgili MAC adresine giden port'a veri gönderilmesini sağlıyorlar. Bazı cihazlar yığıt şeklinde (switch stack) bile kullanılabiliyor.

Physical Layer
Fiziksel katman (Physical Layer) elektriksel hataları ele alıyor. Bu hatyı MAC'e bildirir. MAC FrameCheckError üretir ve paketi işlemez.

Büyüklüğü 
En büyük
Bir Ethernet II paketi FCS hariç en fazla 1514 byte uzunluğunda olabilir. 1500 byte veri + 14 byte Mac Headers. FCS 4 byte uzunluğundadır ancak çoğu ethernet sürücüsü FCS'i okumaya izin vermez.

En küçük
İlaveten bir ethernet II paketi FCS hariç en az 60 byte uzunluğunda olmalıdır. 14 byte header Mac Headers alanını çıkarırsak 46 byte veri taşıyabilir. Eğer gönderilen veri 46 byte'tan küçükse etherhet sürücüsü veriyi otomatik olarak 46 byte olacak şekilde boş byte ile doldurur. Açıklaması şöyle.
IEEE 802 packets may have a minimum size restriction. When necessary, the data field should be padded (with octets of zero) to meet the IEEE 802 minimum frame size requirements. This padding is not part of the IP datagram and is not included in the total length field of the IP header.
Wireshark bu doldurulan alanı Trailer olarak gösterir. Çıktı olarak şuna benzer bir şey görürüz.
Ethernet II
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Source: c4:46:19:1d:05:f6 (c4:46:19:1d:05:f6)
Type: ARP (0x0806)
Trailer: D01CCF9087084E0A00000000000000000000

Address Resolution Protocol (reply)
Hardware type: Ethernet (0x0001)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply (0x0002)
[Is gratuitous: False]
Sender MAC address: c4:46:19:1d:05:f6
Sender IP address: 88.200.89.1
Target MAC address: ff:ff:ff:ff:ff:ff
Target IP address: 0.0.0.0
1. Preamble ve Delimeter
Açıklaması şöyle.
The preamble is actually 7 octets,followed by a start frame delimiter (SFD). They just mark that a frame is coming and serve synchronisation purposes, they are not part of the frame.
Preamble + Delimeter toplam 8 byte uzunluğundadır.

1.1 Preamble
Preamble 7 byte uzunluğundadır. 56 bit'lik 1-0-1-0'lardan oluşur.

1.2 Start Frame Delimeter
Start Frame Delimeter ise 1 byte yani 8 bit uzunluğundadır. 10101011 değerindedir. Decimal olarak 171, hexadecimal olarak 0XAB değerindedir. En sondaki bit 1-0 yerine 1-1'dir.

Böylece preamble + SFD ile 64 bit yani 8 byte'a erişilir.

Preamble ve Start Frame Delimeter alanları tamamen Layer 1 ile alakalı oldukları için okumak imkansız.

TDMA'de kullanılan bir preamble değeri şöyle
0x749713BF

2. MAC Header
14 byte uzunluğundadır. Linux'ta ethernet paketi <netinet/ether.h> dosyasında tanımlıdır.
+----+----+------+------+-----+
   | DA | SA | Type | Data | FCS |
   +----+----+------+------+-----+
             ^^^^^^^^

   DA      Destination MAC Address (6 bytes)
   SA      Source MAC Address      (6 bytes)
   Type    Protocol Type           (2 bytes: >= 0x0600 or 1536 decimal)  <---
   Data    Protocol Data           (46 - 1500 bytes)
   FCS     Frame Checksum          (4 bytes)

2.1 DA ve SA
Source ve Destination MAC adresleri özel programlama gerektirmez. Daha detaylı bilgi için Ethernet II MAC Adresi yazısına bakabilirsiniz.

2. 2 Type

Ethernet II Frame ve  IEEE802.3 Ayrımı Nasıl Yapılır
Eğer bu alanın değeri >=1536 ise Ethernet II Frame, <=1500  IEEE802.3 frame anlamına gelir. >1500 ve <1536 arasındaki değerler tanımsızdır.

Ethernet II Frame Açısında Bu Alana Taşınan Paket Tipini Belirtir
Bu alan taşınan paket tipini belirtir. Açıklaması şöyle.
EtherType value of 0x0800 signals that the frame contains an IPv4 datagram. Likewise, an EtherType of 0x0806 indicates an ARP frame, 0x86DD indicates an IPv6 frame and
0x8100 indicates the presence of an IEEE 802.1Q tag
Bu alan sayesinde Ethernet II Frame genel (generic) olarak kullanılabiliyor. Açıklaması şöyle.
A key goal of Ethernet was ubiquity -- in order to be cheap it had to be everywhere, and so it was designed to be completely neutral about its contents.

Örnek
Eğer bu alan 0x88E5 ise MACsec frame'dir.

Örnek - C Kodu
Ethernet Type alanı ntohs ile okunur.
if(ntohs(eth_hdr->eth_type) == ETH_P_ARP) //0X806 yani 2054
veya
if(ntohs(eth_hdr->eth_type) == ETH_P_IP) //0X800 yani 2048
Şöyle yaparız.
if (eth_hdr->eth_type != ntohs(0x0800)) return; //this is not an IP packet
3. Data
Paketin büyüklüğü 14 byte uzunluğundadır.
/* ethernet headers are always exactly 14 bytes */
#define SIZE_ETHERNET 14
Paket IP ise şöyle yaparız.
struct ethheader *eth = ...;
struct ipheader* ip = (struct ipheader*)(packet + SIZE_ETHERNET); 
4. FCS
Açıklaması şöyle
Ethernet has 32-bit CRC called frame check sequence (FCS). This is very reliable: for random corruption, it means that 1 in 4 billion packets gets accidentally accepted even though it contains corrupted data. Considering that one packet is typically about a kilobyte, this means that random corruption corrupts your data once per 4 terabytes of corrupted data sent. Unfortunately, Ethernet's FCS is not true end-to-end checksum.
FCS tüm frame'in CRC'sini içerir. Açıklaması şöyle
For data link layers (the 2 most common being 802.3 and 802.11), the FCS will detect single bit errors anywhere in the entire frame.

The header checksum in an IP packet only detects errors in the header. There is no trailing checksum in IP. It's up to the upper layers to detect errors in the payload.
Açıklaması şöyle
The FCS is a CRC over all fields (except the FCS) with the polynomial

G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1


1 yorum: