Forum: Mikrocontroller und Digitale Elektronik Webserver U. Radig, ARP-Tabelle


von Bernd (Gast)


Lesenswert?

Auf einem AVR-NETIO läuft der Webserver-Formware von U. Radig. Zum 
HTTP-Client der Firmware habe ich Fragen.

Nach dem Aufruf des Clients (Port 84) trägt die Firmware MAC & IP und 
einen Zeit von 100 s in die ARP-Tabelle (siehe Tabelle 3) ein. Warum 
wird so verfahren? Wo ist der Vorteil?

Während die Zeit abläuft (100 s -> 0 s), kann über den Client keine neue 
Verbindung (siehe Tabelle 2) aufgebaut werden. Was ist die Ursache?

Neben der ARP- gibt es noch eine TCP-Tabelle (siehe Tabelle 3). Welche 
Aufgabe erfüllt sie?


Aufruf von TCP 'erfolgreich':

Tabelle 1
1
client 4
2
HTTP_CLIENT : Start
3
Ready
4
5
HC 1: ARP-Request
6
HC 1: TCP-Verbindung angefragt auf Port 84
7
HC 2: Hergestellt! (1000)
8
HC 3: TCP-Verbindung erfolgreich.
9
Decoder: 4
10
11
HTTP/1.1 200 OK
12
Server: Netwave IP Camera
13
Date: Thu, 01 Jan 1970 08:37:16 GMT
14
Content-Type: text/plain
15
Content-Length: 89
16
Cache-Control: no-cache
17
Connection: close
18
19
20
var resolution=32;
21
var brightness=64;
22
var contrast=4;
23
var mode=2;
24
var flip=0;
25
var fps=0;
26
27
HC 4:->HTTP/1.1 200 OK<-
28
HC 4: Erfolgreich! (9783)
29
HC 5: TCP-Verbindung schließen
30
HC 5: OK: 15 / Gesamt: 19

Aufruf von TCP 'nicht erfolgreich':

Tabelle 2
1
client 3
2
HTTP_CLIENT : Start
3
Ready
4
5
HC 1: ARP-Request
6
HC 1: TCP-Verbindung angefragt auf Port 84
7
HC 2: Nicht erfolgreich
8
HC 5: TCP-Verbindung schließen
9
HC 5: OK: 15 / Gesamt: 20

ARP- und TCP-Tabelle nach einem Aufruf:

Tabelle 3
1
arp
2
00  MAC:00.0d.c1.d5.xx.xx  IP:192.168.xxx.xxx  Time:0097
3
01  MAC:00.00.00.00.00.00  IP:000.000.000.000  Time:0000
4
02  MAC:00.00.00.00.00.00  IP:000.000.000.000  Time:0000
5
03  MAC:00.00.00.00.00.00  IP:000.000.000.000  Time:0000
6
04  MAC:00.00.00.00.00.00  IP:000.000.000.000  Time:0000
7
Ready
8
9
tcp
10
00  IP:000.000.000.000  PORT:0000  Time:0000
11
01  IP:000.000.000.000  PORT:0000  Time:0000
12
02  IP:000.000.000.000  PORT:0000  Time:0000
13
03  IP:000.000.000.000  PORT:0000  Time:0000
14
04  IP:000.000.000.000  PORT:0000  Time:0000
15
Ready

von Jim M. (turboj)


Lesenswert?

Bernd schrieb:
> Während die Zeit abläuft (100 s -> 0 s), kann über den Client keine neue
> Verbindung (siehe Tabelle 2) aufgebaut werden. Was ist die Ursache?

Bernd schrieb:
> HTTP/1.1 200 OK
> Server: Netwave IP Camera

Könnte auch an der Camera liegen. Deren TCP/IP/HTTP Stacks sehen 
mitunter recht gruslig aus - insbesondere bei der Fehlerbehandlung.

Ansonsten hilft in solchen Fällen ein Hub und Wireshark.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

der Eintrag in die ARP Tabelle ist doch logisch. Um das Ethernetpaket zu 
senden brauchts die MAC Adresse. Also wird ein ARP Request an die 
Ziel-IP (wenn im LAN) oder an den Gateway (wenn extern) gesendet um die 
MAC zu bekommen. Das Ergebnis wird in die Tabelle eingetragen und für 
den anschließenden TCP-Verbindungsaufbau genutzt.
Der Eintrag kann aber eigentlich nicht dazu führen das du keine neue 
Verbindung aufbauen kannst.
Das "Problem" wird die Kamera sein. Nach dem schließen der 
TCP-Verbindung verbleibt der Eintrag meist noch eine gewisse Zeit im 
Stack gespeichert (auch bei Win). Versuchst du eine neue Verbindung 
aufzubauen wird die der alten Verbindung zugeordnet. Du musst vom 
Prinzip her wie jeder andere Stack ausgehend bei jeder Verbindung einen 
neuen Port nehmen - nicht immer wieder 84. Im übrigen verwendet man für 
ausgehende Verbindungen Ports >1024.
Also nach dem Ende der TCP-Verbindung den Client-Eintrag löschen und vor 
der nächsten Verbindung einen Client-Eintrag mit der nächst größeren 
Portnummer hinzufügen.

Sascha

von Bernd (Gast)


Lesenswert?

Vielen Dank für eure Antworten.

> Du musst vom Prinzip her wie jeder andere Stack ausgehend bei jeder
> Verbindung einen neuen Port nehmen - nicht immer wieder 84.

Warum muss denn jedes mal ein neuer Port genommen werden? Wieso kann 
nicht über den gleichen kommuniziert werden? Es ist doch nicht sinnvoll 
den Port zu blockieren.

M. M. n liegt es mit größter Wahrscheinlich nicht an der Kamera, da nach 
dem Ablauf der ARP-Zeit im AVR-NETIO von 100 Sekunden, ein neues 
Kommando problemlos abgesetzt werden kann.

Eure Vorschläge werde ich umsetzen und mich gegebenenfalls noch einmal 
melden.

von Sascha W. (sascha-w)


Lesenswert?

Bernd schrieb:
> Vielen Dank für eure Antworten.
>
>> Du musst vom Prinzip her wie jeder andere Stack ausgehend bei jeder
>> Verbindung einen neuen Port nehmen - nicht immer wieder 84.
>
> Warum muss denn jedes mal ein neuer Port genommen werden? Wieso kann
> nicht über den gleichen kommuniziert werden?
Kann schon, aber erst nach einer gewissen Wartezeit. Falls die 
Verbindung nicht ordenlich geschlossen oder unterbrochen wird können so 
verspätet eintreffende Pakete noch zugeordnet werden.
> Es ist doch nicht sinnvoll
> den Port zu blockieren.
Der Port wird ja nur für die eine IP blockiert zu der die Verbindung 
bestand, und wenn der Client bei der nächsten Verbindung einen anderen 
Port nimmt ist das auch kein Problem.

> M. M. n liegt es mit größter Wahrscheinlich nicht an der Kamera, da nach
> dem Ablauf der ARP-Zeit im AVR-NETIO von 100 Sekunden, ein neues
> Kommando problemlos abgesetzt werden kann.
Wenn es tatsächlich daran liegt dann ist da ein Fehler in der Software. 
Beim Aufbau der Verbindung wird erst in der ARP-Tabelle geschaut ob für 
die IP ein Eintrag vorhanden ist und nur wenn dem nicht so ist wird ein 
neuer ARP-Request gestartet.
Du kannst doch die 100s mal auf 10s runtersetzen.

Sascha

von S. R. (svenska)


Lesenswert?

Das Problem ist, dass nach dem Versenden eines verbindungstrennenden 
RST-Paketes die Verbindung formal nicht mehr besteht, dieses Paket aber 
dennoch bestätigt werden muss. Außerdem können ja auch noch andere 
Pakete über diese Verbindung eintrudeln, die vor der Trennung 
abgeschickt wurden. Daher hält jeder bessere TCP-Stack eine Verbindung 
nach ihrem Ende noch eine gewisse Zeit lang in einem "Verbindung tot, 
aber noch reserviert"-Zustand (TIME_WAIT), um solche Pakete schnell 
korrekt einordnen (und wegwerfen) zu können.

Eine Verbindung besteht aus (Source-IP, Source-Port, Destination-IP, 
Destination-Port). Wenigstens eines davon musst du ändern, um eine 
neue Verbindung aufbauen zu können, und das ist sinnvollerweise der 
Source-Port. Ansonsten bist du für den Empfänger nämlich nur das 
verrauschte, vorgeschichtliche Echo einer früheren Verbindung, die er 
erst nach TIME_WAIT vergessen wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.