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
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.
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