Die Transportschicht (Layer 4) ist für die zuverlässige Datenübertragung zwischen Anwendungsprozessen verantwortlich und bildet die Brücke zwischen den Anwendungen und den Netzwerkdiensten. Während Layer 3 (die Vermittlungsschicht) sich mit der Weiterleitung von Paketen zwischen Netzwerken befasst, konzentriert sich Layer 4 auf die End-to-End-Kommunikation zwischen den eigentlichen Prozessen auf Quell- und Zielgeräten. Die zwei Hauptprotokolle auf dieser Schicht im TCP/IP-Modell sind TCP (Transmission Control Protocol) und UDP (User Datagram Protocol).
TCP ist ein verbindungsorientiertes, zuverlässiges Protokoll, das sicherstellt, dass alle Daten ordnungsgemäß und in der richtigen Reihenfolge übertragen werden.
Ein TCP-Segment enthält folgende Hauptkomponenten:
Client Server
| |
|------ SYN, seq=x --->| (1)
| |
|<-- SYN-ACK, seq=y ---| (2)
| ack=x+1 |
| |
|------ ACK, ack=y+1 ->| (3)
| |
| Verbindung |
| hergestellt |
Client Server
| |
|------ FIN, seq=m --->| (1)
| |
|<----- ACK, ack=m+1 --| (2)
| |
|<----- FIN, seq=n ----| (3)
| |
|------ ACK, ack=n+1 ->| (4)
| |
| Verbindung |
| beendet |
TCP-Verbindungen durchlaufen verschiedene Zustände:
Die Flusskontrolle verhindert, dass ein schneller Sender einen langsamen Empfänger überlastet:
Die Staukontrolle verhindert eine Überlastung des Netzwerks:
UDP ist ein verbindungsloses, unzuverlässiges Protokoll, das minimalen Overhead bietet.
Ein UDP-Datagramm enthält folgende Komponenten:
| Eigenschaft | TCP | UDP |
|---|---|---|
| Verbindung | Verbindungsorientiert | Verbindungslos |
| Zuverlässigkeit | Garantierte Zustellung | Best-Effort (keine Garantie) |
| Reihenfolge | Erhält die Reihenfolge | Keine Reihenfolgegarantie |
| Geschwindigkeit | Langsamer durch Overhead | Schneller, minimaler Overhead |
| Overhead | Mindestens 20 Bytes Header | 8 Bytes Header |
| Staukontrolle | Ja | Nein |
| Anwendungsbeispiele | Webseiten, E-Mail, Dateien | Streaming, DNS, VOIP, Spiele |
Ports sind 16-Bit-Nummern (0-65535), die Anwendungen oder Dienste auf einem Host identifizieren.
Ein Socket ist eine Kombination aus IP-Adresse und Port und identifiziert eindeutig eine Prozess-zu-Prozess-Kommunikation:
IP-Adresse:Port (z.B.
192.168.1.10:80)Quell-Socket, Ziel-SocketLinux bietet verschiedene Tools zur Analyse und Überwachung von Transportschichtverbindungen.
$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*Optionen:
-t: TCP-Verbindungen anzeigen-u: UDP-Verbindungen anzeigen-l: Nur LISTENING-Sockets anzeigen-n: Numerische Adressen und Ports anzeigen (keine
Namensauflösung)-p: Prozess-ID und Name anzeigen$ ss -tuln
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:5353 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*Erweiterte Verwendung:
$ ss -tunlp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=1234,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1456,fd=3))
tcp LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=1678,fd=12))In Linux-Ausgaben finden sich die folgenden TCP-Zustände:
Das Tool lsof (List Open Files) kann verwendet werden,
um zu sehen, welche Prozesse welche Ports nutzen:
$ lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1456 root 3u IPv4 16423 0t0 TCP *:ssh (LISTEN)
sshd 1456 root 4u IPv6 16425 0t0 TCP *:ssh (LISTEN)$ lsof -i TCP:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2345 root 6u IPv4 24567 0t0 TCP *:http (LISTEN)
nginx 2346 www-data 6u IPv4 24567 0t0 TCP *:http (LISTEN)Mit watch kann man die Ausgabe von ss oder
netstat kontinuierlich aktualisieren:
$ watch -n 1 'ss -tunp | grep http'$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 16490 1 0000000000000000 100 0 0 10 0
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 16423 1 0000000000000000 100 0 0 10 0Diese Datei zeigt detaillierte Informationen über TCP-Verbindungen, inklusive Warteschlangenlängen, Timeouts und mehr.
$ ss -tmi
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.10:22 192.168.1.20:54321
skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0,d0)tcpdump ermöglicht die Erfassung und Analyse von
TCP/UDP-Paketen auf Netzwerkschnittstellen:
$ tcpdump -i eth0 tcp port 80$ tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'Diese letzte Anweisung zeigt nur TCP-Pakete mit gesetzten SYN-, FIN- oder RST-Flags an, was hilfreich ist, um Verbindungsaufbau und -abbau zu überwachen.
$ nmap -sT 192.168.1.10 # TCP-Connect-Scan
$ nmap -sS 192.168.1.10 # TCP-SYN-Scan (benötigt root-Rechte)
$ nmap -sU 192.168.1.10 # UDP-Scan
$ nmap -sV -p 22,80,443 192.168.1.10 # Version-Scan für bestimmte Ports# Eingehende Verbindungen zu Port 22 erlauben
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Alle anderen eingehenden Verbindungen blockieren
$ iptables -A INPUT -p tcp --syn -j DROP
# Verbindungsversuche protokollieren
$ iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet-Versuch: "ss -tan state syn-recvss -tan state time-wait | wc -l# Anzahl der offenen TCP-Verbindungen pro Zustand
$ ss -tan | awk '{print $1}' | sort | uniq -c
# Top-10 der Verbindungen nach Quell-IP
$ ss -tan | awk '{print $(NF)" "$(NF-1)}' | sort | uniq -c | sort -rn | head -10
# Prozesse mit den meisten Netzwerkverbindungen
$ lsof -n -i | awk '{print $1}' | sort | uniq -c | sort -rn | headDie Transportschicht bildet die kritische Brücke zwischen Anwendungen und dem Netzwerk und ist entscheidend für die Ende-zu-Ende-Kommunikation zwischen Prozessen über das Internet oder andere Netzwerke.