This page has been robot translated, sorry for typos if any. Original content here.

Protocole HTTP

Pour la source, découvrons nous-mêmes ce qu'est le protocole commun. Le protocole est un certain ensemble de règles de signes clés également, destinés à la communication des appareils entre eux. Il est nécessaire pour que les ordinateurs ou leurs éléments puissent être compris de manière unique par l'ami d'un copain.

Protocole - le parler des ordinateurs dans le réseau.

En fait, n'importe quel ensemble de commandes peut être appelé un protocole, mais en pratique le concept du protocole est appliqué uniquement aux protocoles dits réseau - les langages de communication des ordinateurs sur le réseau. Chaque protocole a un but spécifique et est soutenu par un logiciel spécialisé.

URL, adresse IP, adresses DNS, domaines

L'URL (Uniform Resource Locator) est donc l' itinéraire complet du document . URL est l'adresse sur laquelle il est permis de trouver uniquement le document (fichier) sur Internet. Cette ligne que vous tapez dans la boîte "adresse" de votre navigateur mange également l'URL du document.

L'URL peut avoir un aspect assez sophistiqué, également de différentes parties. Pour commencer, considérez l'URL la plus simple:

Cette URL contient trois éléments constitutifs: le nom de l'hôte où se trouve le document, le nom du protocole utilisé pour transmettre ce document, ainsi que le nom réel de l'acte lui-même (nom de fichier plus extension). La base (et le seul partage obligatoire pour le protocole http) de l'adresse est le nom d'hôte. Il détermine la machine sur laquelle se trouve l'acte (sur le réseau, les ordinateurs individuels sont appelés hôtes ). Chaque ordinateur sur le réseau est un hôte, a également un nom unique (dans ce réseau). Dans l'exemple, rambler.ru est le nom de l'ordinateur sur lequel nous voulons trouver le document.

Les noms d'hôtes peuvent être spécifiés de deux manières: en utilisant le DNS en utilisant également une adresse IP. L'adresse IP est composée de quatre nombres séparés par une période. Chaque nombre peut exister dans la plage de 0 à 255. Par exemple, 192.168.2.1 .

Cependant, dans la pratique, il est incommode d'utiliser des adresses IP, car les numéros sont difficiles à retenir. Par conséquent, le système de noms de domaine (DNS) a été introduit, dans lequel chaque adresse IP est mise dans une relation sous la forme d'un nom composé de lettres ou de chiffres. Ainsi, par exemple dans l'exemple ci-dessus, le nom DNS était rambler.ru , il correspond également à l'adresse IP 217.73.192.109 .

Il convient de noter que des adresses IP différentes correspondent toujours à des noms DNS différents, mais les mêmes adresses IP peuvent correspondre à des noms DNS différents. Par exemple, des noms DNS différents comme www.rambler.ru et rambler.ru ont aussi une adresse IP blah blah. Les adresses URL sont autorisées à utiliser à la fois les noms DNS et les adresses IP. Par conséquent, deux adresses URL http://rambler.ru/index.html sont également http://217.73.192.109/index.html équivalent. Certaines façons de spécifier une adresse IP sont décrites ici http://www.xakep.ru/post/11980/default.htm .

Notez également qu'en principe, l'hôte n'a pas besoin de posséder un nom de domaine. Autrement dit, certains hôtes sont autorisés à accéder uniquement à l'adresse IP.

Vous avez probablement déjà fait attention au fait que tout nom DNS se compose de mots séparés séparés par des points. Chaque nom fait individuellement référence au domaine auquel appartient l'hôte. L'ensemble du système DNS est construit sur une base hiérarchique. Tous les domaines du 1er niveau (com, org, ru, etc.) entrent dans le domaine racine de niveau 0 (qui n'est généralement pas écrit dans le DNS car il est implicite par défaut). Les domaines d'un niveau différent (par exemple rambler, mail ou kiev) entrent dans les domaines de niveau principal, etc. Les domaines dans le DNS sont écrits de droite à gauche, afin d'augmenter le niveau.

Notons deux caractéristiques importantes: 1. Le domaine est purement unité administrative ne représente en aucun cas un hôte. 2. L'adresse IP ne dépend en aucun cas du domaine dans lequel se trouve l'hôte.

Ainsi, le système de domaine est introduit simplement pour classer les sites selon des caractéristiques géographiques ou objectives, et n'a pas non plus de relation avec le dispositif physique d'Internet.

Dans l'URL d'exemple d'URL, nous définissons explicitement le nom du fichier index.html qui nous intéresse, mais il existe un document par défaut sur chaque site. Comme la position possède le nom index.html ou default.html est également dans le dossier racine du site. Si nous entrons l'URL du site sans spécifier le nom du fichier, nous ouvrirons automatiquement le document par défaut. Ainsi l'adresse http://crackchat.h1.ru est équivalente à l'adresse http://crackchat.h1.ru/index.html . De même, bla bla car il y a un fichier par défaut, il y a aussi un dossier par défaut. Dans la plupart des serveurs, le dossier par défaut des documents HTTP est le nom WWW .

Après DNS, l'adresse URL est suivie du nom de l'acte auquel nous faisons référence. Il est supposé que ce fichier est dans le dossier racine. Si bla bla n'est pas le cas, nous pouvons spécifier la route remplie à l'acte, en listant les sous-dossiers via une barre oblique directe:

Dans cet exemple, nous accédons au fichier dans le dossier cgi-bin / perl / . Ce chemin est relatif au dossier racine. Ainsi, par exemple, si le chemin vers le dossier racine est f: / www , alors dans notre exemple, nous nous référons au fichier f: /www/cgi-bin/perl/search.pl . Dans ce cas, il est fier de considérer ce qui suit: puisque la plupart des serveurs Web sont construits sur la base de systèmes de type UNIX, lorsque vous spécifiez l'itinéraire vers le fichier, vous devez prendre en compte la différence des lettres minuscules. Donc, si nous accédions au fichier à l'URL http://rambler.ru/CGI-BIN/perl/Search.pl , le serveur ne trouverait pas un tel fichier. La différence des lettres minuscules impressionnantes ne provient que de la route vers le fichier, DNS est insensible à la casse (c'est équivalent à manger rambler.ru aussi RAMBLER.RU ).

Comme déjà noté, DNS correspond à une adresse IP strictement définie, mais cela ne signifie pas que le nom DNS est équivalent à l'hôte que nous adressons. Souvent, l'hôte lui-même possède des domaines de niveaux plus profonds en lui-même. Par exemple, le site h1.ru est un hôte dans un domaine d'un autre niveau, mais il contient lui-même des domaines de troisième niveau, par exemple, crackchat.h1.ru ou crosswords.h1.ru . Par conséquent, ces paires de sites appartiennent au même hôte et ont également la même adresse IP! Physiquement, dans ce cas, les domaines de troisième niveau ressemblent à des dossiers sur le disque hôte h1.ru , aussi l'accès à ceux-ci pourrait être fait par exemple comme ceci: h1.ru/crackchat/ aussi h1.ru/crosswords/ . L'outil d'accès (via un domaine de troisième niveau ou via un chemin de disque) est déterminé par les paramètres du serveur.

Le dossier racine est considéré comme un domaine, et donc la plupart des URL sont autorisés à spécifier dans les formats suivants: comme avec le domaine www (par exemple, www.crackchat.h1.ru ), ou sans ( crackchat.h1.ru ) - dans ce cas, le serveur est de toute façon vous dirige automatiquement vers le dossier www, car il est accepté par défaut.

Protocoles, ports, protocole CGI

Comme nous l'avons vu, l'adresse URL se compose de trois éléments principaux: le nom DNS, l'itinéraire du fichier et le nom du protocole. Si la première paire de l'élément vous permet de localiser le document, le protocole détermine comment accéder au document. En d'autres termes, à quel moment le client essaie d'obtenir le document, il est obligé de dire au serveur comment il (le serveur) est forcé de lui transférer cet acte (le client). Il existe de nombreux protocoles de transfert de données sur le réseau, parmi lesquels le protocole HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol), mailto (préfixe de la famille du protocole de messagerie), fichier (protocole d'accès au fichier) ou dossiers). Le type de protocole détermine quel programme sera capable de traiter les données dans le format de ce protocole. Internet Explorer peut donc fonctionner avec les protocoles http , file ftp , mais ne peut pas fonctionner avec le protocole mailto . Par conséquent, si vous tapez dans votre navigateur, dans la barre d'adresse de mailto: microsoft.com , un programme de messagerie spécial démarrera et pourra fonctionner avec ce protocole (par exemple, Outlook Express ou The Bat!). Le nom du protocole est indiqué par le plus important dans l'URL, et doit se terminer par un deux-points. Le registre n'a pas d'importance.

Parmi les protocoles il y a très bizarre par exemple res ou sur le protocole (pour l'intérêt vous pouvez taper dans la barre d'adresse du navigateur l'adresse sur: <a href="mailto:bill@microsoft.com"> envoyer des salutations à Bill </a> voir aussi ce qui se passera :) . Un autre protocole divertissant est ldap (essayez par exemple ldap: //microsoft.com ).

Comme un protocole pour l'URL ne peut en aucun cas agir sur tous les protocoles. Ainsi, les protocoles à propos de ou javascript n'ont rien à voir avec la route de document complète, donc les "adresses" avec ces protocoles ne sont pas des adresses URL.

Le préfixe de protocole spécifie le client dans quelle "langue" communiquera avec le serveur. Et le client sait à l'avance quel programme doit effectuer cette communication, ce qui est impossible à dire sur le serveur. Pour que le serveur "parle" avec nous dans le langage de protocole requis, il (le serveur) est forcé d'exécuter un programme approprié qui comprendra ce protocole. Les ports sont utilisés pour résoudre ce problème. Donc, si le nom DNS ou l'adresse IP détermine la machine à laquelle nous adressons, alors le port détermine le programme auquel nous adressons sur cet hôte. Les ports sont désignés par un nombre entier compris entre 0 et 65535.

Chaque port se voit attribuer un port par défaut par lequel le programme serveur attendra les demandes des clients. Par exemple, si le serveur prend en charge le protocole http , le programme serveur correspondant (par exemple, Apache) attendra les demandes client sur le port 80 (ce port est accepté par défaut pour le protocole http ). Si cet hôte blast prend en charge le même protocole ftp , un autre programme serveur attendra les demandes sur le port 21 (ce port est réservé au protocole ftp ).

Le port auquel nous nous adressons est déterminé automatiquement, en fonction du protocole que nous avons choisi dans l'URL. Mais vous pouvez également spécifier le port explicitement. Le numéro de port est indiqué par deux points après le nom DNS ou l'adresse IP:

Dans l'exemple ci-dessus, nous nous référons à un programme "accroché" sur le port 8080 , nous lui demandons également de nous donner un fichier index.html via le protocole http . S'il n'y a pas un tel programme sur le serveur (alors aucun programme ne surveillera les demandes pour le port 8080 ), alors le navigateur nous donnera un message à propos de la mauvaise URL.

Comme par défaut pour les serveurs http , le port 80 est accepté, l'adresse http://rambler.ru:80 est équivalente à l'adresse http://rambler.ru . Bien qu'en principe, les hôtes ne sont pas tenus de supporter http sur le 80ème port. Le serveur peut être configuré par exemple sur le port 3128 , également à ce moment-là pour communiquer avec cet hôte sur http, vous devez spécifier le numéro de port sans interruption: http://rambler.ru:3128

Lors de l'accès au serveur, vous devez parfois spécifier en plus de l'adresse du certificat, l'identifiant de l'utilisateur accédant au serveur (ou auquel nous accédons sur le serveur), mais le mot de passe d'accès est similaire. L'URL vous permet d'envoyer cette information. Pour ce faire, avant le DNS, le nom est précédé d'un signe @ , précédé du nom d'utilisateur:

En règle générale, le protocole http ne nécessite pas d'identification de l'utilisateur, mais pour les protocoles tels que ftp ou mailto, il est obligatoire. En plus du nom d'utilisateur, vous pouvez également spécifier un mot de passe d'accès. Le mot de passe disparaît au nom d'un deux-points. Par exemple: ftp: // masha: kasha@yahoo.com . Cette adresse URL demande le répertoire racine de l'hôte yahoo.com sur le protocole ftp pour l'utilisateur masha avec le mot de passe kasha . Mais une telle adresse mailto: //masha@mail.ru est utilisée pour accéder à la boîte aux lettres de l'utilisateur masha dans l'hôte mail.ru.

Le nom de l'utilisateur peut être similaire à celui du domaine, il comprend également différents éléments séparés par un point. Par exemple mailto: //bill.geits@microsoft.com .

Comme indiqué précédemment, l'URL est un itinéraire de document rempli. Un acte signifie n'importe quel fichier, qui peut aussi exister sous forme de texte (par exemple des fichiers html ou doc ​​ou pdf), aussi une image (jpg ou gif), aussi un programme. Le protocole http implique que si un texte ou une image est demandé dans l'URL, ils doivent être envoyés à l'utilisateur pour les afficher dans son navigateur, mais si le programme ou le script est demandé, il doit être exécuté sur le serveur. Le résultat lui-même peut exister sous forme de texte ou d'image. Le type de l'acte qui en résulte est défini dans le programme lui-même, et l'utilisateur ne sait pas à l'avance quel type de document il recevra en appelant le programme. Le programme serveur est appelé par l'URL habituelle du programme ou du script lui-même. Typiquement, le réseau utilise des scripts avec des extensions .pl .php. Cgi (les deux premiers indiquent des programmes écrits en Perl aussi PHP, cependant la dernière extension peut être appliquée à tous les modules exécutables, y compris Perl et PHP aussi EXE). Par exemple URL URL http://www.rambler.ru/cgi-bin/top.cgi nécessite d'exécuter sur l'hôte rambler.ru certaines applications top.cgi également transférer au client le résultat du travail de cette application (par exemple document ou image html).

Mais à partir des applications serveur, il serait inutile de passer des paramètres. URL cela permet. Pour transférer des paramètres vers des applications serveur (également appelées passerelles ), un format de transfert de données appelé CGI (Common Gateway Interface) est utilisé. Ce format vous permet de spécifier les données d'entrée des programmes sur une seule ligne.

Dans l'exemple, vous pouvez voir que l'URL appelle une passerelle de serveur appelée search.pl et lui transmet en entrée un paramètre avec le nom d' utilisateur, également la valeur de masha . La chaîne CGI disparaît-elle du nom du script avec le symbole de la tâche ? . Si le script doit passer plusieurs paramètres, ils sont listés séquentiellement via le symbole d'esperluette & , par exemple: http://rambler.ru/cgi-bin/perl/search.pl?user=masha&password=kasha .

Nous notons la caractéristique suivante: puisque la plupart des technologies WEB sont basées sur des formats de données texte, le problème est de distinguer les commandes des données très tôt ou tard. Par exemple, si nous voulons passer un certain paramètre d' expression avec la valeur C = A + B comme paramètre CGI: http://site.com/script.cgi?expression=C=A+B alors une telle requête sera mal comprise par CGI car l'autre le signe = sera traité comme un séparateur entre le nom du paramètre et sa valeur. Par conséquent, dans le protocole CGI (ainsi que dans n'importe quelle URL de pièce), un codage de caractères spécial appelé URL Data Format est utilisé . Cet encodage affiche les lettres de l'alphabet latin telles qu'elles sont et les caractères restants sous la forme % nnnn est le code de caractère hexadécimal. Par exemple, le caractère de guillemets " ressemblera à % 22 , mais le caractère = en % 3D . L'exception est le caractère espace qui, en plus de l'encodage standard % 20 , peut être codé de la même manière que + . .com / script.cgi? expression = C% 3DA% 2BB .

Protocole HTTP

HTTP (Hypertext Transfer Protocol) - le protocole principal utilisé sur le Web. Bien que le protocole soit appelé protocole de transfert hypertexte (ie HTML), dans la classe elle-même, le protocole HTTP peut être utilisé (et utilisé) pour transférer virtuellement n'importe quelle donnée sur le réseau. Ce transfert de texte et d'images contient également des fichiers. La popularité de HTTP, à mon avis, est liée à plusieurs facteurs: c'est l'utilisation d'un adressage URL suffisamment universel, la possibilité de transmettre des données (du client au serveur, et inversement), mais un travail similaire en mode non ligne (ie le client aussi le serveur, sans intermédiaires). Le protocole HTTP est autorisé à être appelé dual, en ce sens que dans un système client-serveur, les données peuvent se déplacer par paires, ainsi que du client vers le serveur, également depuis le serveur vers le client. Cependant, la syntaxe HTTP elle-même vise spécifiquement à transférer des données du client au serveur.

Alors, regardons l'exemple de requête HTTP le plus simple. Si dans la fenêtre d'adresse du navigateur, nous tapons l'adresse http://yandex.ru , le navigateur va déterminer l'adresse IP du serveur yandex.ru l'enverra également au 80e port une telle requête HTTP:

OBTENEZ http://yandex.ru/ HTTP / 1.0
Accepter: image / gif, image / x-xbitmap, image / jpeg, image / pjpeg, application / vnd.ms-excel, application / msword, application / vnd.ms-powerpoint, * / *
Accept-Language: en
Cookie: yandexuid = 2464977781018373381
Utilisateur-Agent: Mozilla / 4.0 (compatible, MSIE 5.5, Windows 98)
Hôte: yandex.ru
Référent: narod.ru
Proxy-Connection: Keep-Alive

La requête est transmise en clair. La toute première partie de la requête se trouve dans la première ligne: C'est le type de requête ( GET ), l'URL du document demandé ( http://yandex.ru ) est aussi une sorte de protocole HTTP ( HTTP / 1.0 ). Les paramètres de requête sont répertoriés ci-dessous. Chaque ligne correspond à un paramètre. Le nom du paramètre se déplace dans la source de la chaîne, puis le signe deux-points est également la valeur du paramètre. La signification des paramètres est intuitivement claire, mais nous décrirons les principaux: Accepter - le type de données que le navigateur peut accepter (en codage MIME). Accept-Language est la langue préférée dans laquelle le navigateur veut recevoir des données. User-Agent - le type de programme qui a envoyé la demande. Hôte - Nom d'hôte DNS (ou IP) auquel la requête est adressée. Les cookies sont des cookies (données qui ont été enregistrées par le serveur sur le disque local du client, lors de la visite de cet hôte la dernière fois). Referer - host, à partir de la page de laquelle nous envoyons la requête. Ainsi par exemple si nous sommes sur la page http://narod.ru , nous cliquons aussi sur le lien http://yandex.ru , alors la requête sera envoyée à l'hôte yandex.ru, cependant le champ de requête referer aura le nom de l'hôte narod.ru.

Le jeu de paramètres de requête n'est pas corrigé. En plus de ce qui précède, d'autres paramètres peuvent être présents.

Les plus intéressants sont les paramètres tels que referer et cookie . Ces paramètres sont principalement utilisés pour identifier l'utilisateur par le serveur.

Une requête GET peut avoir des données transmises par le client au serveur. ils sont transmis directement via l'adresse URL du protocole CGI. Par exemple, pour entrer dans le chat, le navigateur peut envoyer la requête suivante au serveur:

GET http://chat.ru/ ? Login = Algol & pass = Algol HTTP / 1.0
Accepter: image / gif, image / x-xbitmap, image / jpeg, image / pjpeg, application / vnd.ms-excel, application / msword, application / vnd.ms-powerpoint, * / *
Accept-Language: en
Cookie: yandexuid = 2464977781018373381
Utilisateur-Agent: Mozilla / 4.0 (compatible, MSIE 5.5, Windows 98)
Hôte: yandex.ru
Référent: narod.ru
Proxy-Connection: Keep-Alive

Comme nous voyons la chaîne de requête contient le login aussi le mot de passe de l'utilisateur a traversé la chaîne URL. Ce type de transfert de données vers le serveur est pratique, mais il a des limites de capacité. Des tableaux de données extrêmement impressionnants ne peuvent pas être transmis via l'URL. À ces fins, il existe un autre type de requête: la requête POST . La requête POST est très similaire à GET , la seule différence étant que les données de la requête POST sont transmises séparément de l'en-tête de la demande elle-même. Ainsi, l'exemple ci-dessus dans la version POST a la forme suivante:

POST http://chat.ru/ HTTP / 1.0
Accepter: image / gif, image / x-xbitmap, image / jpeg, image / pjpeg, application / vnd.ms-excel, application / msword, application / vnd.ms-powerpoint, * / *
Accept-Language: en
Cookie: yandexuid = 2464977781018373381
Utilisateur-Agent: Mozilla / 4.0 (compatible, MSIE 5.5, Windows 98)
Hôte: yandex.ru
Référent: narod.ru
Proxy-Connection: Keep-Alive

connexion = Algol & pass = Algol

Comme nous observons les données sur la connexion, le mot de passe est également transmis séparément dans le corps de la demande. Le corps de la requête doit être supprimé de l'en-tête par une chaîne vide. Si le serveur rencontre une chaîne vide dans la requête POST , tout ce qui bouge plus est considéré par le corps de la requête (données à envoyer). Notez ce qui suit: le format des données dans le corps de la requête POST est arbitraire. Malgré le fait que le format CGI le plus couramment utilisé, il est facultatif. En plus de POST, la requête ne nécessite pas la présence d'un corps de requête, elle peut également transmettre des données de manière similaire via une URL.

En plus du format CGI, parfois pour transmettre des quantités impressionnantes d'informations (par exemple, les fichiers) utilisent le soi-disant. format multipart :

POST http://photo.bigmir.net/form.php HTTP / 1.0
Accepter: image / gif, image / x-xbitmap, image / jpeg, image / pjpeg, application / vnd.ms-excel, application / msword, application / vnd.ms-powerpoint, * / *
Referer: http://photo.bigmir.net/form.php
Accept-Language: en
Content-Type: multipart / forme-données; limite = --------------------------- 7d20345dc
Accept-Encoding: gzip, dégonfler
Utilisateur-Agent: Mozilla / 4.0 (compatible, MSIE 5.01, Windows 98)
Hôte: photo.bigmir.net
Proxy-Connection: Keep-Alive
Pragma: pas de cache
Cookie: Ukrainien = 2; BSX_TestCookie = Oui; rich_ad = 1; b = 1

----------------------------- 7d20345dc
Content-Disposition: données de formulaire; nom = "id"

254353
----------------------------- 7d20345dc
Content-Disposition: données de formulaire; nom = "d"

22
----------------------------- 7d20345dc
Content-Disposition: données de formulaire; name = "login"

Algol
----------------------------- 7d20345dc
Content-Disposition: données de formulaire; nom = "passw"

Algol
----------------------------- 7d20345dc
Content-Disposition: données de formulaire; name = "email"

tps99@mail.ru
----------------------------- 7d20345dc
Content-Disposition: données de formulaire; name = "soumettre"

Télécharger
----------------------------- 7d20345dc--

Prenons soin de la ligne d'en - tête Content-Type: multipart / form-data; limite = --------------------------- 7d20345dc . Ce paramètre exprime au serveur que le client transmet les données dans le format multipart avec le limiteur --------------------------- 7d20345dc . Le limiteur est généré par le client de manière aléatoire et est également nécessaire pour que l'argent puisse séparer les différents éléments envoyés dans le corps de la requête. Comme vous pouvez le voir, le corps contient plusieurs éléments qui sont transmis au format ASCII (et non pas en Unicode si nécessaire pour CGI ) sont également séparés par la ligne qui a été spécifiée dans le paramètre Content-Type . Chaque partage contient des informations sur le type de données transférées et le nom de cette partie. Le confort du format multipart est que les données transmises ont une valeur illimitée et ne nécessitent aucun codage préalable.

En plus des requêtes GET , il existe également d'autres POST , tels que TRACE , PUT . Mais ils sont rarement utilisés, et nous ne nous attarderons pas sur eux.

Une fois de plus je ferai attention au fait que TOUTES les informations transmises par le client au serveur sont contenues dans l'entête et le corps de la requête. D'une autre manière, le serveur ne peut en aucune façon recevoir d'informations du client via le protocole HTTP.

D'autre part, le serveur peut également donner des informations au client uniquement dans l'objection à la demande. Tout échange de données dans un protocole HTTP est initié seulement par le client, le serveur ne peut rien transmettre "juste comme ça", cependant, seulement à la demande du client.

Ainsi, si nous avons la possibilité de contrôler les requêtes transmises, nous contrôlons complètement les informations reçues par le serveur et le client. Cela est pratique, car pour modifier les données transmises / demandées, il n'est pas nécessaire de changer les fichiers de pages HTML, de changer les cookies, etc., il suffit d'apporter des modifications à la requête HTTP et de l'envoyer au serveur. Cependant, ceci est une autre chronique :) ...