Simple, amusant et facile à comprendre! Programmation réseau Python UDP

1. Qu'est-ce que UDP?

UDP signifie User Datagram Protocol , le chinois est le User Datagram Protocol . Il s'agit d'un protocole de couche de transport sans connexion dans l'ensemble de protocoles Internet , fournissant des services de transmission simples et peu fiables axés sur les transactions . Pour faire simple, UDP est un protocole de transport au niveau de la couche de transport . Il n'est pas nécessaire d'établir une connexion avec l'hôte cible pendant la transmission . Vous pouvez transmettre directement tant que vous connaissez l'adresse IP et le numéro de port de l'autre partie . Nous pouvons comparer UDP à l' écriture d'une lettre : vous devez écrire l'adresse postale et le numéro de courrier chaque fois que vous envoyez une lettre, vous pouvez l'envoyer directement sans appeler l'autre partie avant de l'envoyer.
Nous avons une compréhension générale de la définition d'UDP, alors jetons un coup d'œil aux caractéristiques du "mode d'écriture de lettre".

Deuxièmement, les caractéristiques de l'UDP

1. Manque de fiabilité:

UDP fait de son mieux pour livrer, mais il ne garantit pas la livraison . En d'autres termes, l' intégrité et l' accessibilité des données transmises via le protocole UDP ne peuvent être garanties . L' hôte ne sera pas averti s'il arrive ou non . Par conséquent, il n'est pas nécessaire de maintenir la relation de connexion compliquée entre l'hôte et l'hôte cible. En termes simples, c'est comme les temps anciens. Vous devez partager un livre avec votre petite amie dans un endroit différent. Qu'est-ce qui ne va pas, l'enveloppe peut-elle être transmise (en cas de rencontre avec Lord Bei, puis un gâteau ...)

Étant donné qu'UDP n'est pas fiable, n'est- il pas nécessaire qu'UDP existe? La réponse est non . UDP n'est pas fourni avec un grand nombre de fonctions de sécurité comme tcp, donc UDP n'aura pas beaucoup de surcharge système pendant le processus de transmission, ce qui réduit considérablement le temps d'exécution , améliorant ainsi l'efficacité de la transmission . Cette efficacité est tcp Il est difficile de se souvenir . En raison des avantages de la vitesse de transmission UDP, UDP est très important pour certaines applications en temps réel.

 2. Pas de connectivité:

UDP est sans connexion , c'est-à-dire qu'il n'est pas nécessaire d'établir une connexion avant la communication , et la couche de transport de l'hôte cible ne donne pas de confirmation après l'avoir reçue . Selon l'analogie précédente, vous n'avez pas besoin d'avertir votre petite amie lorsque vous laissez le pigeon voler (il semble qu'il n'y a aucun moyen de le notifier ...); même si le pigeon livre l'enveloppe, il ne peut pas vous avertir immédiatement "Je l’ont reçu. "

3. Orienté message:

Les paquets de la couche application transmis le long de la couche réseau et transmis aux paquets ip ne sont pas modifiés , ajoutez / supprimez directement un en-tête pour l'étape suivante. Si le message est trop long, il sera fragmenté au niveau de la couche ip ; si le message est trop court, l'en-tête du datagramme au niveau de la couche ip sera très long. Je n'utilise plus Fei Ge Chuan Shu ici, utilisez la version améliorée de Fei Ge Chuan Shu-write letter (emmm ... passes through): Lorsque vous écrivez une lettre, mettez la lettre (champ de données) dans l'enveloppe ( première partie) Lorsque le contenu est trop important, plusieurs morceaux de papier à lettre seront utilisés; lorsque le contenu est trop petit, le nombre de mots peut ne pas être aussi grand que celui de l'enveloppe. Et lorsque votre petite amie reçoit la lettre, ouvrez simplement l'enveloppe et vous pourrez lire votre "petite lettre d'amour".

4. Aucun mécanisme de congestion:

Une fois le réseau encombré , le taux d'envoi de l'hôte source ne sera pas réduit , ce qui est très important pour certaines applications en temps réel. Tels que téléphone IP, vidéo en temps réel, etc. Dans le même temps autorisé lorsque le réseau est encombré perdre certaines données , mais il ne permet pas aux données beaucoup de retard .

Comme UDP n'a pas de mécanisme de congestion, lorsque trop d'hôtes sources envoient des données en temps réel à haut débit au réseau en même temps, il est susceptible de provoquer une congestion et une perte de données. Pour certaines applications en temps réel, cette transmission peu fiable peut être améliorée de manière appropriée, et certaines mesures de protection et de réparation peuvent être ajoutées, telles que la correction d'erreur vers l'avant ou la retransmission de paquets perdus .

5. Il n'y a pas de sens clair du client et du serveur

Vous pouvez à la fois écrire et recevoir des lettres, il n'y a pas beaucoup de différence entre les deux (l'amour est à l'origine réciproque ...).

6. Prise en charge de la communication interactive un-à-un, un-à-plusieurs, plusieurs-à-un, plusieurs-à-plusieurs

  • Unicast: Unicast est un mode de communication un-à-un. L'expéditeur doit spécifier l'adresse IP et le port de l'autre partie, et seule la machine correspondante peut recevoir les données envoyées, et cela n'aura aucun impact sur les autres machines du sous-réseau.
  • Multidiffusion : La multidiffusion est un mode de communication un-à-plusieurs. Une machine communique avec une partie de toutes les machines du sous-réseau. Ces machines peuvent toutes recevoir les données envoyées par l'hôte, mais les machines non spécifiées du sous-réseau ne sont pas affectées.
  • Diffusion : Lorsque le nombre de machines dans la multidiffusion est le nombre de toutes les machines dans le sous-réseau, la "multidiffusion" à ce moment n'est plus appelée multidiffusion, mais diffusion. Le protocole ip stipule que la diffusion ne peut être effectuée que dans un sous-réseau, mais pas dans un réseau étendu.
  • Multidiffusion : De même, la multidiffusion est également un mode de communication un-à-plusieurs. Une fois qu'une machine rejoint une adresse IP de multidiffusion, puis envoie des données à l'IP de multidiffusion, toutes les machines de la multidiffusion peuvent recevoir les données.

 

7. La surcharge d'en-tête est faible, seulement 8 octets

UDP se compose de deux parties , l'une est le champ d'en-tête et l'autre est le champ de données .
Le champ d'en-tête n'a que 8 octets et est divisé en 4 champs :

  • Port source : numéro de port source. Choisissez le moment où vous avez besoin de votre interlocuteur pour répondre et utilisez les 0 lorsque vous n'en avez pas besoin.
  • Port de destination : numéro de port de destination. Utilisé en fin de livraison.
  • Longueur : La longueur du datagramme utilisateur udp, la valeur minimale est 8 (uniquement l'en-tête).
  • Somme de contrôle : vérifiez s'il y a une erreur dans la transmission du datagramme utilisateur udp et supprimez-la en cas d'erreur.

Trois, communication de socket

En fait, la façon de créer un socket est similaire à la façon de lire et d'écrire des fichiers. Vous souvenez-vous encore comment lire et écrire des fichiers? Rappelons ensemble:

f  = open()   # 打开文件
f.read()/f.write()    #  对文件进行操作
f.close()   # 关闭文件   

Regardons à nouveau la façon de créer une socket:

1. Importez le module socket

import socket

2. Créez un objet socket (socket)

t = socket.socket(socket.AF_INET,sockeet.SOCK_DGRAM)

Lors de la création d'un socket, socket nécessite deux paramètres socket (AddressFamily, Type)

AdressFamily : Vous pouvez choisir AF_INET (pour la communication entre processus Internet) ou AF_UNIX ( pour la communication entre processus sur la même machine). En pratique, AF_INET est couramment utilisé.
Type : Il peut s'agir de SOCK_STREAM (socket de flux, principalement utilisée pour le protocole TCP) ou SOCK_DGRAM (socket Datagram, utilisant principalement le protocole UDP).

3. Lier les informations locales (lier)

t.bind(("",5678))   #参数为一个含有两位元素的元组,第一个元素为本机ip,默认自动分配;第二个元素为端口号。

4. Utilisez socket pour recevoir / envoyer des données (recvfrom / sendto)

# 1.发送数据
data = ""   # 需要发送的数据
t.sendto(data.encode("转码"),("ip",port))   # 两个参数:参数1为传输数据,参数2为元组("目标ip",目标端口)

# 2.接收数据
recv _data, dest_ip_and_port = t.recvfrom(1024)   # 返回数据:数据内容,对方的(ip和端口号)

Fermer la prise (fermer)

t.close()  

Suivez-moi et amusez-vous avec python!

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_45807032/article/details/105139292
conseillé
Classement