Una chiamata SIP di base è un handshake a tre vie INVITE/200/ACK seguito dai media e da un BYE. Il chiamante invia INVITE (con un'offerta SDP); il chiamato risponde 100 Trying, 180 Ringing, poi 200 OK (con la risposta SDP); il chiamante invia ACK; fluiscono i media RTP; e una delle parti termina la chiamata con BYE, cui si risponde con 200 OK.
Instaurazione della chiamata
La chiamata inizia con lo UAC del chiamante che invia un INVITE verso il chiamato, trasportando un'offerta SDP che descrive i media desiderati. Man mano che la richiesta attraversa i proxy, ciascuno può restituire 100 Trying per fermare le ritrasmissioni. Quando il telefono del chiamato inizia a squillare, torna indietro un 180 Ringing — è ciò che produce il ringback. Se serve early media (annunci di rete, ringback dalla rete remota), un 183 Session Progress con SDP può aprire il percorso media prima della risposta.
Risposta e handshake a tre vie
Quando il chiamato risponde, il suo UAS restituisce un 200 OK che trasporta la risposta SDP che finalizza la negoziazione dei media. Il chiamante conferma con un ACK — il terzo segmento dell'handshake INVITE — e il dialogo è ora pienamente instaurato, identificato da Call-ID più entrambi i tag. Lo scambio INVITE/200/ACK a tre vie, anziché una semplice richiesta/risposta, è ciò che rende affidabile l'instaurazione della chiamata SIP anche su UDP con perdite.
Alice (UAC) Bob (UAS)
│ INVITE (SDP offer) ─────────▶ │
│ ◀───────── 100 Trying │
│ ◀───────── 180 Ringing │ (Bob's phone rings)
│ ◀───────── 200 OK (SDP answer) │ (Bob answers)
│ ACK ─────────▶ │
│ ◀═══════ RTP media (both ways) ═▶ │ (the conversation)
│ BYE ─────────▶ │ (Alice hangs up)
│ ◀───────── 200 OK │Media e modifiche a chiamata in corso
Una volta che l'ACK completa l'instaurazione, i media RTP fluiscono direttamente tra gli endpoint (o tramite un media relay) sulle porte negoziate dall'SDP, indipendentemente dal percorso di segnalazione. Le modifiche a chiamata in corso si effettuano con un re-INVITE o un UPDATE che trasporta un nuovo SDP — è così che si realizzano hold (a=sendonly), ripresa (a=sendrecv), rinegoziazione dei codec e aggiunta del video, tutto all'interno del dialogo esistente senza abbattere la chiamata.
Terminare la chiamata — BYE
Una delle parti termina una chiamata instaurata inviando BYE, cui l'altra risponde con 200 OK; il dialogo è poi chiuso e i media si arrestano. BYE è una richiesta all'interno del dialogo, quindi trasporta il Call-ID, il tag From, il tag To instaurati e il CSeq successivo. Poiché è una normale transazione, un BYE perso viene ritrasmesso finché non è riscontrato, così entrambi i lati convergono sulla chiamata terminata.
Annullare una chiamata in corso — CANCEL
Se il chiamante rinuncia prima che il chiamato risponda — la chiamata è ancora in squillo — lo UAC invia CANCEL, non BYE, perché non è ancora arrivata alcuna risposta finale. Il chiamato smette di squillare e restituisce 487 Request Terminated per l'INVITE originale, che il chiamante riscontra con ACK. CANCEL è valido solo in questa finestra pre-risposta; una volta ricevuto un 200 OK, la chiamata è instaurata e BYE è il modo per terminarla.
| Situazione | Metodo | Risultato |
|---|---|---|
| Chiamata risposta, ora riaggancia | BYE | 200 OK; dialogo chiuso |
| Squilla ancora, il chiamante riattacca | CANCEL | 487 Request Terminated sull'INVITE |
| Il chiamato rifiuta mentre squilla | (risposta) 486/603 | Busy Here / Decline; il chiamante invia ACK |
Domande frequenti
Qual è il flusso di chiamata SIP di base?
INVITE (con offerta SDP) → 100 Trying → 180 Ringing → 200 OK (con risposta SDP) → ACK, poi fluiscono i media RTP, e la chiamata termina con BYE → 200 OK. L'handshake a tre vie INVITE/200/ACK instaura il dialogo; BYE lo abbatte.
Perché SIP usa un handshake a tre vie per l'INVITE?
L'ACK conferma che il chiamante ha ricevuto il 200 OK finale, rendendo affidabile l'instaurazione della chiamata anche su UDP con perdite. Poiché un 200 OK a un INVITE viene ritrasmesso finché non è riscontrato con ACK, lo scambio a tre vie garantisce che entrambi i lati concordino che la chiamata è attiva prima di fidarsi dei media.
Come metto in hold una chiamata SIP?
Inviate un re-INVITE (o UPDATE) all'interno del dialogo instaurato che trasporti un nuovo SDP con direzione dei media impostata su a=sendonly (e a=sendrecv per riprendere). Il dialogo e la chiamata restano attivi; cambia solo la direzione dei media, che è anche il modo in cui si eroga la musica di attesa.
Quando invio CANCEL invece di BYE?
Inviate CANCEL quando la chiamata è ancora in squillo e non è arrivata alcuna risposta finale — annulla l'INVITE in sospeso e produce un 487. Inviate BYE solo dopo che la chiamata è instaurata (è stato ricevuto un 200 OK). Usare quello sbagliato lascia i due lati non sincronizzati.
I media seguono lo stesso percorso dei messaggi SIP?
Di solito no. La segnalazione SIP può attraversare diversi proxy, ma i media RTP fluiscono su porte negoziate separatamente, di norma direttamente tra gli endpoint o attraverso un media relay o SBC dedicato — ed è per questo che la segnalazione può riuscire mentre i media (audio) falliscono indipendentemente.
Specifiche della fonte
Gli standard pubblicati su cui si basa questa pagina. Si apre in una nuova scheda.