# TrafficClass eines UDP Pakets kommt beim Empfänger nicht an



## kulri (11. Feb 2009)

Hallo!

Ich sende UDP Pakete von A nach B, beide im selben LAN, ohne einen Router dazwischen. Dabei möchte ich das Type-of-Service-Feld (TrafficClass) des IP Headers setzen.
Am sendenden DatagramSocket setze ich die TrafficClass des Pakets und gebe sie gleich danach wieder aus:

```
sendingSocket.setTrafficClass(0x08|0x10);
  System.out.print.n(sendingSocket.getTrafficClass());
```
Es wird 24 ausgegeben, was 0x18 entspricht, ok soweit.

Aber auf der Empfängerseite warte ich zuerst auf ein paar Pakete, und versuche dann, deren TrafficClass auszulesen:

```
receivingSocket.getTrafficClass();      // returns 0
```
Hier wird jedoch die 0 zurückgegeben. Es ergeben sich für mich zwei Fragen:
1) Warum steht im ToS-Feld auf der Empfängerseite nicht mehr der beim Sender gesetzte Wert? Wird der irgendwo überschrieben?
2) Ich verstehe nicht, warum man beim Empfänger die TrafficClass über den receivingSocket ausliest, und nicht über das Datagram Packet. Ich meine, können an diesem receivingSocket nicht UDP Pakete verschiedener Anwendungen ankommen, die alle das ToS-Feld unterschiedlich befüllt haben?

Danke sehr!

Gruß
kulri


----------



## HoaX (11. Feb 2009)

kulri hat gesagt.:
			
		

> Es ergeben sich für mich zwei Fragen:
> 1) Warum steht im ToS-Feld auf der Empfängerseite nicht mehr der beim Sender gesetzte Wert? Wird der irgendwo überschrieben?


Das ist der Wert zum Senden über diesen Socket und hat mit den empfangenen Paketen nichts zu tun.



			
				kulri hat gesagt.:
			
		

> 2) Ich verstehe nicht, warum man beim Empfänger die TrafficClass über den receivingSocket ausliest, und nicht über das Datagram Packet. Ich meine, können an diesem receivingSocket nicht UDP Pakete verschiedener Anwendungen ankommen, die alle das ToS-Feld unterschiedlich befüllt haben?


Das siehst du richtig. Wo hast du das denn so falsch abgeschaut? Wenn du den ToS irgnedwo auslesen kannst, dann nur aus dem Paket.


----------



## kulri (11. Feb 2009)

verstehe, danke für die schnelle Antwort.
hört sich auch plausibel an. Wenn ich dich richtig verstanden haben, sagst du, die Methode setTrafficClass setzt sozusagen nur eine Option/Einstellung der Klasse DatagramSocket, nicht aber das ToS-Feld des IP Headers.
Aber ich lass auf Empfänger- sowie auf Senderseite wireshark die pakete sniffen. Und da sehe ich, dass auf der Senderseite das ToS-Feld den Wert enthält, den ich reingeschrieben habe, auf der Empfängerseite aber nicht mehr, da steht dann immer 0 drin.
Das spricht doch eigentlich gegen deine Erklärung, oder?


----------



## HoaX (11. Feb 2009)

Moooooment, ich glaube du drückst dich ungenau aus. Liest du nun auf Empfängerseite mit Wireshark oder mit deinem Javaprogramm das ToS-Feld aus und welche Werte spucken beide aus?

Wenn du auf Senderseite das ToS am Socket setzt, dann setzt der Socket beim Senden von Paketen das ToS-Feld entsprechend.

Auf Empfängerseite kommst du scheinbar garnichtmehr ran, da scheinbar DatagramPaket keine Methode dafür bereitstellt.

getTrafficClass() vom Empfängersocket gibt dir den Wert zurück, den dieser Socket beim Senden setzt und nicht auf das, was zuletzt empfangen wurde.


----------



## kulri (11. Feb 2009)

ja, viell habe ich mich nicht ganz klar ausgedrückt. Nochmal kurz zum Hintergrund:

Ich habe einen *UDPClient.java*, dieser *sendet * UDP DatagramPackets:

```
DatagramSocket socket = new DatagramSocket();
socket.setTrafficClass(SET_TYPE_OF_SERVICE);       //hier versuche ich, das ToS-Feld des IP Headers zu setzen

DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByAddress(TARGET_ADDRESS), PORT);
socket.send(packet);
```
Und ich habe einen *UDPServer.java*, dieser *empfängt* UDP DatagramPackets.

```
DatagramSocket receivingSocket = new DatagramSocket(PORT);
DatagramPacket packet = new DatagramPacket(new byte[PACKET_SIZE], PACKET_SIZE);
while(true)
{
  receivingSocket.receive(packet);
  receivingSocket.getTrafficClass();
}
```
Ok, dass receivingSocket.getTrafficClass() nicht die TrafficClass des Pakets, sondern die des Sockets zurückgibt, sehe ich ein. wie solle es auch anders gehen?
Naheliegend wäre doch, die TrafficClass aus dem Paket auszulesen, aber im DatagramPacket gibt es ja eine solche Methode nicht. Das Auslesen des ToS-Feldes an sich ist mir auf Server-Seite auch garnicht wichtig, ich mach das nur zum testen. Und da das ja nicht funktioniert, sniffe ich die Pakete mit wireshark.

Wireshark läuft auf Sender- und auf Empfängerseite und zeigt mir folgendes:
Senderseite: ToS-Feld korrekt gesetzt.
Empfängerseite: ToS-Feld ist 0.

Ich habe auch einen Freund beauftragt, meinen Code mal bei sich auszuprobieren, weil: anderer PC, anderes LAN, andere Person. Er hat sich mittlerweile wieder gemeldet und berichtet:
"Egal was ich mache, das ToS-Feld ist IMMER, auf Sender- und Empfängerseite korrekt, genauso, wie ich es gesetzt habe. Ich kann dein Problem nicht nachvollziehen..."

Dafür könnte es 3 Schuldige geben:
mein PC
mein LAN
meine Dummheit

.... ich hoffe, nicht Letzteres 

Falls dir noch was einfällt, wäre ich dankbar. Aber offensichtlich ist es kein Java-Problem.

Ach ja: Ich sende zwischen zwei PCs, nicht localhost. Die PCs hängen über einen switch zusammen, kein Router.
An einem PC läuft WinXP 32, an dem anderen WinXP 64, IP Adressen habe ich auf beiden seiten private vergeben (10.x.x.x). hmm... sonst noch irgendwas wichtiges... ? ich glaube nicht.


----------



## HoaX (12. Feb 2009)

Dann liegts wohl an deinem Rechner/Firewall/... kann man nicht genau sagen - jedenfalls nicht am Java-Code. Das eigentliche Problem ist ja nun "gelöst".


----------

