Ces 2 paquets appartiennent-ils à la même socket TCP?

Dec 15 2020

Disons que nous avons deux paquets Aet B.

A: A l'IP source S1, l' IP de destination D1, le port source, le port de SP1destinationDP1

B: A l'IP source S2, l' IP de destination D1, le port source, le port de SP2destinationDP1

Les deux sont TCP. Ces deux paquets auront-ils la même socket maintenant?


À propos d'UDP, j'ai lu que sa prise se compose de l'adresse IP de destination et du numéro de port de destination. Donc, si cela était fait avec UDP, les deux paquets seraient reçus par la même socket.

Mais cet exemple est pour TCP et ici je ne suis pas sûr s'il passerait également par le même socket pour TCP?

Réponses

12 SteffenUllrich Dec 15 2020 at 00:01

Premièrement, TCP ne se soucie pas des paquets uniques. Si ce ne sont que des paquets de données sans aucun établissement de connexion préalable, ils seront simplement abandonnés, aucune prise impliquée. Je suppose donc qu'il s'agit de connexions établies ou de paquets initiaux pour établir une connexion. Une connexion TCP est définie au moins par le 4 tuple de (src-ip, src-port, dst-ip, dst-port). Puisque ces 4 tuples sont évidemment différents dans les deux cas, il y aura des sockets différents nécessaires.

À propos d'UDP, j'ai lu que sa prise se compose de l'adresse IP de destination et du numéro de port de destination.

Cela n'est vrai que pour les sockets UDP non connectés . Avec les sockets UDP connectés à nouveau, le 4-tuple est pertinent.

2 MartinRosenau Dec 15 2020 at 15:28

À propos d'UDP, j'ai lu ça ...

La principale différence entre TCP et UDP est que TCP est orienté connexion tandis que UDP est utilisé pour transmettre des paquets uniques.

Un socket UDP gère tous les paquets UDP arrivant sur un certain port (de destination) de l'ordinateur.

Un socket TCP gère tous les paquets appartenant à une certaine connexion TCP.

Ces deux paquets auront-ils la même socket maintenant?

C'est plus compliqué que vous ne le pensez:

La situation que vous décrivez se produit généralement du côté «serveur» (sur l'ordinateur qui utilise l' accept()API pour gérer les connexions entrantes, comme un serveur Web).

Supposons que deux ordinateurs (exécutant des navigateurs Web) souhaitent se connecter au même serveur Web. Les deux ordinateurs ont choisi le même «port TCP source». Dans ce cas, les paquets envoyés par les deux ordinateurs au serveur Web satisfont votre condition: Seule l'adresse IP source diffère dans les paquets envoyés par les deux ordinateurs tandis que l'adresse IP de destination, le port de destination et le port source sont identiques.

Cependant, du côté «côté serveur», deux sockets sont impliqués dans la gestion d' une seule connexion TCP :

  1. Un socket qui utilise listen()et accept()attend les connexions TCP entrantes.
  2. Pour chaque connexion TCP entrante, un socket renvoyé par accept().

Lorsqu'un paquet TCP est le premier paquet d'une connexion TCP, le paquet est «géré» par le socket TCP qui exécute une listen()sur le port de destination.

Cette socket ne se soucie pas de l'adresse IP source ni du port TCP source - tout comme les sockets UDP. Le socket gère tous les premiers paquets de connexions TCP ayant une certaine adresse IP de destination et un certain port de destination.

Lorsque ce premier paquet est reçu, le deuxième socket (gérant la connexion TCP) est créé et renvoyé par l' access()API.

Cette socket gère une certaine connexion (et donc tous les autres paquets de la connexion TCP).

Parce que nous avons deux connexions différentes dans l'exemple avec les deux ordinateurs se connectant au même serveur en utilisant le même «port TCP source», deux sockets différents gèrent les paquets qui diffèrent uniquement par le port TCP de destination.