S'inscrire au registrar.
Avant d'appeler ou d'être appelé, un UA doit dire au monde où il se trouve. Cette annonce s'appelle REGISTER. Elle se renouvelle, s'authentifie et se révoque.
Le premier REGISTER.
Linphone vient de démarrer. Il envoie sa première requête au registrar ippi. Aucune authentification au premier essai — c'est normal, on attend le défi.
REGISTER sip:sip.ippi.com SIP/2.0 Via: SIP/2.0/UDP 192.168.1.20:5060;branch=z9hG4bK-913f Max-Forwards: 70 From: <sip:votre_login@sip.ippi.com>;tag=88ab To: <sip:votre_login@sip.ippi.com> Call-ID: ee7d-c8f1@192.168.1.20 CSeq: 1 REGISTER Contact: <sip:votre_login@192.168.1.20:5060>;expires=3600 User-Agent: Linphone/5.3.0 Content-Length: 0
Trois détails importants. Le To est identique au From : dans un REGISTER, on s'annonce soi-même. Le Contact contient l'adresse IP locale du poste — c'est ce que le registrar doit retenir pour acheminer les appels entrants. Et expires=3600 dit : gardez cette information pour 60 minutes, je reviendrai.
Le défi 401.
Le registrar ippi répond :
SIP/2.0 401 Unauthorized Via: SIP/2.0/UDP 192.168.1.20:5060;branch=z9hG4bK-913f From: <sip:votre_login@sip.ippi.com>;tag=88ab To: <sip:votre_login@sip.ippi.com>;tag=srv-42 Call-ID: ee7d-c8f1@192.168.1.20 CSeq: 1 REGISTER WWW-Authenticate: Digest realm="sip.ippi.com", nonce="3a7f5c8b9e4d2", algorithm=MD5, qop="auth"
Trois pièces dans le défi : le realm (zone d'authentification, ici sip.ippi.com), le nonce (valeur aléatoire à usage unique, pour empêcher la rejeu), et l'algorithme (MD5 par défaut, parfois SHA-256 sur les nouveaux opérateurs).
Le digest calculé.
Linphone réessaie. Cette fois avec un en-tête Authorization qui prouve qu'il connaît le mot de passe — sans jamais l'envoyer en clair.
REGISTER sip:sip.ippi.com SIP/2.0 Via: SIP/2.0/UDP 192.168.1.20:5060;branch=z9hG4bK-a814 From: <sip:votre_login@sip.ippi.com>;tag=88ab To: <sip:votre_login@sip.ippi.com> Call-ID: ee7d-c8f1@192.168.1.20 CSeq: 2 REGISTER Authorization: Digest username="votre_login", realm="sip.ippi.com", nonce="3a7f5c8b9e4d2", uri="sip:sip.ippi.com", response="9ce3b4a2...", algorithm=MD5, cnonce="0a4f...", nc=00000001, qop=auth Contact: <sip:votre_login@192.168.1.20:5060>;expires=3600
Le calcul du response :
HA1 = MD5(username : realm : password)
HA2 = MD5(method : uri)
response = MD5(HA1 : nonce : nc : cnonce : qop : HA2)
Si le registrar refait le même calcul de son côté avec le mot de passe qu'il connaît, il obtient la même valeur. Sinon, c'est un 403 Forbidden et la session est rejetée.
L'acquittement.
SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.20:5060;branch=z9hG4bK-a814 From: <sip:votre_login@sip.ippi.com>;tag=88ab To: <sip:votre_login@sip.ippi.com>;tag=srv-99 Call-ID: ee7d-c8f1@192.168.1.20 CSeq: 2 REGISTER Contact: <sip:votre_login@192.168.1.20:5060>;expires=3540
Le serveur peut réduire le délai d'expiration que vous avez demandé (ici 3540 au lieu de 3600). C'est sa prérogative. Le client doit le respecter et planifier son prochain REGISTER en conséquence — typiquement à 80 % de la durée, soit 47 minutes ici.
Renouveler et révoquer.
Avant expiration, Linphone renvoie un REGISTER identique. Comme le nonce a probablement changé, on reprend la séquence 401 → digest. Sauf si le serveur supporte le nonce reuse, auquel cas le second REGISTER est validé directement.
Pour se déconnecter proprement, on envoie un REGISTER avec expires=0. Le registrar oublie l'enregistrement et l'utilisateur disparaît. Sans ce geste, l'enregistrement persiste jusqu'à expiration naturelle : les appels entrants pendant cette période sonneront dans le vide.
REGISTER sip:sip.ippi.com SIP/2.0 ... Contact: <sip:votre_login@192.168.1.20:5060>;expires=0 Expires: 0
« Le REGISTER est une promesse répétée. Je suis là, je suis encore là, je suis toujours là. Le silence vaut absence. » — note d'opérateur
Suivant : Lire les codes de réponse →