协议栈的默认传输结构

对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点。每一个传输结点对应于一个端口,若采用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. MySQL数据类型:SQL_MODE设置不容忽视

    [IT168 技术]SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插 ...

  2. 最短路 HDU 2544

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. JAVA基础--异常

    异常的分类: 1. Throwable: 根类 1) Error:系统错误, 由java虚拟机生成并抛出, 无法处理 2) Exception: 所有异常类的父类, 可以处理的错误, 可以catch到 ...

  4. Java虚拟机中的内存分配

    java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途以及创建和销毁的时间. 栈:存放的是局部变量,包括:1.用来保存基本数据类型的值:2.保存类 ...

  5. [Big Data]从Hadoop到Spark的架构实践

    摘要:本文则主要介绍TalkingData在大数据平台建设过程中,逐渐引入Spark,并且以Hadoop YARN和Spark为基础来构建移动大数据平台的过程. 当下,Spark已经在国内得到了广泛的 ...

  6. hibernate--对象的三种状态Transient,Persistent,Detached

    Transient:刚new出来的对象 Persistent: sava或者update之后的状态 Detached: close或者clear之后 test函数: @Test public void ...

  7. Lua学习系列(四)

    lua 资源:http://www.dcc.ufrj.br/~fabiom/lua/ 第一个Lua程序 http://www.dcc.ufrj.br/~fabiom/lua/ 原文:https://w ...

  8. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客

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

  9. Quick Cocos2dx 调试问题

    最近由于忙了一段时间,忙完了之后又迷茫了这么久,然后终于开始继续Quick-x的学习之路了. 然后遇到了一个比较棘手的问题. 虽然照着官方mvc的例子敲代码,但是还是不停的报错,报错的问题下次集结成一 ...

  10. kafka第三篇--安装使用

    说明:直接下载二进制包可省略安装过程,省略很多麻烦. 1单机 安装 安装过程,参考官网: > tar xzf kafka-<VERSION>.tgz > cd kafka-&l ...