Diese Frage wurde von einem der Software-Ingenieure in meiner Organisation gestellt. Ich bin an der weitesten Definition interessiert.
Antworten
Zu viele Anzeigen?Zusammenfassung
Ein TCP-Socket ist ein Endpunkt Instanz definiert durch eine IP-Adresse und einen Port im Zusammenhang mit einer bestimmten TCP-Verbindung oder dem Abhörstatus.
Ein Port ist ein Virtualisierungsbezeichner Definition eines Dienst-Endpunktes (im Unterschied zu einem Dienst Instanz Endpunkt alias Sitzungskennzeichen).
Ein TCP-Socket ist no eine Verbindung ist er der Endpunkt einer bestimmten Verbindung.
Es kann mehrere gleichzeitige Verbindungen zu einem Dienstendpunkt geben denn eine Verbindung ist gekennzeichnet durch sowohl seine lokale als auch seine entfernte Endpunkte, so dass der Verkehr an eine bestimmte Dienstinstanz weitergeleitet werden kann.
Es kann nur einen Listener-Socket für eine bestimmte Adresse/Port-Kombination geben .
Ausstellung
Das war eine interessante Frage, die mich gezwungen hat, einige Dinge zu überprüfen, von denen ich dachte, dass ich sie in- und auswendig kenne. Man sollte meinen, dass ein Name wie "Socket" selbsterklärend ist: Er wurde offensichtlich gewählt, um an den Endpunkt zu erinnern, an den man ein Netzwerkkabel anschließt, und es gibt starke funktionale Parallelen. Dennoch ist das Wort "Socket" im Netzwerkjargon mit so viel Ballast behaftet, dass eine sorgfältige Überprüfung notwendig ist.
Im weitesten Sinne ist ein Port ein Eingangs- oder Ausgangspunkt. Obwohl es nicht in einem Netzwerkkontext verwendet wird, ist das französische Wort Pforte bedeutet wörtlich Tür oder Tor Dies unterstreicht die Tatsache, dass Häfen Endpunkte des Transports sind, unabhängig davon, ob man Daten oder große Stahlcontainer verschifft.
Für die Zwecke dieser Diskussion beschränke ich mich auf den Kontext von TCP-IP-Netzen. Das OSI-Modell ist zwar schön und gut, wurde aber nie vollständig umgesetzt, geschweige denn unter Bedingungen mit hohem Verkehrsaufkommen und hoher Beanspruchung in großem Umfang eingesetzt.
Die Kombination aus einer IP-Adresse und einem Port wird als Endpunkt bezeichnet und manchmal auch als Socket bezeichnet. Diese Verwendung geht auf RFC793, die ursprüngliche TCP-Spezifikation, zurück.
A TCP Verbindung wird durch zwei Endpunkte definiert aka Steckdosen .
Ein Endpunkt (Socket) wird durch die Kombination aus einer Netzwerkadresse und einem Hafen Kennung. Beachten Sie, dass Adresse/Port nicht no eine Steckdose vollständig identifizieren (mehr dazu später).
Der Zweck von Ports besteht darin, mehrere Endpunkte an einer bestimmten Netzadresse zu unterscheiden. Man könnte sagen, dass ein Port ein virtualisierter Endpunkt ist. Diese Virtualisierung ermöglicht mehrere gleichzeitige Verbindungen auf einer einzigen Netzwerkschnittstelle.
Es ist das Buchsenpaar (das 4-Tupel bestehend aus der Client-IP-Adresse, Client-Portnummer, Server-IP-Adresse, und Server-Portnummer), das die die beiden Endpunkte spezifiziert, das eindeutig jede TCP-Verbindung im Internet eindeutig identifiziert. Internet identifiziert. ( TCP-IP illustriert Band 1 , W. Richard Stevens)
In den meisten von C abgeleiteten Sprachen werden TCP-Verbindungen mithilfe von Methoden auf einer Instanz der Socket-Klasse aufgebaut und bearbeitet. Obwohl es üblich ist, auf einer höheren Abstraktionsebene zu operieren, typischerweise einer Instanz einer NetworkStream-Klasse, wird dadurch im Allgemeinen ein Verweis auf ein Socket-Objekt offengelegt. Für den Programmierer scheint dieses Socket-Objekt die Verbindung zu repräsentieren, da die Verbindung mithilfe von Methoden des Socket-Objekts erstellt und manipuliert wird.
Um in C# eine TCP-Verbindung (zu einem bestehenden Listener) aufzubauen, erstellen Sie zunächst eine TcpClient . Wenn Sie keinen Endpunkt für die Datei TcpClient Konstruktor verwendet er Standardwerte - der lokale Endpunkt ist so oder so definiert. Dann rufen Sie die Verbinden Sie Methode für die von Ihnen erstellte Instanz. Diese Methode erfordert einen Parameter, der den anderen Endpunkt beschreibt.
All dies ist etwas verwirrend und führt zu der Annahme, dass eine Steckdose eine Verbindung ist, was Quatsch ist. Ich habe diesen Irrtum begangen, bis Richard Dorman die Frage stellte.
Nachdem ich viel gelesen und nachgedacht habe, bin ich nun überzeugt, dass es viel sinnvoller wäre, eine Klasse zu haben TcpConnection mit einem Konstruktor, der zwei Argumente benötigt, LocalEndpoint y RemoteEndpoint . Sie könnten wahrscheinlich ein einziges Argument unterstützen RemoteEndpoint wenn die Standardwerte für den lokalen Endpunkt akzeptabel sind. Auf Computern mit mehreren Teilnehmern ist dies nicht eindeutig, aber die Zweideutigkeit kann mithilfe der Routing-Tabelle aufgelöst werden, indem die Schnittstelle mit der kürzesten Route zum entfernten Endpunkt ausgewählt wird.
Die Klarheit würde auch in anderer Hinsicht verbessert. Eine Steckdose ist no identifiziert durch die Kombination von IP-Adresse und Port:
[...] TCP demultiplexiert eingehende Segmente anhand aller vier Werte, aus denen sich die lokalen und fremden Adressen zusammensetzen: Ziel-IP-Adresse, Ziel-Port-Nummer, Quell-IP-Adresse und Quell-Port-Nummer. TCP kann nicht feststellen, welcher Prozess ein eingehendes Segment erhält, wenn es nur den Zielport betrachtet. Außerdem ist der einzige der [verschiedenen] Endpunkte an [einer bestimmten Portnummer], der eingehende Verbindungsanfragen empfängt, derjenige, der sich im Listen-Status befindet. (p255, TCP-IP illustriert Band 1 , W. Richard Stevens)
Wie Sie sehen, ist es nicht nur möglich, sondern sehr wahrscheinlich, dass ein Netzdienst zahlreiche Sockets mit derselben Adresse/Port hat, aber nur einen Listener-Socket mit einer bestimmten Adresse/Port-Kombination. Typische Bibliotheksimplementierungen präsentieren eine Socket-Klasse, deren Instanz zum Erstellen und Verwalten einer Verbindung verwendet wird. Dies ist äußerst unglücklich, da es Verwirrung stiftet und zu einer weit verbreiteten Verwechslung der beiden Konzepte geführt hat.
Hagrawal glaubt mir nicht (siehe Kommentare), also hier ein echtes Beispiel. Ich habe einen Webbrowser verbunden mit http://dilbert.com und lief dann netstat -an -p tcp
. Die letzten sechs Zeilen der Ausgabe enthalten zwei Beispiele für die Tatsache, dass Adresse und Port nicht ausreichen, um einen Socket eindeutig zu identifizieren. Es gibt zwei verschiedene Verbindungen zwischen 192.168.1.3 (meinem Arbeitsplatzrechner) und 54.252.94.236:80 (dem entfernten HTTP-Server)
TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
Da ein Socket der Endpunkt einer Verbindung ist, gibt es zwei Sockets mit der Kombination Adresse/Port 207.38.110.62:80
und zwei weitere mit der Kombination Adresse/Port 54.252.94.236:80
.
Ich denke, Hagrawals Missverständnis rührt von meiner sehr vorsichtigen Verwendung des Wortes "identifiziert" her. Ich meine "vollständig, unzweideutig und eindeutig identifiziert". In dem obigen Beispiel gibt es zwei Endpunkte mit der Kombination Adresse/Anschluss 54.252.94.236:80
. Wenn Sie nur die Adresse und den Port haben, haben Sie nicht genug Informationen, um diese Sockets zu unterscheiden. Es sind nicht genug Informationen, um identifizieren. eine Steckdose.
Nachtrag
In Absatz zwei von Abschnitt 2.7 von RFC793 heißt es
Eine Verbindung ist durch das Buchsenpaar an den Enden vollständig spezifiziert. A lokaler Socket kann an vielen Verbindungen zu verschiedenen fremden Steckdosen teilnehmen.
Diese Definition des Begriffs "Socket" ist aus der Sicht der Programmierung nicht hilfreich, da er nicht dasselbe ist wie ein Socket Objekt der der Endpunkt einer bestimmten Verbindung ist. Für einen Programmierer, und die meisten Adressaten dieser Frage sind Programmierer, ist dies ein wesentlicher funktionaler Unterschied.
@plugwash macht eine auffällige Beobachtung.
Das grundsätzliche Problem besteht darin, dass die TCP RFC-Definition von Socket im Widerspruch zu der von allen wichtigen Betriebssystemen und Bibliotheken verwendeten Definition von Socket steht.
Per Definition ist der RFC korrekt. Wenn eine Bibliothek die Terminologie falsch verwendet, setzt dies den RFC nicht außer Kraft. Stattdessen wird den Benutzern dieser Bibliothek die Verantwortung auferlegt, beide Interpretationen zu verstehen und vorsichtig mit Worten und Kontext umzugehen. Wenn die RFCs nicht übereinstimmen, hat der jüngste und am unmittelbarsten anwendbare RFC Vorrang.
Referenzen
Eine Steckdose besteht aus drei Teilen:
- Eine IP-Adresse
- Ein Transportprotokoll
- Eine Anschlussnummer
Ein Anschluss ist eine Zahl zwischen 1 und 65535 einschließlich, die ein logisches Tor in einem Gerät bezeichnet. Jede Verbindung zwischen einem Client und einem Server erfordert einen eindeutigen Socket.
Zum Beispiel:
- 1030 ist ein Hafen.
- (10.1.1.2 , TCP , Port 1030) ist ein Socket.
Eine Steckdose stellt eine einzelne Verbindung zwischen zwei Netzanwendungen dar. Diese beiden Anwendungen laufen nominell auf verschiedenen Computern, aber Sockets können auch für die Kommunikation zwischen Prozessen auf einem einzigen Computer verwendet werden. Anwendungen können mehrere Sockets erstellen, um miteinander zu kommunizieren. Sockets sind bidirektional, d. h. jede Seite der Verbindung kann sowohl Daten senden als auch empfangen. Daher kann ein Socket theoretisch auf jeder Ebene des OSI-Modells ab 2 aufwärts erstellt werden. Programmierer verwenden Sockets oft in der Netzwerkprogrammierung, wenn auch indirekt. Programmierbibliotheken wie Winsock verbergen viele der Low-Level-Details der Socket-Programmierung. Sockets sind seit den frühen 1980er Jahren weit verbreitet.
Ein Hafen stellt einen Endpunkt oder "Kanal" für die Netzkommunikation dar. Portnummern ermöglichen es verschiedenen Anwendungen auf demselben Computer, Netzwerkressourcen zu nutzen, ohne sich gegenseitig zu stören. Portnummern kommen am häufigsten in der Netzwerkprogrammierung vor, insbesondere in der Socket-Programmierung. Manchmal werden Portnummern jedoch auch für den normalen Benutzer sichtbar gemacht. Zum Beispiel verwenden einige Websites, die eine Person im Internet besucht, eine URL wie die folgende:
http://www.mairie-metz.fr:8080/ In diesem Beispiel bezieht sich die Zahl 8080 auf die Portnummer, die der Webbrowser für die Verbindung mit dem Webserver verwendet. Normalerweise verwendet eine Website die Portnummer 80, und diese Nummer muss nicht in der URL enthalten sein (obwohl sie es sein kann).
In IP-Netzwerken können die Anschlussnummern theoretisch von 0 bis 65535 reichen. Die meisten gängigen Netzwerkanwendungen verwenden jedoch Portnummern am unteren Ende des Bereichs (z. B. 80 für HTTP).
Hinweis: Der Begriff Port bezieht sich auch auf verschiedene andere Aspekte der Netzwerktechnologie. Ein Anschluss kann sich auf einen physischen Verbindungspunkt für Peripheriegeräte wie serielle, parallele und USB-Anschlüsse beziehen. Der Begriff Port bezieht sich auch auf bestimmte Ethernet-Verbindungspunkte, wie z. B. an einem Hub, Switch oder Router.
ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm
Mit etwas Analogie
Obwohl viele technische Informationen bereits oben für Steckdosen ... Ich möchte meine Antwort hinzufügen, nur für den Fall, wenn jemand immer noch nicht den Unterschied zwischen ip, port und sockets erkennen kann
Betrachten Sie einen Server S ,
und sagen Person X,Y,Z einen Dienst (z. B. einen Chat-Dienst) von diesem Server S
dann
IP-Adresse sagt --> Wer? ist der Chatserver 'S', den X,Y,Z kontaktieren wollen
Okay, Sie haben "Wer ist der Server".
aber nehmen wir an, dass der Server "S" auch andere Dienste für andere Personen anbietet, z. B. S" erbringt Speicherdienstleistungen für Person A, B, C
dann
Hafen erzählt ---> Welche? Service Sie (X,Y,Z) brauchen, d.h. einen Chat-Dienst und nicht diesen Speicherdienst
Okay , Sie lassen den Server wissen, dass Sie einen "Chat-Dienst" wollen und nicht die Speicherung
sondern
du bist drei und die Der Server sollte alle drei Bereiche unterschiedlich kennzeichnen
da kommt die Steckdose
jetzt Steckdose sagt --> Welche? besondere Verbindung
Das heißt, sagen wir,
Steckdose 1 für Person X
Steckdose 2 für Person Y
und Steckdose 3 für Person Z
Ich hoffe, es hilft jemandem, der noch verwirrt war :)
Zunächst einmal sollten wir uns darüber klar werden, was es bedeutet, ein Paket von A nach B zu bringen.
Eine gängige Definition für ein Netzwerk ist die Verwendung des OSI-Modell das ein Netz je nach Zweck in mehrere Schichten unterteilt. Es gibt ein paar wichtige, die wir hier behandeln werden:
- Le site Datenverbindungsschicht . Diese Schicht ist für die Übertragung von Datenpaketen von einem Netzwerkgerät zu einem anderen verantwortlich und befindet sich direkt über der Schicht, die die eigentliche Übertragung vornimmt. Sie spricht über MAC-Adressen und weiß, wie man Hosts anhand ihrer MAC-(Hardware-)Adresse findet, aber mehr nicht.
- Le site Netzwerkschicht ist die Schicht, die es Ihnen ermöglicht, Daten über Maschinen und physische Grenzen hinweg zu transportieren, z. B. über physische Geräte. Die Netzwerkschicht muss im Wesentlichen einen zusätzlichen adressbasierten Mechanismus unterstützen, der in irgendeiner Weise mit der physischen Adresse zusammenhängt; geben Sie das Internetprotokoll (IPv4) ein. Eine IP-Adresse kann ein Paket über das Internet von A nach B bringen, weiß aber nichts darüber, wie die einzelnen Hops durchlaufen werden. Dies wird von der darüber liegenden Schicht in Übereinstimmung mit den Routing-Informationen gehandhabt.
- Le site Transportschicht . Diese Schicht ist für die Festlegung der Art und Weise verantwortlich, wie Informationen von A nach B gelangen, sowie für alle Einschränkungen, Überprüfungen oder Fehler in diesem Verhalten. TCP fügt beispielsweise zusätzliche Informationen zu einem Paket hinzu, so dass es möglich ist, festzustellen, ob Pakete verloren gegangen sind.
TCP enthält u. a. das Konzept der Häfen . Dabei handelt es sich um verschiedene Datenendpunkte an derselben IP-Adresse, an die ein Internet-Socket ( AF_INET
) binden können.
Das ist der Fall, so auch UDP und andere Transportschichtprotokolle. Sie sind technisch nicht brauchen Diese Ports bieten jedoch die Möglichkeit, dass mehrere Anwendungen in den darüber liegenden Schichten denselben Computer nutzen können, um ausgehende Verbindungen zu empfangen (und auch herzustellen).
Das bringt uns zur Anatomie einer TCP- oder UDP-Verbindung. Jede Verbindung hat einen Quellanschluss und eine Quelladresse sowie einen Zielanschluss und eine Zieladresse. So kann die Zielanwendung in einer bestimmten Sitzung sowohl von der Quelle antworten als auch empfangen.
Ports sind also im Wesentlichen eine durch die Spezifikation vorgegebene Möglichkeit, mehrere gleichzeitige Verbindungen über dieselbe Adresse zu ermöglichen.
Jetzt müssen wir uns ansehen, wie Sie aus der Sicht der Anwendung nach außen kommunizieren. Da die meisten Betriebssysteme die Berkeley Sockets unterstützen, können wir sehen, dass wir Sockets mit Ports aus einer Anwendung wie dieser erstellen können:
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
Großartig! Also im sockaddr
Strukturen, geben wir unseren Hafen an und bam! Job erledigt! Nun, fast, außer:
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
ist ebenfalls möglich. Urgh, das hat uns einen Strich durch die Rechnung gemacht!
Nun ja, eigentlich nicht. Alles, was wir tun müssen, ist, ein paar geeignete Definitionen zu finden:
- Ein Internet-Socket ist die Kombination aus einer IP-Adresse, einem Protokoll und der zugehörigen Portnummer, über die ein Dienst Daten bereitstellen kann. So ist tcp port 80, stackoverflow.com ein Internet-Socket.
- Ein Unix-Socket ist ein IPC-Endpunkt, der im Dateisystem dargestellt wird, z. B.
/var/run/database.sock
. - Eine Socket-API ist eine Methode, mit der eine Anwendung in der Lage sein muss, Daten auf einem Socket zu lesen und zu schreiben.
Voilà! Das bringt Ordnung in die Sache. Also in unserem Schema dann,
- Ein Port ist eine numerische Kennung, die als Teil eines Transportschichtprotokolls die Nummer des Dienstes angibt, der auf eine bestimmte Anfrage antworten soll.
Ein Port ist also eine Teilmenge der Anforderungen für die Bildung eines Internet-Sockets. Leider ist es so, dass die Bedeutung des Wortes Socket auf verschiedene Ideen angewandt wurde. Daher rate ich Ihnen, Ihr nächstes Projekt Socket zu nennen, um die Verwirrung noch zu vergrößern ;)
- See previous answers
- Weitere Antworten anzeigen