00 TSN nedir — IEEE 802.1 ailesi ve motivasyon
TSN (Time-Sensitive Networking), IEEE 802.1 çalışma grubunun geliştirdiği, standart Ethernet üzerinde zaman garantili (deterministik) iletişim sağlayan standartlar bütünüdür. Amaç; EtherCAT veya PROFINET gibi özel protokollere gerek kalmadan, IT ve OT ağlarını tek bir Ethernet altyapısında birleştirmektir.
Standart Ethernet, CSMA/CD ve best-effort iletim modeliyle tasarlanmıştır. İki paket aynı anda gönderilirse çakışma olur; iletim gecikmesi değişkendir (jitter). Endüstriyel otomasyon, ses/video yayını ve araç içi ağlar ise garantili gecikme ve sıfıra yakın jitter gerektirir. TSN bu ihtiyacı standart donanım üzerinde karşılar.
TSN standartlar ailesi
| Standart | Konu | Durum |
|---|---|---|
| IEEE 802.1AS-2020 | Zamanlama ve senkronizasyon (gPTP) | Yayımlandı |
| IEEE 802.1Qbv-2015 | Enqueue Time ile iletim seçimi (TAS) | 802.1Q'ya entegre |
| IEEE 802.1Qav-2009 | Akış tabanlı gecikme sınırlaması (CBS) | 802.1Q'ya entegre |
| IEEE 802.1Qbu-2016 | Frame preemption | 802.1Q'ya entegre |
| IEEE 802.1CB-2017 | Frame replikasyon ve eleme (FRER) | Yayımlandı |
| IEEE 802.1Qcc-2018 | Stream Reservation (SRP) güncellemeleri | 802.1Q'ya entegre |
| IEEE 802.1Qci-2017 | Per-Stream Filtering and Policing | 802.1Q'ya entegre |
TSN standartlar ailesi IEEE 802.1Q mega-standardında birleştirilmiştir. "802.1Qbv" gibi isimler artık ayrı doküman değil, 802.1Q revizyonlarındaki bölümlere atıfta bulunur.
01 802.1Qbv — Gate Control List ve TDMA zamanlama
IEEE 802.1Qbv (Time-Aware Shaper, TAS), her çıkış kuyruğu için bir kapı (gate) tanımlar. Bu kapılar, kesin zamanlara göre açılıp kapatılarak belirli bir trafik sınıfının belirli zaman diliminde iletilmesi garantilenir.
Temel kavramlar
GCL örneği — 1 ms döngü
Zaman (µs): 0 200 250 1000
│ │ │ │
TC7 (krit.) ████████ │ (200 µs açık)
Guard band ████ │ (50 µs kapalı)
TC0-6 (BE) ██████████ (750 µs açık)
GCL:
[0] gates=0x80 duration=200000 ns (sadece TC7 açık)
[1] gates=0x00 duration=50000 ns (guard band)
[2] gates=0x7F duration=750000 ns (TC0-6 açık)
cycle-time = 1000000 ns (1 ms)
802.1Qbv tek başına yeterli değildir; köprülerdeki GCL'lerin birbirleriyle koordineli olması gerekir. Bu koordinasyonu 802.1Qcc Stream Reservation ve merkezi ağ yönetimi (CNC) sağlar.
02 802.1Qav — Credit-Based Shaper
IEEE 802.1Qav (Credit-Based Shaper, CBS), akış bazlı bant genişliği rezervasyonu yapar. Her sınıf için bir "kredi" sayacı tutulur; frame ancak kredi pozitifken gönderilebilir. Bu mekanizma, ses/video akışları için garanti edilmiş bant genişliği ve sınırlı gecikme sağlar.
CBS parametreleri
Kredi hesabı örneği
| Parametre | Sınıf A (SR Class A) | Sınıf B (SR Class B) |
|---|---|---|
| Maks gecikme | 2 ms (2 köprü) | 50 ms (7 köprü) |
| Rezervasyon | 75% portu | 75% portu |
| idleSlope | 75 Mbit/s | 75 Mbit/s |
| sendSlope | -25 Mbit/s | -25 Mbit/s |
CBS, TAS (802.1Qbv) ile birlikte kullanılır: TAS "ne zaman" göndereceğini belirlerken CBS "ne kadar" göndereceğini kontrol eder. Tipik bir TSN ağında ses/video akışları CBS ile, kritik kontrol mesajları ise TAS ile yönetilir.
03 802.1AS — gPTP ve ağ senkronizasyonu
IEEE 802.1AS (Generalized Precision Time Protocol, gPTP), TSN'in saat senkronizasyon standardıdır. IEEE 1588v2 (PTP) profilini endüstriyel Ethernet için özelleştirir ve tüm ağ düğümlerinin nanosaniye hassasiyetinde aynı zamana hizalanmasını sağlar.
gPTP hiyerarşisi
Sync mesajlaşma akışı
Grandmaster Slave
│ │
│── Sync (t1) ────────────►│ (t2 slave'de ölçülür)
│── Follow_Up (t1) ───────►│
│ │
│◄─ Delay_Req (t3) ────────│ (t3 slave'de ölçülür)
│── Delay_Resp (t4) ───────►│
│ │
│ offset = ((t2-t1)-(t4-t3)) / 2
│ delay = ((t2-t1)+(t4-t3)) / 2
gPTP vs IEEE 1588v2 farkları
| Özellik | IEEE 1588v2 | gPTP (802.1AS) |
|---|---|---|
| Taşıma katmanı | UDP/IPv4, UDP/IPv6, Ethernet | Sadece Ethernet (L2) |
| Mesaj türleri | Tüm PTP mesajları | Azaltılmış alt küme |
| Propagation delay | End-to-end veya peer delay | Sadece peer delay |
| Transparent Clock | Opsiyonel | Zorunlu |
| Profil | Genel amaçlı | TSN'e özel, AVB/otomotiv |
04 Linux TC alt sistemi — taprio ve ETF qdisc
Linux traffic control (TC) alt sistemi, ağ paketlerinin sıralamasını ve zamanlamasını yönetir. TSN için iki kritik qdisc (queueing discipline) mevcuttur: taprio (TAS/802.1Qbv) ve ETF (Earliest TxTime First).
taprio — Time-Aware Priority Shaper
taprio, 802.1Qbv'nin Linux implementasyonudur. Gate Control List'i doğrudan kernel'da uygular ve donanım desteği varsa (hardware offload) NIC'in timestamp donanımına devret.
# taprio konfigürasyonu — 1 ms döngü, 4 kuyruk
# TC7: 200 µs kritik pencere | TC0-6: 750 µs | guard 50 µs
tc qdisc replace dev eth0 parent root handle 100 taprio \
num_tc 4 \
map 3 3 3 3 3 3 3 0 1 2 0 0 0 0 0 0 \
queues 1@0 1@1 1@2 1@3 \
base-time 0 \
sched-entry S 0x08 200000 \
sched-entry S 0x00 50000 \
sched-entry S 0x07 750000 \
clockid CLOCK_TAI \
flags 0x2 # 0x2 = software mode, 0x0 = hardware offload
ETF — Earliest TxTime First
ETF qdisc, pakete gömülü SO_TXTIME zaman damgasına göre iletimi zamanlar. taprio'nun alt qdisc'i olarak kullanılır ve nanosaniye hassasiyetinde paket gönderim zamanlaması sağlar.
# ETF'yi taprio alt qdisc'i olarak ekle
tc qdisc add dev eth0 parent 100:1 etf \
offload \
clockid CLOCK_TAI \
delta 200000 # 200 µs önceden kuyruğa al
# ETF + taprio için socket konfigürasyonu (C kodu):
# setsockopt(sock, SOL_SOCKET, SO_TXTIME, &sk_txtime, sizeof(sk_txtime));
# cmsg ile SCM_TXTIME zaman damgası gönder
CBS — Credit-Based Shaper qdisc
# CBS qdisc (802.1Qav için)
tc qdisc add dev eth0 parent 100:2 cbs \
idleslope 75000 \ # 75 Kbit/s
sendslope -925000 \ # sendslope = idle - port_speed
hicredit 30 \ # byte cinsinden
locredit -38 \
offload 1 # NIC hardware offload
05 linuxptp — ptp4l, phc2sys, ts2phc
linuxptp, Linux için IEEE 1588 ve 802.1AS uyumlu PTP implementasyonudur. ptp4l PTP protokolünü çalıştırır, phc2sys NIC hardware clock'u sistem saatiyle senkronize eder ve ts2phc ise GPS/1PPS sinyalinden hardware clock'u disipline eder.
ptp4l konfigürasyonu (gPTP profili)
# /etc/ptp4l.conf — gPTP (802.1AS) profili
[global]
gmCapable 1
priority1 128
priority2 128
logAnnounceInterval 0 # 1 saniyede 1 announce
logSyncInterval -3 # 8 ms'de 1 sync (2^-3)
logMinDelayReqInterval -3
network_transport L2 # Ethernet L2 (gPTP)
delay_mechanism P2P # Peer delay (gPTP zorunluluğu)
egressLatency 0
ingressLatency 0
time_stamping hardware # NIC hardware timestamping
tsproc_mode filter
delay_filter moving_median
delay_filter_length 10
clockServoDomain 0
[eth0] # TSN NIC arayüzü
# ptp4l başlatma
sudo ptp4l -f /etc/ptp4l.conf -i eth0 -m &
# phc2sys: NIC PHC → CLOCK_REALTIME
sudo phc2sys -s eth0 -c CLOCK_REALTIME \
-O 0 -R 8 -f /etc/ptp4l.conf -m &
# phc2sys: CLOCK_REALTIME → CLOCK_TAI (taprio için)
sudo phc2sys -s CLOCK_REALTIME -c CLOCK_TAI \
-O -37 -R 8 &
# Senkronizasyon durumunu izle
sudo pmc -u -b 0 'GET CURRENT_DATA_SET'
# offset from master: -5 ns
# mean path delay: 234 ns
ts2phc — GPS ile hardware clock senkronizasyonu
# /etc/ts2phc.conf
[global]
ts2phc.master 1 # Bu cihaz Grandmaster
leapfile /usr/share/zoneinfo/leap-seconds.list
[eth0] # TSN NIC
ts2phc.extts_polarity rising
[/dev/pps0] # GPS 1PPS sinyali
ts2phc.master 1
linuxptp araçları özeti
| Araç | Görev | Tipik Kullanım |
|---|---|---|
| ptp4l | PTP protokol motoru | Her TSN düğümünde çalışır |
| phc2sys | PHC ↔ sistem saati senkronizasyonu | CLOCK_TAI'yi güncel tutar |
| ts2phc | Harici referans → PHC | GPS/GNSS Grandmaster kurulumu |
| pmc | PTP Management Client | Durum sorgulama, konfigürasyon |
| timemaster | NTP+PTP kombinasyonu | Sistem saati yönetimi |
Hardware timestamping zorunludur — software timestamping ile TSN performansı elde edilemez. NIC'in ethtool -T çıktısında "hardware-transmit" ve "hardware-receive" desteği görünmelidir.
06 LLDP ve komşu keşfi
LLDP (Link Layer Discovery Protocol, IEEE 802.1AB), ağ cihazlarının komşularını keşfetmesi ve yeteneklerini ilan etmesi için kullanılır. TSN ağlarında her düğüm LLDP ile IEEE 802.1Qbv ve 802.1AS desteğini diğer düğümlere bildirir.
TSN ile ilgili LLDP TLV'ler
# lldpd kurulumu ve konfigürasyon
sudo apt install lldpd
# Konfigürasyon dosyası /etc/lldpd.conf
configure system description "TSN Edge Node v1.0"
configure lldp tx-interval 5 # Her 5 saniyede bir yayın
configure lldp tx-hold 4 # TTL = tx-interval × tx-hold
sudo systemctl enable lldpd
sudo systemctl start lldpd
# Komşuları listele
sudo lldpcli show neighbors
# -------------------------------------------------------------------------------
# Interface: eth0, via: LLDP, RID: 1, Time: 0 day, 00:02:34
# Chassis:
# ChassisID: mac aa:bb:cc:dd:ee:01
# SysName: tsn-switch-01
# MgmtIP: 192.168.1.1
# Port:
# PortID: ifname eth1
# PortDescr: TSN Port 1 (802.1Qbv)
# Yetenekleri göster
sudo lldpcli show neighbors details | grep -A5 802.1
TSN merkezi ağ konfigürasyonu (CNC/CUC) için NETCONF/YANG kullanan sistemler, LLDP bilgilerini topoloji veritabanını doldurmak için kullanır. lldpd'nin NETCONF köprüsü için yang-lldp modeli mevcuttur.
07 TSN destekli NIC'ler — Intel i210/i225 ve NXP LS1028A
TSN performansı büyük ölçüde NIC donanımına bağlıdır. Hardware timestamp, hardware taprio offload ve çoklu TX kuyruğu desteği olmadan yazılım tabanlı TSN'in jitter'ı yüzlerce mikrosaniyeye çıkabilir.
Intel I210 / I225
# I225 hardware taprio offload kontrolü
ethtool -k eth0 | grep -E "tx-checksum|hw-tc-offload"
# hw-tc-offload: on (taprio hardware offload aktif)
# I225 timestamp yetenekleri
ethtool -T eth0
# Capabilities:
# hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
# software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
# hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
# hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
# PTP Hardware Clock: 0
# Hardware Transmit Timestamp Modes:
# off (HWTSTAMP_TX_OFF)
# on (HWTSTAMP_TX_ON)
# I225 için hardware taprio
tc qdisc replace dev eth0 parent root taprio \
num_tc 4 \
map 3 3 3 3 3 3 3 0 1 2 0 0 0 0 0 0 \
queues 1@0 1@1 1@2 1@3 \
base-time 0 \
sched-entry S 0x08 200000 \
sched-entry S 0x07 800000 \
clockid CLOCK_TAI \
flags 0x0 # 0x0 = hardware offload
NXP LS1028A (SoC)
LS1028A, entegre TSN switch çekirdeği içeren bir SoC'tur. ENETC (Ethernet Controller) ve Felix switch donanımı ile tam 802.1Qbv/Qav/AS desteği sunar; ayrı NIC gerekmez.
| Özellik | Intel I225 | NXP LS1028A |
|---|---|---|
| Tip | PCIe NIC | Entegre SoC switch |
| Port sayısı | 1 | 6 (Felix switch) |
| 802.1Qbv offload | Evet | Evet |
| 802.1AS | Software (ptp4l) | Hardware (ptp4l + enetc) |
| 802.1CB FRER | Hayır | Evet |
| Linux sürücüsü | igc | enetc + mscc-felix |
08 Pratik: taprio + ETF ile deterministik UDP gönderim
Bu bölümde Intel I225 NIC'e sahip bir Linux makinesinden, taprio + ETF qdisc kombinasyonunu kullanarak nanosaniye hassasiyetinde zamanlı UDP paket gönderimi gerçekleştirilir.
Sistem hazırlığı
# 1. PTP senkronizasyonu başlat
sudo ptp4l -f /etc/ptp4l.conf -i eth0 -m &
sudo phc2sys -s eth0 -c CLOCK_REALTIME -O 0 -R 8 -m &
sudo phc2sys -s CLOCK_REALTIME -c CLOCK_TAI -O -37 -R 8 &
# 2. Senkronizasyonu doğrula (offset < 1 µs beklenir)
sudo pmc -u -b 0 'GET CURRENT_DATA_SET' | grep offset
# offsetFromMaster -143
# 3. taprio + ETF konfigürasyonu (I225 hardware offload)
sudo tc qdisc del dev eth0 root 2>/dev/null
sudo tc qdisc add dev eth0 parent root handle 100 taprio \
num_tc 2 \
map 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 \
queues 1@0 1@1 \
base-time $(date +%s)000000000 \
sched-entry S 0x01 300000 \
sched-entry S 0x02 700000 \
clockid CLOCK_TAI \
flags 0x0
sudo tc qdisc add dev eth0 parent 100:1 etf \
offload clockid CLOCK_TAI delta 200000
SO_TXTIME ile zamanlı UDP gönderici
/* tsn_sender.c — ETF + SO_TXTIME ile deterministik UDP */
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <arpa/inet.h>
#include <linux/net_tstamp.h>
#include <linux/errqueue.h>
#define DST_IP "192.168.1.2"
#define DST_PORT 5000
#define CYCLE_NS 1000000ULL /* 1 ms */
#define OFFSET_NS 200000ULL /* pencere başından 200 µs sonra */
int main(void)
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
/* SO_TXTIME'ı etkinleştir */
struct sock_txtime sk_txtime = {
.clockid = CLOCK_TAI,
.flags = 0,
};
setsockopt(sock, SOL_SOCKET, SO_TXTIME,
&sk_txtime, sizeof(sk_txtime));
/* VLAN önceliği 7 (TC7) için SO_PRIORITY */
int prio = 7;
setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio));
struct sockaddr_in dst = {
.sin_family = AF_INET,
.sin_port = htons(DST_PORT),
};
inet_pton(AF_INET, DST_IP, &dst.sin_addr);
struct timespec now;
clock_gettime(CLOCK_TAI, &now);
uint64_t txtime = (uint64_t)now.tv_sec * 1000000000ULL
+ now.tv_nsec;
/* Bir sonraki döngü sınırına hizala */
txtime = (txtime / CYCLE_NS + 1) * CYCLE_NS + OFFSET_NS;
for (int i = 0; i < 1000; i++) {
char buf[64];
snprintf(buf, sizeof(buf), "TSN frame %d txtime=%lu", i, txtime);
/* Kontrol mesajında txtime gönder */
char cmsg_buf[CMSG_SPACE(sizeof(uint64_t))];
struct iovec iov = { buf, strlen(buf) };
struct msghdr msg = {
.msg_name = &dst,
.msg_namelen = sizeof(dst),
.msg_iov = &iov,
.msg_iovlen = 1,
.msg_control = cmsg_buf,
.msg_controllen = sizeof(cmsg_buf),
};
struct cmsghdr *cm = CMSG_FIRSTHDR(&msg);
cm->cmsg_level = SOL_SOCKET;
cm->cmsg_type = SCM_TXTIME;
cm->cmsg_len = CMSG_LEN(sizeof(uint64_t));
memcpy(CMSG_DATA(cm), &txtime, sizeof(txtime));
sendmsg(sock, &msg, 0);
txtime += CYCLE_NS; /* Sonraki döngü */
}
close(sock);
return 0;
}
Gecikme ölçümü
# Alıcı tarafta RX timestamp ile gecikme ölç
# SO_TIMESTAMPING ile hardware RX zamanını al
python3 -c "
import socket, struct, time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('0.0.0.0', 5000))
# SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE
s.setsockopt(socket.SOL_SOCKET, socket.SO_TIMESTAMPING, 0x28)
while True:
data, _, _, ts = s.recvmsg(1024, 1024)
print(f'Alındı: {data[:20]}, HW TS: {ts}')
"
# cyclictest ile sistem latency ölçümü
sudo cyclictest -p80 -t1 -n -i1000 -l10000 \
--policy=fifo \
-h400 -q | tail -5
# Max: 18 µs (TSN + PREEMPT_RT ile)
SO_TXTIME ile gönderilen paketler, belirtilen txtime'dan önce gönderilemez. Eğer uygulama paketleri çok geç hazırlarsa ETF drop eder. ethtool -S eth0 | grep tx_late ile geç gönderilen paketleri izleyin.