§ 2.2.1

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.

§ 2.2.2

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

§ 2.2.3

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.

§ 2.2.4

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.

§ 2.2.5

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
§ 2.2.6

« 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 →