首页 > 其他分享 >eXosip 底层库UDP心跳包发送问题分析

eXosip 底层库UDP心跳包发送问题分析

时间:2022-10-27 16:07:17浏览次数:51  
标签:__ UDP reserved OSIP jr NULL eXosip 底层

场景

     调用eXosip库跟国标下级进行交互的时候,抓包发现,INVITE请求,前面是添加了jaK.字符串,导致对方解析异常,目前暂时不清楚对方是如何解析的。通过追踪源码,发现是底层做了一个UDP心跳保活的机制,实际上没有这个必要,注释屏蔽掉

jaK.INVITE sip:[email protected]:5061 SIP/2.0
Via: SIP/2.0/UDP 11.11.54.174:5060;rport;branch=z9hG4bK1153031278
From: <sip:[email protected]:5060>;tag=364366442
To: <sip:[email protected]:5061>
Call-ID: 328977807
CSeq: 20 INVITE
Contact: <sip:[email protected]:5060>
Content-Type: application/sdp
Max-Forwards: 70
User-Agent: eXosip/4.1.0
Subject: 13010462001310110752:0-1,44010000008100000089:1
Supported: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Length: 244

v=0
o=13010600002000110003 0 0 IN IP4 11.11.54.174
s=Play
c=IN IP4 11.11.54.174
t=0 0
m=video 36332 TCP/RTP/AVP 96 97 98
a=recvonly
a=setup:active
a=connection:new
a=rtpmap:96 PS/90000
a=rtpmap:97 MPEG4/90000
a=rtpmap:98 H264/90000
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 11.11.54.174:5060;branch=z9hG4bK1153031278;rport=5060
Call-ID: 328977807
From: <sip:[email protected]:5060>;tag=364366442
To: <sip:[email protected]:5061>
CSeq: 20 INVITE
Content-Length: 0

SIP/2.0 400 Bad Request
Via: SIP/2.0/UDP 11.11.54.174:5060;branch=z9hG4bK1153031278
Call-ID: 328977807
From: <sip:[email protected]:5060>;tag=364366442
To: <sip:[email protected]:5061>;tag=b6f9298b91c94fcda50b7d93d90c7eac-1666774978452
CSeq: 20 INVITE
Max-Forwards: 70
Contact: <sip:[email protected]:5061>
Content-Length: 0

代码剖析

libeXosip2-4.1.0

static int
udp_tl_keepalive (struct eXosip_t *excontext)
{
struct eXtludp *reserved = (struct eXtludp *) excontext->eXtludp_reserved;
char buf[4] = "jaK";
eXosip_reg_t *jr;

if (reserved == NULL) {
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "wrong state: create transport layer first\n"));
return OSIP_WRONG_STATE;
}

if (excontext->keep_alive <= 0) {
return 0;
}

if (reserved->udp_socket <= 0)
return OSIP_UNDEFINED_ERROR;

for (jr = excontext->j_reg; jr != NULL; jr = jr->next) {
if (jr->len > 0) {
if (sendto (reserved->udp_socket, (const void *) buf, 4, 0, (struct sockaddr *) &(jr->addr), jr->len) > 0) {
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: Keep Alive sent on UDP!\n"));
}
}
}
return OSIP_SUCCESS;
}

libexosip2-5.3.0

static int udp_tl_keepalive(struct eXosip_t *excontext) {
struct eXtludp *reserved = (struct eXtludp *) excontext->eXtludp_reserved;
eXosip_reg_t *jr;

if (reserved == NULL) {
OSIP_TRACE(osip_trace(__FILE__, __LINE__, OSIP_ERROR, NULL, "[eXosip] [UDP] wrong state: create transport layer first\n"));
return OSIP_WRONG_STATE;
}

if (excontext->ka_interval <= 0) {
return 0;
}

if (reserved->udp_socket < 0)
return OSIP_UNDEFINED_ERROR;

for (jr = excontext->j_reg; jr != NULL; jr = jr->next) {
if (jr->stun_len > 0) {
int idx;

jr->stun_binding.type = htons(0x0001); // STUN_METHOD_BINDING|STUN_REQUEST
jr->stun_binding.length = htons(0);
jr->stun_binding.magic_cookie = htonl(0x2112A442);

for (idx = 0; idx < 12; idx = idx + 4) {
/* assert(i+3<16); */
int r = osip_build_random_number();
jr->stun_binding.tr_id[idx + 0] = r >> 0;
jr->stun_binding.tr_id[idx + 1] = r >> 8;
jr->stun_binding.tr_id[idx + 2] = r >> 16;
jr->stun_binding.tr_id[idx + 3] = r >> 24;
}

if (sendto(reserved->udp_socket, (const void *) &jr->stun_binding, sizeof(jr->stun_binding), 0, (struct sockaddr *) &(jr->stun_addr), jr->stun_len) > 0) {
OSIP_TRACE(osip_trace(__FILE__, __LINE__, OSIP_INFO1, NULL, "[eXosip] [UDP] [keepalive] STUN sent on UDP\n"));
jr->ping_rfc5626 = osip_getsystemtime(NULL) + 9;
} else {
char eb[ERRBSIZ];
OSIP_TRACE(osip_trace(__FILE__, __LINE__, OSIP_INFO1, NULL, "[eXosip] [UDP] [keepalive] failure %s\n", _ex_strerror(ex_errno, eb, ERRBSIZ)));
}
}
}

return OSIP_SUCCESS;
}

问题解决

      屏蔽掉发送代码

static int
udp_tl_keepalive (struct eXosip_t *excontext)
{
struct eXtludp *reserved = (struct eXtludp *) excontext->eXtludp_reserved;
char buf[4] = "jaK";
eXosip_reg_t *jr;

if (reserved == NULL) {
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "wrong state: create transport layer first\n"));
return OSIP_WRONG_STATE;
}

if (excontext->keep_alive <= 0) {
return 0;
}

if (reserved->udp_socket <= 0)
return OSIP_UNDEFINED_ERROR;
/*
for (jr = excontext->j_reg; jr != NULL; jr = jr->next) {
if (jr->len > 0) {
if (sendto (reserved->udp_socket, (const void *) buf, 4, 0, (struct sockaddr *) &(jr->addr), jr->len) > 0) {
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: Keep Alive sent on UDP!\n"));
}
}
}
*/
return OSIP_SUCCESS;
}

标签:__,UDP,reserved,OSIP,jr,NULL,eXosip,底层
From: https://blog.51cto.com/fengyuzaitu/5801368

相关文章

  • TCP与UDP的区别
    引言网络协议是每个前端工程师都必须要掌握的知识,TCP/IP中有两个具有代表性的传输层协议,分别是TCP和UDP,本文将介绍下这两者以及它们之间的区别。一、TCP/IP网络模型......
  • JAVA---Set集合底层源码分析
    1.Set集合介绍      常用方法,添加,删除和遍历 Set接口对象不能使用索引获取,他是无序的,没有索引。set集合无序,所以没有修改和查看某个元素,因为某个位置上是......
  • JUC中的AQS底层详细超详解
    摘要:当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒?本文分享自华为云社区《JUC中的AQS底层详......
  • JAVA--LinkedList底层双链表添加元素超详细
     集合里面存储的都是对象    添加第一个元素    添加第二个元素    依次往后添加对象/元素。   first指向linkedList集合里存储的第......
  • socket底层实现
    网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;传输......
  • ArrayList集合底层原理
    (1)利用空参创建的集合,在底层创建一个默认长度为0的数组;(2)添加第1个元素时,底层创建一个新的长度为10的数组;(3)存满时,会扩容1.5倍;(4)如果一次添加多个数据,1.5倍还放不下,则新创建......
  • 传输层之UDP与TCP的首部
    从通信信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层。传输层位于应用层和数据链路层之间,主要有两个协议,用......
  • JAVA---ArrayList的add底层源码分析
    1.ArrayList   无参构造器使用ArrayList源码1.首先创建了一个空的elementData数组2.add()方法添加第一个元素,如果是值类型来说,往ArrayList里面添加和修改元素,都......
  • 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理
    二、Java并发机制底层实现原理这里是我的《Java并发编程的艺术》读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一、并发编程的目的与挑战有兴趣讨论的朋友可以......
  • Java程序员必会Synchronized底层原理剖析
    synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。但不可否认的是synchron......