为什么我们向 INVITE 发送 100 Trying,而不向 UPDATE 或 BYE 消息发送?
Why do we send 100 Trying to an INVITE, but not to UPDATE or BYE messages?
我正在尝试了解 SIP 并且有一个关于它的问题。
为什么我们需要向 INVITE 发送 100 Trying 但相同的逻辑没有用于 say BYE、UPDATE、NOTIFY 等消息?
因为被叫方可能不可用(忙、不在等)。答案是临时的,以便调用者或任何中间代理可以激活一些计时器,直到它挂断呼叫。
正如您在下面的呼叫流程中看到的,从代理到被叫方的 INVITE 是在 TRYING 之后发送的。如果 INVITE 通过多个代理或网关传播,这可能是一个漫长的过程,直到收到 RINGING 或 OK。
BYE - 一个人总是可以突然挂断电话。
UPDATE、NOTIFY、INFO 是通话中的消息,双方已经建立了会话。
来自rfc3261:
21.1.1 100 Trying
This response indicates that the request has been received by the
next-hop server and that some unspecified action is being taken on
behalf of this call (for example, a database is being consulted).
This response, like all other provisional responses, stops
retransmissions of an INVITE by a UAC. The 100 (Trying) response is
different from other provisional responses, in that it is never
forwarded upstream by a stateful proxy.
100 Trying 是临时响应,用于停止上一跳的重传。
如上所述,它不是由有状态代理 转发。
这主要用于需要时间才能完成的事务:即,何时
无法尽快发送最终答复。
因此,主要用例是初始 INVITE,到达最后一跳并获得最终答案会因长时间操作而延迟:数据库搜索、路由,当然还有振铃时间...
注意 1:当“数据库搜索和路由”足够快时,1xx 可以实现相同的目标(停止重传),但由于它们不“可靠”,它们可能会在路径上丢失。因此,INVITE 的 1xx 无法以可靠的方式替代 100 Trying。
注意2:任何请求都可以发送100 Trying。但是,SIP 要求任何非初始 INVITE 请求都应尽快得到立即的最终响应,因此如果在某个地方,您有很长的时间延迟,这意味着您的实施(或部署)可能不正确或最佳。
长话短说。您可以在合理的情况下使用或不使用 100 Trying。
未邀请:
您可以对非 INVITE 消息(非 INVITE 交易)使用 100 Trying。
但是所有这些消息都是为了尽快回复。
因此建议对所有非邀请消息快速回复。在这种情况下不建议尝试 100。如果您不能快速回复,那么您可以对非 INVITE 事务使用 100 Trying 来防止重传(减慢重传到 T2 间隔)。
此建议仅旨在减少非 INVITE 交易的网络交互。
邀请:
另外,如果您可以快速回复,则可以避免发送 100 条尝试邀请消息。 RFC 3261 说:
The server transaction MUST generate a 100 (Trying) response unless it
knows that the TU will generate a provisional or final response within
200 ms...
我正在尝试了解 SIP 并且有一个关于它的问题。 为什么我们需要向 INVITE 发送 100 Trying 但相同的逻辑没有用于 say BYE、UPDATE、NOTIFY 等消息?
因为被叫方可能不可用(忙、不在等)。答案是临时的,以便调用者或任何中间代理可以激活一些计时器,直到它挂断呼叫。 正如您在下面的呼叫流程中看到的,从代理到被叫方的 INVITE 是在 TRYING 之后发送的。如果 INVITE 通过多个代理或网关传播,这可能是一个漫长的过程,直到收到 RINGING 或 OK。
BYE - 一个人总是可以突然挂断电话。
UPDATE、NOTIFY、INFO 是通话中的消息,双方已经建立了会话。
来自rfc3261:
21.1.1 100 Trying
This response indicates that the request has been received by the
next-hop server and that some unspecified action is being taken on
behalf of this call (for example, a database is being consulted).
This response, like all other provisional responses, stops
retransmissions of an INVITE by a UAC. The 100 (Trying) response is
different from other provisional responses, in that it is never
forwarded upstream by a stateful proxy.
100 Trying 是临时响应,用于停止上一跳的重传。 如上所述,它不是由有状态代理 转发。
这主要用于需要时间才能完成的事务:即,何时 无法尽快发送最终答复。
因此,主要用例是初始 INVITE,到达最后一跳并获得最终答案会因长时间操作而延迟:数据库搜索、路由,当然还有振铃时间...
注意 1:当“数据库搜索和路由”足够快时,1xx 可以实现相同的目标(停止重传),但由于它们不“可靠”,它们可能会在路径上丢失。因此,INVITE 的 1xx 无法以可靠的方式替代 100 Trying。
注意2:任何请求都可以发送100 Trying。但是,SIP 要求任何非初始 INVITE 请求都应尽快得到立即的最终响应,因此如果在某个地方,您有很长的时间延迟,这意味着您的实施(或部署)可能不正确或最佳。
长话短说。您可以在合理的情况下使用或不使用 100 Trying。
未邀请:
您可以对非 INVITE 消息(非 INVITE 交易)使用 100 Trying。 但是所有这些消息都是为了尽快回复。
因此建议对所有非邀请消息快速回复。在这种情况下不建议尝试 100。如果您不能快速回复,那么您可以对非 INVITE 事务使用 100 Trying 来防止重传(减慢重传到 T2 间隔)。
此建议仅旨在减少非 INVITE 交易的网络交互。
邀请:
另外,如果您可以快速回复,则可以避免发送 100 条尝试邀请消息。 RFC 3261 说:
The server transaction MUST generate a 100 (Trying) response unless it knows that the TU will generate a provisional or final response within 200 ms...