doubango(4)--SIP协议栈传输层的启动
协议栈的默认传输结构
对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点。每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的可靠交换;若采用UDP进行sip信令的交换,则需要由应用程序维护一个定时器,以防数据包丢失的时候用于重传。
Doubango里一个协议栈对应于一个tsip_stack_t实例,而这样一个实例又拥有有三个层次,从上到下依次为:
事物层,对话层,传输层。
各种关系如下图所示:
在实际中,在协议栈启动的时候,会首先生成一个默认的传输实例,并挂接到传输层的transports队列中,完成该工作的函数是:
- tsip_transport_layer_add(tsip_transport_layer_t* self,
- const char* local_host,
- tnet_port_t local_port,
- tnet_socket_type_ttype,
- const char* description);
在创建默认传输实例时,各个形参对应的实参为:
- l tsip_transport_layer_t *self------传输层实例:stack->layer_transport
- l const char* local_host--------------服务器主机IP: stack->network.local_ip,
- l tnet_port_t local_port------本机绑定端口,若不指定一般为0,并由stack->network.local_port返回记录
- l tnet_socket_type_t type---------套接口类型,指定为IPV4的UDP或TCP,或者IPSEC
- l description ----------------------------指定为“siptransport”,记录到传输实例中。
Sip消息的传输载体—tsip_transport_t结构
- typedef struct tsip_transport_s
- {
- TSK_DECLARE_OBJECT;
- tsk_bool_t initialized;//指定是否已经初始化
- const tsip_stack_t*stack;//记录所属sip协议栈
- tnet_socket_type_t type;//套接口类型,tcp,udp
- struct sockaddr_storagepcscf_addr;//通用套接字地址结构,用于记录服务器端地址
- tnet_fd_t connectedFD;//套接口描述字
- tnet_transport_handle_t *net_transport;//对应一个网络的传输实例
- const char *scheme;
- const char *protocol;
- const char *via_protocol;
- const char *service; /**< NAPTRservice name */
- tsk_buffer_t *buff_stream;
- }
- tsip_transport_t;
在创建一个tsip_transport_t实例的时候,会随便创建一个tnet_transport_t实例,tsip_transpor_t与tnet_transport_t是一一对应的关系。
而tnet_transport_t对应了两个线程,一个线程成为mainthread线程,一个称为run线程。他们的作用描述如下:
Mainthread线程:在其主循环内用于从套接口缓冲区读取数据,并生成tnet_transport_event_t实例,这个实例代表到达的一个网络层消息。生成以后把它连接入tnet_transport_t的一个队列,该队列负责管理各个tnet_transport_event_t实例。
Run线程:把tnet_transport_event_t实例从上所述队列中出队列,通过回调传入tsip_transpor_t的处理函数,对于UDP和TCP对应的回调函数分别是,
tsip_transport_layer_dgram_cb(…)和tsip_transport_layer_stream_cb(…)
这两个函数是在启动第一个默认传输实例tsip_transport_t实例时记录到tnet_transport_t的callback字段的,callback是一个函数指针,tnet_transport_t用它来把消息回传给tsip_transport_t进行处理。
doubango(4)--SIP协议栈传输层的启动的更多相关文章
- doubango(5)--SIP协议栈传输层的启动
SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...
- Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider
目录 一. 概述 二. 主要变量 三. 主要方法 四. 在Sipdroid中的应用 一. 概述 在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroi ...
- [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
如题,以下是一份简单的快速调研. TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理t ...
- 实验:传输层:UDP协议 学习笔记
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...
- 传输层:UDP 协议
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...
- doubango(2)--底层协议栈结构分析
tsip_stack_handle_t 实例 1. tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...
- Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)
catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...
- doubango(1)--从协议栈结构说起
自顶向下与自底向上 软件设计的两种方法不过于自顶向下与自底向上. 对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现.而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功 ...
- [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解 http://www.52im.net/thread-1309-1-1.html 本文来自腾讯资深研发工程师罗成的技术分享, ...
随机推荐
- Mysql数据备份与恢复命令
转载:原文地址 一.备份常用操作基本命令 1.备份命令mysqldump格式 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sq ...
- 如何在Android中添加系统服务
一,在frameworks/base/core/java/android/content/Context.java中添加 public static final String RADIO_SERVIC ...
- python自动发邮件总结及实例说明
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...
- nodejs 教程
http://www.runoob.com/nodejs/nodejs-http-server.html
- 导出WAS已部署的ear包的几种方法
可以通过下面几种办法将部署好的工程导出为一个ear包. 1.最简单的,通过was的控制台导出: 首先登录控制台,进入"企业应用程序"管理页面,选中要导出的工程,点击"导出 ...
- CodeForces 618C CodeForces 618C
第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形..然而..精度被卡死. 换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P ...
- android gridview画分割线
dongyangzhang android gridview画分割线,如图: 1.先上图: 2.具体实现代码: public class LineGridView extends GridView { ...
- Bitmap 格式
源:Bitmap 格式 参考:bitmap文件格式 Bitmap是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),DDB已经基本停用. Bit ...
- MySQL导入sql脚本中文乱码设置和常用命令
1. use database_name; 2. set names utf8; (或其他需要的编码) 3. source example.sql (sql文件存放路径) Mysql安装目录数据库目录 ...
- S3C2440的RTC解析
位二-十进制交换码(BCD)值数据给CPU.这些数据包括年.月.日.星期.时.分和秒的时间信息.RTC单元工作在外部32.768kHz晶振并且可以执行闹钟功能 实时时钟模块保存的数据是DCD码形式. ...