There are a few call scenarios that we expect to see when dealing with more telephone-like side of SIP:
A B | | |----INVITE (offer)---->| | | | | |< - - 180 Ringing - - -| | | | | |<----200 (answer)------| |----------ACK--------->| | | | |
A B | | |----INVITE (offer)---->| | | | | |<----180 (answer)------| | | | | |<----200 (answer')-----| |----------ACK--------->| | | | |
After receiving answer in 180 Ringing, A simply ignores SDP in subsequent responses.
Nothing special here, right? But SIP is not so simple, unfortunately. There are hairy cases because of "early sessions", "forking", "preconditions" and other reasons.
Now lets go through some hairy cases.
A B | | |----INVITE (offer)---->| | | |<----183 (answer)------| |--------PRACK--------->| |<-----200/PRACK------->| | | |<---------180----------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | | | |<---------200----------| |----------ACK--------->| | | | |
A B | | |----INVITE (offer)---->| | | | | |<----183 (answer)------| |--------PRACK--------->| |<-----200/PRACK--------| | | | | |----UPDATE (offer2)--->| |<-200/UPDATE (answer2)-| | | |<---------180----------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | |<---------200----------| |----------ACK--------->| | | | |
A B | | |----INVITE (offer)---->| | | |<----183 (answer)------| |-----PRACK(offer2)---->| |<--200/PRACK(answer2)--| | | | | |<---------180----------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | |<---------200----------| |----------ACK--------->| | | | |
A B | | |----INVITE (offer)---->| | | |<----183 (answer)------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | |<---UPDATE (offer2)----| |-200/UPDATE (answer2)->| | | |<---------180----------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | |<---------200----------| |----------ACK--------->| | | | |
A B | | |----INVITE (offer)---->| | | | | |<----183 (answer)------| |-----PRACK(offer2)---->| |<--200/PRACK(answer2)--| | | << resource reservations are done now >> | | |----UPDATE (offer3)--->| |<-200/UPDATE (answer3)-| | | |<---------180----------| |--------PRACK--------->| |<-----200/PRACK------->| | | | | |<---------200----------| |----------ACK--------->| | | | |
A B's proxy B1 B2 | | | | |----INVITE (offer)---->| | | | |-INVITE (off)->| | | |-----------INVITE (off)------->| | | | | | |<--180 (ans1)--| | |<------180 (ans1)------| | | | | | | | |<----------180 (ans2)----------| |<------180 (ans2)------| | | | | | | | | | | | |<----------200 (ans2')---------| |<------200 (ans2')-----| | | | |----CANCEL---->| | | |<--200/CANCEL--| | | |<-----487------| | | | | | |----------ACK----------------------------------------->| | | | | | | | |
Here we have two calls initially established, but the call to B1 along with "early session" is should be dropped when B2 picks up the call (and 200 OK is returned).
A C B | | | |<-------INVITE---------| | | | | | | | |------200 (offer)----->| | | |----INVITE (offer)---->| | | | | | | | |<-----200 (answer)-----| |<-----ACK (answer)-----| | | | | | |----------ACK--------->| | | |
A B | | |----INVITE (offer1)--->| | | | | |< - - 180 Ringing - - -| | | | | |<----200 (answer2)-----| |----------ACK--------->| | | | | | | | | |----INVITE (offer2)--->| | | |<----200 (answer2)-----| |----------ACK--------->| | | | |
A B | | |----INVITE (offer1)--->| | | | | |< - - 180 Ringing - - -| | | | | |<----200 (answer2)-----| |----------ACK--------->| | | | | | | | | |----INVITE (offer2)--->| | | |<---------488----------| |----------ACK--------->| | | | |