Se connecter

Informatique

Programmation

Sujet : C désactiver retransmission TCP
1
Exacompta
Niveau 10
01 décembre 2021 à 15:59:20

Bonjour, je travaille actuellement en C avec les socket.
Dans mon projet, j'ai besoin de n'envoyer qu'un seul paquet TCP sans faire de retransmission si je n'arrive pas à me connecter à l'hôte.
Le problème est donc que mon socket (Windows je précise) refait 4 tentatives avant de s'arrêter.

Merci de votre aide

godrik
Niveau 21
01 décembre 2021 à 16:45:41

mmm, j'utilise pas windows, donc je n'ai pas une reponse clairer. Mais il va falloir du support de l'OS pour faire ca.
1/ Soit l'OS te permet de controller le nombre de retransmission TCP pour une socket TCP particuliere. Mais je pense pas que ca fasse paarti de l'API. (mais peut etre)
2/ Soit tu formes le paquet a la main. Tu as peut etre une API qui te permet d'ecrire directement sur le reseau et auquel cas tu eux former le paquet IP qui va bien. Dans les unix, tu peux faire ca. Quand tu cree la socket, tu passe le parametre SOCK_RAW comme type de socket. Et tu formes ton paquet TCP la main.
3/ Tu reecris un driver reseau ou charge un autre driver reseau.

html55
Niveau 1
01 décembre 2021 à 21:48:57

Salut, ce comportement est normal, le nombre de tentative est était fixé par la clé de registre TcpMaxConnectRetransmissions ( https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739819(v=ws.10)?redirectedfrom=MSDN#tcpmaxconnectretransmissions ). Cependant, ça semble déprécié depuis Windows 7 (malgré qu'un patch semble exister) :

The registry key TcpMaxConnectRetransmissions is no more supported since Windows Server 2008 / Windows Vista.

https://support.microsoft.com/en-us/topic/you-cannot-customize-some-tcp-configurations-by-using-the-netsh-command-in-windows-server-2008-r2-c1feebea-82a8-cb05-83c7-46ffb5fd9cec

Godrik à plutôt bien résumé la situation :

Soit tu trouve un workaround pour forcer Windows à utiliser une nouvelle valeur (genre cette classe WMI https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/settcpmaxdataretransmissions-method-in-class-win32-networkadapterconfiguration )

Soit en effet, tu utilise des raw sockets, cependant il y a pas mal de limitation sous Windows (https://docs.microsoft.com/en-us/windows/win32/winsock/tcp-ip-raw-sockets-2 ) mais si cela ne te bloque pas, c'est la solution idéale

Soit faire un driver, mais c'est plus compliqué et surtout il devra être signé si ton outil est amené à être partagé ( https://docs.microsoft.com/en-us/windows-hardware/drivers/install/kernel-mode-code-signing-policy--windows-vista-and-later- )

Dernière potentielle solution, tu peux astucieusement mettre en place un timeout de connexion afin de ne réaliser qu'un échange de paquet :


TcpMaxConnectRetransmissions
    Data type: uint32
    Access type: Read-only
    Qualifiers: MappingStrings ("Win32Registry|SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters|TcpMaxConnectRetransmissions")
    Number of times TCP attempts to retransmit a Connect Request before terminating the connection. The initial retransmission timeout is 3 seconds. The retransmission timeout doubles for each attempt. Default: 3, Valid Range: 0 - 0xFFFFFFFF.

Tu peux donc tenter de modifier le timeout des options de ton socket (TCP_MAXRT et depuis Windows 10 TCP_MAXRTMS)
https://github.com/nmap/nmap/issues/2113#issuecomment-683426090

N'hésite pas à nous tenir au courant :ok:

1
Sujet : C désactiver retransmission TCP
   Retour haut de page
Consulter la version web de cette page