Die Sitzungsschicht (Session Layer) ist die fünfte Schicht im OSI-Referenzmodell und befindet sich zwischen der Transportschicht (Layer 4) und der Darstellungsschicht (Layer 6). Sie ist verantwortlich für den Aufbau, die Verwaltung und Beendigung von Kommunikationssitzungen zwischen Anwendungen. Im TCP/IP-Referenzmodell existiert die Sitzungsschicht nicht als separate Ebene, sondern ihre Funktionalitäten sind in der Anwendungsschicht integriert.
In Netzwerk-Anwendungen ist eine Session eine logische Verbindung zwischen zwei Endpunkten, die auf verschiedene Weise implementiert werden kann:
Die Sitzungsschicht definiert, in welcher Weise der Datenaustausch zwischen den Kommunikationspartnern stattfindet:
Ein wichtiges Konzept der Sitzungsschicht ist die Einrichtung von Synchronisationspunkten, die den Dialog in logische Einheiten unterteilen:
Diese Synchronisationspunkte ermöglichen eine Wiederaufnahme der Kommunikation nach einem Fehler oder einer Unterbrechung, ohne die gesamte Sitzung neu starten zu müssen.
Session Start
|
├── Major Sync Point 1
| ├── Minor Sync Point 1.1
| ├── Minor Sync Point 1.2
| └── Minor Sync Point 1.3
|
├── Major Sync Point 2
| ├── Minor Sync Point 2.1
| └── Minor Sync Point 2.2
|
└── Session End
Tokens werden in der Sitzungsschicht verwendet, um zu steuern, welcher Kommunikationspartner bestimmte Aktionen ausführen darf:
Der Token-basierte Ansatz verhindert Konflikte bei kritischen Operationen, indem sichergestellt wird, dass diese stets geordnet und koordiniert ablaufen.
Obwohl im TCP/IP-Modell Layer 5 nicht explizit existiert, implementieren viele Protokolle Funktionen der Sitzungsschicht:
# NetBIOS-Namen anzeigen
$ nbstat -n
NetBIOS Local Name Table
Name Type Status
-------------------------------------
WORKSTATION1 <00> UNIQUE Registered
WORKGROUP <00> GROUP Registered
WORKSTATION1 <03> UNIQUE Registered
RPC ermöglicht es einem Prozess, Funktionen auf einem entfernten System aufzurufen, als wären sie lokale Funktionen:
// Vereinfachtes RPC-Beispiel in C
// IDL-Definition (Interface Definition Language)
program CALCULATOR {
version CALC_V1 {
int ADD(int, int) = 1;
int SUBTRACT(int, int) = 2;
} = 1;
} = 0x20000001;
// Client-Code
int result;
result = add_1(10, 5, clnt); // Remote-Aufruf auf ServerEin Protokollpaket für Audio- und Videokonferenzen über paketbasierte Netzwerke:
Ein Signalisierungsprotokoll zum Aufbau, zur Änderung und zum Beenden von Kommunikationssitzungen:
# SIP-Nachrichtenbeispiel für Anrufaufbau
INVITE sip:bob@example.com SIP/2.0
Via: SIP/2.0/UDP alice-pc.example.com:5060;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@example.com>
From: Alice <sip:alice@example.com>;tag=1928301774
Call-ID: a84b4c76e66710@alice-pc.example.com
CSeq: 314159 INVITE
Contact: <sip:alice@alice-pc.example.com>
Content-Type: application/sdp
Content-Length: 142
[SDP-Daten folgen hier]
Cookies sind ein Mechanismus, um Sitzungsinformationen in HTTP-Anwendungen zu speichern:
# HTTP-Antwort mit Cookie-Setzung
HTTP/1.1 200 OK
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure
Content-Type: text/html
# Nachfolgende HTTP-Anfrage mit Cookie
GET /dashboard HTTP/1.1
Host: example.com
Cookie: session_id=abc123
Webanwendungen implementieren Sitzungsmanagement über verschiedene Techniken:
Serverseitige Sessions:
Clientseitige Sessions:
<?php
// PHP-Beispiel für serverseitiges Session-Management
session_start(); // Session initialisieren
// Session-Daten setzen
$_SESSION['user_id'] = 12345;
$_SESSION['username'] = 'max.mustermann';
// An anderer Stelle: Session-Daten auslesen
if (isset($_SESSION['user_id'])) {
echo "Angemeldet als: " . $_SESSION['username'];
}
?>// JavaScript-Beispiel für clientseitiges Session-Management mit JWT
// JWT erstellen (serverseitig)
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ userId: 12345, username: 'max.mustermann' },
'geheimer-schlüssel',
{ expiresIn: '1h' }
);
// Token an Client senden
res.json({ token });
// Clientseitig: Token speichern
localStorage.setItem('token', receivedToken);
// Späteren API-Anfragen hinzufügen
fetch('/api/data', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
});Unix/Linux-Systeme verwalten Terminalsitzungen auf verschiedenen Ebenen:
Login-Sessions:
Pseudo-Terminals (PTY):
# Anzeige aktiver Login-Sessions
$ who
max pts/0 2023-07-15 14:23 (192.168.1.10)
anna pts/1 2023-07-15 15:05 (192.168.1.20)
# Detaillierte Session-Informationen
$ w
15:30:25 up 10 days, 5:27, 2 users, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
max pts/0 192.168.1.10 14:23 0.00s 0.04s 0.01s w
anna pts/1 192.168.1.20 15:05 2:10 0.12s 0.12s -bashTerminal-Multiplexer wie screen und tmux
ermöglichen fortgeschrittenes Sitzungsmanagement:
# Neue Screen-Session starten
$ screen -S meine_session
# Session trennen (detach) mit Tastenkombination: Ctrl+A, D
# Liste der laufenden Sessions anzeigen
$ screen -ls
There is a screen on:
12345.meine_session (Detached)
# Wieder mit der Session verbinden
$ screen -r meine_session# Neue Tmux-Session starten
$ tmux new -s meine_session
# Session trennen mit Tastenkombination: Ctrl+B, D
# Liste der laufenden Sessions anzeigen
$ tmux ls
meine_session: 1 windows (created Sat Jul 15 15:40:25 2023)
# Wieder mit der Session verbinden
$ tmux attach -t meine_sessionWireshark kann zur Analyse von Kommunikationssitzungen auf verschiedenen Protokollebenen verwendet werden:
# TCP-Sitzungen anzeigen
$ tshark -r capture.pcap -z conv,tcp
# Alle HTTP-Anfrage-Antwort-Paare extrahieren
$ tshark -r capture.pcap -T fields -e http.request.method -e http.request.uri -e http.response.code
# SIP-Anrufsitzungen analysieren
$ tshark -r voip_capture.pcap -o 'sip.display_raw_text:TRUE' -Y sipIn der grafischen Oberfläche von Wireshark: 1. Rechtsklick auf ein Paket einer interessanten Verbindung 2. “Follow” -> “TCP Stream” (oder UDP/HTTP/SSL Stream) wählen 3. Die gesamte Sitzung wird in konversationsähnlicher Form angezeigt
Typische Sitzungsprobleme und Diagnoseansätze:
Verbindungsabbrüche:
# TCP-Reset-Pakete (RST) finden
$ tshark -r capture.pcap -Y "tcp.flags.reset == 1"Sitzungs-Timeouts:
# Lange Lücken zwischen Paketen in einer Verbindung finden
$ tshark -r capture.pcap -T fields -e frame.time_epoch -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport | awk '...'Fehlgeschlagene Authentifizierung:
# HTTP 401/403 Fehler finden
$ tshark -r capture.pcap -Y "http.response.code == 401 || http.response.code == 403"Session Hijacking ist ein Angriff, bei dem ein Angreifer eine bestehende Sitzung übernimmt:
# Sicherheitsmerkmale für Cookies
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
Bei diesem Angriff zwingt der Angreifer dem Opfer eine bekannte Session-ID auf:
Schutz:
<?php
// Sicheres Session-Management (PHP-Beispiel)
// Alte Sitzung verwerfen und neue erstellen bei Login
function secureLogin($username, $password) {
if (verifyCredentials($username, $password)) {
// Alte Session-ID verwerfen und neue erstellen
session_regenerate_id(true);
$_SESSION['user_id'] = getUserId($username);
$_SESSION['login_time'] = time();
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
return true;
}
return false;
}
?>Die Sitzungsschicht spielt eine wichtige Rolle für anwendungsorientierte Kommunikation, indem sie die strukturierte Interaktion zwischen Anwendungen ermöglicht und den Kontext über mehrere Datenaustausche hinweg aufrechterhält.