2009-11-10 7 views
1

Je travaille sur linux. J'ai un client HTTP qui demande des données du serveur HTTP. Le client HTTP est écrit en C et le serveur HTTP est écrit en Perl. Je souhaite simuler des délais d'attente de retransmission TCP du côté client.Simulation du délai de retransmission HTTP/TCP

Je suppose que la fermeture du socket n'entraînerait pas pour le client de retransmettre les requêtes.

donc j'ai essayé le scénario suivant:

  1. Quittez le serveur dès qu'il reçoit la demande HTTP GET. Cependant, j'ai remarqué qu'une fois l'application terminée, le socket est toujours fermé gracieusement. Je vois que le serveur initie les messages FIN.ACK vers le client même si l'application n'a pas appelé "close" sur le socket. J'ai remarqué ce comportement sur un serveur TCP simple et un client écrit en programme C aussi.

  2. Le serveur n'envoie aucune réponse à la requête GET du client. Dans ce cas, je remarque qu'il y a toujours FIN, ACK envoyé par le serveur. Il semble que dans ces cas, le système d'exploitation (linux) prend soin de fermer le socket avec le pair. Est-il possible de supprimer ce comportement (à l'aide des options ioctl ou setsockopt) ou de toute autre manière pour simuler les délais d'attente de retransmission TCP.

Répondre

1

Vous pouvez essayer de définir des règles de pare-feu qui bloquent les paquets allant du serveur au client, ce qui entraînerait le client de re-transmettre les quêtes. Sous Linux, cela serait probablement fait en utilisant iptables, mais différentes distributions ont différentes méthodes pour le contrôler.

+0

Merci pour votre réponse. iptables pourrait fonctionner. La seule chose que je devrais garder à l'esprit serait de bloquer les paquets sortants après l'établissement de la connexion TCP (sinon j'obtiendrais des échecs de configuration de la connexion TCP). –

+0

Vous pourriez probablement juste bloquer des paquets avec l'ensemble d'indicateurs PSH (push), je crois que c'est l'indicateur qui indique que les données sont envoyées. Si je me souviens bien, la connexion de connexion est SYN, SYN + ACK, ACK, donc la connexion serait toujours ouverte. – qid

1

Ce problème a été discuté précédemment here

Questions connexes