2009-07-15 4 views
2

Wenn auf einem ICMP-Buchse Empfangen (SOCK_RAW mit IPPROTO_ICMP), da gibt kein Konzept der „Port“ in dem ICMP-Protokoll ist, wie kann eine Anwendung bestimmen, dass ein empfangenes Paket nicht Teil von einigen anderen TCP/UDP/was auch immer Socket-Übertragung, die auch bei der gleichzeitig geschieht?Empfangen von Daten auf einer ICMP Buchse

Angenommen, Sie haben eine Anwendung mit 2 Threads. Thread 1 richtet einen TCP-Server-Socket ein und empfängt kontinuierlich Daten von einem verbundenen Client . Thread 2 sendet kontinuierlich Echoanforderungspakete (Ping) an denselben Client, der einen ICMP-Socket verwendet, und empfängt dann Echo Antworten. Was ist zu verhindern, dass Thread 2 stattdessen eines der TCP Pakete empfängt?

Antwort

6

ICMP ist ein anderes Protokoll als TCP und UDP, wie durch das Protokollfeld in IP header bestimmt. Wenn Sie einen Socket mit IPPROTO_ICMP öffnen, weisen Sie den Socket an, nur Pakete mit IP-Headern zu senden und zu empfangen, deren Protokollfeld auf ICMP festgelegt ist.

In ähnlicher Weise antworten Sockets, die mit IPPROTO_TCP oder IPPROTO_UDP geöffnet wurden, nur auf Pakete, deren IP-Header ein Protokollfeld enthalten, das auf TCP bzw. UDP festgelegt ist.

0

Sie können den ICMP-Header für den Typ überprüfen und sehen, ob sein ICMP Echo Response (Typ 0). Auch in ICMP enthält die Antwort die Anforderung, die Sie an erster Stelle gesendet haben.

2

Empfangene UDP & TCP-Pakete niemals Raw Sockets übergeben. Wenn ein Prozess ein IP-Datagramm lesen möchte, das UDP- oder TCP-Pakete enthält, müssen die Pakete auf der Sicherungsschicht gelesen werden. diesen Link

http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch01s03.html

, wenn das Paket nicht auf Schicht 2 dann wird es verarbeitet durch Kernel zwischengespeichert wird. Und wenn das Paket von ICMP-Protokoll und es ist vom Typ Echo-Anforderung oder Zeitstempel-Anforderung oder Adreßmaske Anfrage dann wird es vollständig von Kernel verarbeitet andernfalls auf Raw Sockets übergeben wird.

Ein weiterer alle Datagramme mit einem Protokollfeld, das der Kernel nicht nur grundlegende Verarbeitung von IP-Raw Sockets weitergegeben werden nicht verstehen, auf sie getan

Endlich wenn Datagramm in Fragmente kommt dann nichts zu Raw Sockets übergeben bis alle Fragmente erreicht und wieder zusammengesetzt sind. Wenn Sie mehr erfahren möchten, lesen Sie this book.