Forking in SIP

本文介绍了Session Initiation Protocol (SIP)中的Forking机制,详细解释了当用户从多个IP地址注册时,代理如何通过并行尝试不同联系地址来确定可达的联系点。文章还探讨了状态代理在这一过程中扮演的角色,以及如何处理正负响应以建立有效连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Share From: http://www.ucunleashed.com/?p=129

Forking diagram looks like a fork. Hence it is called forking


 

12-1bmp


A user can get registered from multiple IP addresses. So for a proxy, it becomes difficult to identify the correct contact where user will be reachable. Proxy will try to attempt all the available contact addresses either sequentially or in parallel depending its administrative settings. This process of trying out different contact addresses of the destination party in parallel is called ‘Forking’. Forking requires keeping track of transaction states so it is not going to work with stateless proxies. It can be performed by call stateful proxy or transaction stateful proxy.


 

 

 

12-2bmp

 

 

Consider this call flow (as in image above) wherein an INVITE has reached a proxy (stateful one), proxy consults location service for list of contact addresses for the destination party. Location service returns two contact addresses. Stateful proxy has been set to perform forking. So it will create two transactions, towards each contact address. For n contact addresses, there will be n transactions on the client side will be created.

There will some positive responses and some negative ones from various contact addresses being tried. The negative ones had been because destination not reachable, user busy i.e. any 4xx,5xx,6xx response. Negative response transactions will be terminated automatically. Proxy will have to choose one of the transaction out of several positive ones. Proxy will choose the one based on first come first serve basis.

Basically, After receiving the first 200 OK from any of destinations, the proxy will immediately issue CANCEL request towards all the pending transactions. By pending transactions I mean, the ones that have only received provisional responses. Calling party will be connected to the chosen called party by the proxy


<think>嗯,用户问的是“Type forking in programming or system context”,也就是在编程或系统上下文中的分叉类型。首先,我需要明确“forking”在这里指的是什么。在系统编程中,forking通常指的是进程分叉,即创建子进程的操作,比如Unix/Linux系统中的fork()系统调用。不过,用户提到的“Type forking”可能还有其他含义,比如版本控制中的分支(fork),或者设计模式中的某种类型。我需要先确定用户的具体需求,但根据提供的参考引用,特别是引用[2]提到了进程组和管道中的子进程,这可能和系统级的进程分叉相关。 接下来,我需要整理系统级forking的主要类型和应用场景。首先,fork()系统调用是最基础的,用于创建子进程,子进程复制父进程的地址空间。然后是写时复制(Copy-On-Write)优化,这在现代操作系统中很常见。另外,还有进程分叉的不同应用模式,比如单次分叉(如守护进程创建)、双重分叉(避免僵尸进程),以及多进程池的预分叉模型(如Apache服务器)。此外,用户提到的Type可能还涉及其他上下文,比如Git中的仓库分叉,但根据引用内容,系统级的可能性更大。 需要确保回答涵盖这些类型,并解释它们的用途和区别。同时,要引用提供的参考资料中的相关内容,比如引用[2]讨论的管道进程属于同一作业组,说明分叉后的进程管理。另外,要注意用户要求的中文回答、LaTeX格式的正确使用,以及生成相关问题。可能还需要区分系统级forking和版本控制中的forking,但根据引用,重点应放在系统层面。 在组织回答时,应先定义forking,然后分点说明不同类型,如经典fork()、COW优化、单次/双重分叉、预分叉模型,以及可能的其他应用。每个类型需要简要描述其机制和用途,并适当举例。例如,守护进程通常使用单次分叉,Apache使用预分叉模型。同时,引用[2]提到的管道进程作为同一作业组的例子,说明分叉后进程的关系。 生成的相关问题需要围绕用户可能的后续疑问,比如fork()与exec()的区别、COW机制如何节省资源、双重分叉的必要性、预分叉模型的优势,以及系统分叉与其他类型分叉的区别。这些问题应覆盖技术细节和应用场景,帮助用户深入理解。 最后,检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,确保引用标识正确添加在相关段落末尾。例如,在讨论进程组时引用[2],在提到TS标志和异常处理时引用[3],尽管引用[3]可能和分叉关系不大,但如果有相关部分需要连接的话。不过根据当前资料,引用[2]更相关,因此需合理分配引用标注。</think>### 分叉类型(Forking)及其用法 在编程和系统上下文中,**分叉(Forking)** 是一种通过复制现有进程创建新进程的机制,常用于并发执行任务或实现多进程架构。以下是主要类型和应用场景: --- #### 1. **经典进程分叉(`fork()`系统调用)** - **机制**:通过系统调用`fork()`创建子进程,子进程复制父进程的地址空间、文件描述符等资源。 $$ \text{父进程PID} \rightarrow \text{子进程PID} \quad (\text{子进程PID} = 0) $$ - **用途**: - 实现多进程并发(如Web服务器处理多个请求)[^2]。 - 结合`exec()`系列函数执行新程序(例如`fork()`后调用`execve()`运行其他可执行文件)。 --- #### 2. **写时复制(Copy-On-Write, COW)优化** - **机制**:子进程与父进程共享物理内存,仅在修改时复制数据,减少内存开销。 $$ \text{内存页共享} \rightarrow \text{写操作触发复制} $$ - **用途**:提升`fork()`性能,避免不必要的内存拷贝(现代操作系统默认支持)。 --- #### 3. **单次分叉与双重分叉(Daemon进程)** - **单次分叉**:用于创建后台守护进程(daemon),脱离终端控制。 - **双重分叉**: ```c pid_t pid = fork(); if (pid == 0) { // 第一次分叉 setsid(); // 脱离终端 pid = fork(); // 第二次分叉 if (pid != 0) exit(0); // 子进程继续执行任务 } ``` **用途**:避免僵尸进程(Zombie Process),确保进程完全脱离父进程。 --- #### 4. **预分叉模型(Pre-Forking)** - **机制**:预先创建多个子进程(进程池),处理并发任务(如Apache HTTP服务器)。 $$ \text{主进程} \rightarrow \text{N个子进程(监听同一端口)} $$ - **用途**:减少频繁分叉的开销,提升高并发场景下的响应速度。 --- #### 5. **其他上下文中的分叉** - **Git仓库分叉**:代码仓库的独立副本,用于并行开发(如GitHub的Fork功能)。 - **Shell管道分叉**: ```bash ls | grep .txt | wc -l # 每个命令在独立进程中执行,通过管道通信 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值