协议栈的默认传输结构

对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点。每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的可靠交换;若采用UDP进行sip信令的交换,则需要由应用程序维护一个定时器,以防数据包丢失的时候用于重传。

Doubango里一个协议栈对应于一个tsip_stack_t实例,而这样一个实例又拥有有三个层次,从上到下依次为:

事物层,对话层,传输层。

各种关系如下图所示:

在实际中,在协议栈启动的时候,会首先生成一个默认的传输实例,并挂接到传输层的transports队列中,完成该工作的函数是:

  1. tsip_transport_layer_add(tsip_transport_layer_t* self,
  2. const char* local_host,
  3. tnet_port_t local_port,
  4. tnet_socket_type_ttype,
  5. const char* description);

在创建默认传输实例时,各个形参对应的实参为:

  1. l  tsip_transport_layer_t *self------传输层实例:stack->layer_transport
  2. l  const char*  local_host--------------服务器主机IP: stack->network.local_ip,
  3. l  tnet_port_t local_port------本机绑定端口,若不指定一般为0,并由stack->network.local_port返回记录
  4. l  tnet_socket_type_t  type---------套接口类型,指定为IPV4的UDP或TCP,或者IPSEC
  5. l  description ----------------------------指定为“siptransport”,记录到传输实例中。

Sip消息的传输载体—tsip_transport_t结构

  1. typedef struct tsip_transport_s
  2. {
  3. TSK_DECLARE_OBJECT;
  4. tsk_bool_t initialized;//指定是否已经初始化
  5. const tsip_stack_t*stack;//记录所属sip协议栈
  6. tnet_socket_type_t type;//套接口类型,tcp,udp
  7. struct sockaddr_storagepcscf_addr;//通用套接字地址结构,用于记录服务器端地址
  8. tnet_fd_t connectedFD;//套接口描述字
  9. tnet_transport_handle_t *net_transport;//对应一个网络的传输实例
  10. const char *scheme;
  11. const char *protocol;
  12. const char *via_protocol;
  13. const char *service; /**< NAPTRservice name */
  14. tsk_buffer_t *buff_stream;
  15. }
  16. 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协议栈传输层的启动的更多相关文章

  1. doubango(5)--SIP协议栈传输层的启动

    SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...

  2. Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider

    目录 一. 概述 二. 主要变量 三. 主要方法 四. 在Sipdroid中的应用 一. 概述 在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroi ...

  3. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研

    如题,以下是一份简单的快速调研. TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理t ...

  4. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

  5. 传输层:UDP 协议

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...

  6. doubango(2)--底层协议栈结构分析

    tsip_stack_handle_t 实例 1.        tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...

  7. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  8. doubango(1)--从协议栈结构说起

    自顶向下与自底向上 软件设计的两种方法不过于自顶向下与自底向上. 对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现.而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功 ...

  9. [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

    技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解    http://www.52im.net/thread-1309-1-1.html   本文来自腾讯资深研发工程师罗成的技术分享, ...

随机推荐

  1. linux安装安卓开发工具android studio

    http://www.android-studio.org/ http://android-studio.org/index.php/docs/guide 最近要接触android编程,本来想装ecl ...

  2. jQuery学习笔记—— .html(),.text()和.val()的使用

    本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我 ...

  3. ActiveMQ讯息传送机制以及ACK机制

    http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...

  4. ACM录 之 输入输出。

    —— 简单介绍一下ACM里面的输入输出... —— 主要说C++的输入输出(其实其他的我不会...). —— C++里面有输入输出流,也就是cin和cout,用起来也算是比较方便吧... —— 但是, ...

  5. [iOS]C语言技术视频-07-函数的定义

    下载地址: 链接: http://pan.baidu.com/s/1mgiWSqc 密码: 2q9k

  6. hive第一篇----简介和使用客户端

    摘要by crazyhacking:•Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.•本质是将SQL转换为MapReduce程序的映射 ...

  7. Xcode删除证书

    手动删除 xcode5 provisioning profile path: ~/Library/MobileDevice/Provisioning Profiles

  8. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  9. 51nod1138(math)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 题意:中文题诶- 思路:假设 x=a1+(a1+1)+ ...

  10. Nginx负载均衡策略

    目前nginx负载均衡支持的5种方式的分配 1. 轮询 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream backserver { server ...