我问你这篇保熟不?! -- 做服务端开发,不懂网络层,真的可以吗?

    • A类
  • B类、C类

  • IP地址与硬件地址

  • 地址解析协议ARP

  • IP层转发分组

  • 子网划分

    • 子网划分的背景意义
  • 什么是子网划分?

  • 子网掩码

    • 子网掩码 & IP地址 = 网络地址
  • 不划分子网,也要有子网掩码?

  • 可容纳子网数

  • 使用子网时分组的转发

  • 无分类编址:CIDR(构造超网)

    • CIDR基础知识
    • 提出背景
  • CIDR的特点

  • CIDR示例

  • CIDR的好处:

    • 常用的CIDR地址块
  • 最长前缀匹配

  • 二叉线索查找路由表

  • 再提一嘴

    • 广播地址
  • IPV6地址

    • 地址格式
  • IPV6地址简化

  • CIDR斜线表示法

我发现我掉进一个漩涡里,既想要流量,写的东西受众又不多。

其实我感觉这个专栏的东西确实是好东西,可能是我深度不够吧。


唠嗑两句·网络层


不知道,我以前也有学过网络层的东西,那时候学的还比较系统一些,用的是《TCP/IP卷一》,但是大部分精力都集中在了TCP,对于IP,真没兴趣。

直到学校开了这门课,这个老师不错,能把这门这么无聊的课上的让人想听。课依旧是无聊的,只是老师的话振聋发聩罢了。

我大学培训之后选择了服务端开发,暑期实习也是找了传输类的,毕业后也想做这方面的,以后还想往管理或架构发展,连计网都不了解,怎么弄?

老师跟我们说,你们要掂量掂量,你们毕业之后,要走IT的路,你们的位置在哪里。

另一个老师说:不要盯着眼前的饭,只有你的位置不可或缺,你才会一直有饭吃。

想明白了这些,我还是抓一个方向学下去吧,至少不要把老本都丢了呀。

做服务端开发,不懂网络层,真的可以吗?

有机会学就学呗,想那么多。


网络层简介


首先,TCP属于传输层,IP属于网络层。分清楚这个,咱再往下,不要看到最后来问我:“你为啥不讲TCP,是它不配?还是你不行?”

先打个预防针啊。

网络层只向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务。

网络在发送分组时不需要先建立连接,每一个分组独立发送,与其前后的分组无关,也就是说,网络层不提供服务质量的承诺。

所传送中的分组可能出错、丢失、重复、失序,当然也不能保证分组交付的时限。

由于传输网络不提供端到端的可靠传输服务,这就使得网络中的路由器比较简单,而且价格低廉,采用这种方式使得网络造价大大降低,运行方式灵活,能够适应多种应用。


网际协议IP


都打起十二分精神,接下来的概念很多,很有意思,同时也很绕。所以废话我就不多说了。

所谓的A类、B类、C类地址都是由两个固定长度的字段组成的,其中第一个字段是网络号,它标志主机(或路由器)所连接到的网络,一个网络号在整个互联网范围内必须是唯一的;第二个字段是主机号,它标志该主机(或路由器),这个主机号相对于网络号,也是惟一的。

两级的IP地址可以表示为:

IP地址 ::={<网络号>,<主机号>}

看图:

在这里插入图片描述


常见的三类IP地址

A类

A类地址的网络号字段占一个字节,只有七个位可供使用,可指派的网络号是126个。

本来应该是:00000000 - 01111111,但是呢,00000000这种网络字段全0的地址是个保留地址,意思是“本网络”,

网络号为127保留作为本地软件测试本主机进程之间的通信之用,网络号为127的地址根本不是一个网络地址。

A类地址的主机位是有24位,但是可分配的主机数也要减去2,因为主机号全为0的地址表示该IP地址是该主机连接到的单个网络地址,而全1表示的就是该网络上的所有主机。

B类、C类

B类可以指派的第一个网络号是128.1,不是128.0.0.0哦

B类的主机数也是减2.

C类可以指派的第一个网络号是192.0.1,可分配的最大主机数也是减2.

在这里插入图片描述


IP地址与硬件地址

在这里插入图片描述

物理地址是数据链路层和物理层使用的地址,而IP地址是网络层以及以上各层使用的地址,是一种逻辑地址(IP地址是用软件实现的,硬件地址则是固化在网卡上的ROM中,又称MAC地址)。

在发送数据的时候,数据从高层下降到底层,然后才到通信链路上传输,使用IP地址的IP数据报一旦交给了数据链路层,就要被封装成MAC帧了。MAC帧在传输的时候使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中了。

连接在通信链路上的设备在收到MAC帧时,根据MAC帧首部中的硬件地址决定收下或丢弃,只有在剥去MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。


地址解析协议ARP

Q:已知一个机器的IP地址,求其相应的硬件地址。

A:请了解一下ARP地址解析协议。

网络层使用的是IP地址,但是在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但是IP由于和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系。此外,在一个网络上可能经常会有新的主机加入进来,或撤走旧的主机。更换网络适配器也会使得主机的硬件地址改变。

每一个主机都有一个ARP高速缓存,里面有本局域网上等待个主机和路由器的IP地址到硬件地址的映射表。

当主机A要向本局域网上的主机B发送IP数据的时候,就先在其ARP高速缓存中查看有无主机B的IP地址,如果有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件写入MAC帧,然后通过局域网把改帧发往此Mac地址。

也有可能查不到主机B的IP地址的项目,这可能是主机B才刚入网,也可能是主机A刚加电,其高速缓存还是空的。这种情况下:

1)ARP进程在本局域网上广播一个ARP请求分组,内容如下:“我的IP地址是:209.0.0.5,硬件地址是00-00-C0-15-AD-18,我想知道IP地址为209.0.0.6的主机的硬件地址”。

2)在本局域网的所有主机上运行的ARP进程都收到此ARP请求。

3)主机B的IP与ARP请求分组中的IP地址一致,就收下这个ARP请求,并向主机A发送ARP响应分组,同时在这个请求分组中写上主机的硬件地址。

当主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP和硬件地址的映射。

ARP对保存在高速缓存中的每一个映射地址都设置一个保存时间,凡超过保存时间的就从高速缓存中删掉,这种思想参考redis。

注意:ARP是解决同一个局域网下的主机或路由器的IP地址和硬件地址的映射问题

那如果两个主机是在不同的局域网上呢?其实主机A也不需要知道另一个局域网上主机B的硬件地址,主机A发给主机B的数据首先要经过与主机A连接在同一局域网的路由器Ra来转发,因此主机A这时候需要把路由器Ra的IP地址解析为硬件地址,以便能够把IP数据传送到路由器Ra,然后,Ra从转发表找出来下一个路由器Rb,同时由ARP地址解析出这个Rb的硬件地址,路由器Rb在转发这个IP数据报的时候通过类似方法解析出目的主机B的硬件地址,使得IP数据最终交付给主机B。

当主机A在向主机B发送数据的时候,有可能在不久的将来,主机B也要向主机A发送数据,为了减少网络上的通信量,主机B也会将主机A的这一地址映射写入自己的ARP高速缓存。

ARP对保存在高速缓存中的每一个地址都有设置一个失效时间,这个应该不难理解吧,我写出来就是怕你们以为不写就是没有,其实是有这个机制的,容量很安全,放心。


IP层转发分组

在这里插入图片描述

第一步:当用户在主机甲上输入PING 172.168.80.8之后,主机甲中有一个网际控制报文协议ICMP(下面会介绍)。这个协议将创建一个回应请求数据包,在它的数据域中只包含有字母。

第二步:网际控制报文协议会将这个有效负荷(即刚创建的数据包)交给网际协议IP。然后这个网际协议也会创建一个数据包。在这个网际协议IP创建的数据包中, 所包含的内容要比因特网控制报文协议所创建的数据包丰富的多。当数据包到达主机乙时,这些内容就是告诉对方,应该将这个有效负荷交给网际控制报文协议来处理。

第三步:IP协议会判断目的IP地址是属于远程网络,还是在本地网络。由于根据IP地址规划规则,主机甲与主机乙属于不同的网络。此时,刚才网际协议IP所创建的数据包将会被发送到默认的网关中去。在主机甲的网络属性配置中,除了有自身的逻辑IP地址,还有默认的网关地址。网关地址就是用来不同网络之间的主机进行通信的一扇门。只有通过网关,主机甲的数据包才能够被发送到不同网络的主机乙中。

第四步:确认路由器相应接口的MAC地址。具体怎么做,上面讲过啦。

第五步:生成帧。当这个数据包和目的方的硬件地址被传递给数据链路层之后,局域网驱动器将用来提供媒体访问服务,以通过以太网进行数据传输。一个数据帧即将产生,使用一些控制信息来封装这个数据包。在这个数据帧中会包含有目的方和源方的硬件地址。以及以太网类型字段。这个以太网类型字段主要用来描述的是交付这个数据包到数据链路层的网络层协议。在这个帧的结尾,是一种被称作为帧校验序列的字段,它是装载循环冗余校验计算值的区域。也就是说,在这个帧中,主要包括目的MAC地址(对应路由器接口的MAC地址)、源MAC地址(主机甲的MAC地址)、以太网类型字段、数据包、帧校验序列五部分内容。注意,这里指的目的地址并不是主机乙的地址,而是里主机甲最近的默认网关地址。在第一次通信时,主机甲并不知道主机乙的MAC地址。一旦完成帧的封装,则这个帧将会被交付到物理层。

上面五个步骤主要都是在主机甲上完成。这五个步骤执行完毕之后,IP路由选择过过程的前期工作就算完成了。下面才是网际协议IP路由选择的步骤。

第六步:在主机甲所在的冲突域中的每台网络设备都将接收这些位并重新合并成数据帧。接收完毕后,他们会运行CRC过程并核对保存在帧校验序列字段中的内容。如果这两个值不匹配的话,则这个帧将会被丢弃。如果两个值相同(主机甲的默认网关,即紧邻主机甲的路由器接口),则网络设备会接收这个帧,并核查目的方的硬件地址,检查他们是否也匹配。如果目的方的硬件地址也是匹配的,那么路由器将会查看这个帧的以太网类型字段,以了解在网络层上采用了什么协议,然后路由器就会抽出帧中的数据包,把其余部分内容丢弃。然后把抽出来的数据包传送给以太网类型字段中列出的上层协议,如网际协议IP等等。

第七步:判断路由表项目。网际协议IP会接收这个数据包,并检查目的IP地址。在这个案例中,由于数据包中的目的地址与接收路由器所配置的任何地址都不相匹配。此时,路由器就会在自己的路由表(在路由表中,对每一条路由最主要的是以下两个信息:(目的网络地址,下一跳地址))中,查看目的IP的网络地址。在这个案例中,由于路由器同时连接着172.16.80.0的网络。所以在这个路由器的路由表中,有相关的纪录。若没有记录的话,则这个数据包会被直接丢弃。若路由器丢弃数据包的话,则会发送一个“目标地址不可达”的错误信息给主机甲。

第八步:路由器转发数据包。如果路由器的确在他的路由表中找到了相应网络的记录,则数据包就会被转发到输出接口。在本例中,就是主机乙所连接的接口。路由器会将这个数据包交换到对应接口的缓冲区内。

第九步:缓冲区中数据的处理。路由器对应接口的缓冲区需要了解目的方主机的硬件地址。因为这个数据包中已经有目的方的IP地址,所以,路由器会先检查ARP缓存表。如果主机甲的硬件地址已经被解析并保存在路由器的ARP缓冲中,则这个数据包和这个硬件地址将被传递到数据链路层以便重新生成帧。通常情况下,若路由器以前跟主机乙通信过的话,则这个IP地址与MAC地址的对应记录将会在路由器ARP缓冲表中。若缓冲过期后,则这个对应的记录将会被删除。如果在路由器的ARP缓冲表中没有相关记录的话,则路由器接口会在其连接的网络内部,发送一个ARP请求。这个ARP请求就像一个广播,我现在需要知道IP地址为172.12.80.8的MAC地址。此时。其他网络设备发现自己不是这个IP地址,就会抛弃这个包。而主机乙发现有人在问自己的MAC地址,就会进行响应。告诉路由器,我的IP地址就是这个,我的MAC地址是多少。路由器知道目的主机乙的MAC地址之后,就会把数据包连同目的方的MAC地址传递到下一层的数据链路中。

第十步:路由器会重复上面的第五步操作,生成数据帧。并传送到物理层,以一次一位的方式再发送到物理媒体上。在网络中进行传输。

在路由器上的工作也完成。通过以上的分析,我们可以看到,路由器的作用主要就是进行数据交换。把其收到的数据包根据一定的规则转发到另一个可达的接口上。路由器就好像是一个十字路口,各个数据包都根据自己所需要到达的目的地,现在合适的出口。

第十一步:主机乙会接收到这个数据帧并运行CRC过程。如果运算结果与帧校验序列中字段的内容相同,则这个帧中目的方的MAC地址将会被读取。主机乙会判断这个MAC地址是否跟自己的MAC地址相同。若相同的话,则会抽取其中的数据包,并根据以太网字段类型中指定的协议,把数据包传递给相应的协议处理。由于这个案例中,数据包中是一个回应请求。主机乙就会把这个数据包交给ICMP协议处理。ICMP协议会应答这个请求,同时把这个数据包丢弃并迅速生成一个新的有效负荷来作为回应应答。然后主机乙会利用同样的过程把数据包以及目的MAC地址(路由器对应接口的物理地址)传递到下一层,让其生成帧。在数据帧上,会带有目的MAC地址、源MAC地址、数据包、以太网字段类型、帧校验序列字段等内容发送到下一层。然后再一位位的传送到物理媒体。

第十二步:路由器再重复第六步到第十步的过程,把数据包从一个接口交换传递到另一个接口中。然后主机甲就收到一个回应信息,表示到主机乙的道路是通的。


没捋明白的好好捋一下,我们一会儿再讲,子网划分,也是个烧脑的。


在这里插入图片描述

在这里插入图片描述


子网划分


子网划分的背景意义

1、IP空间的利用率有时候比很低,毕竟你看一个A类地址能抗那么多的主机,B类也能抗不少。但是真的用了那么多了吗?

2、给每个物理网络分配一个网络号会使得路由表变太大而导致网络性能变坏。

3、两级IP不够灵活。

好吧,这既是段废话。

我就直白点讲吧,前段时间我手上有点闲钱,但是统统放在一张银行卡里,没去打理,没过多久钱就花光了,关键我还不知道是怎么花的。

后来我学聪明了,我把手上的钱做了一下分组,一部分钱用来生活开支,一部分钱用来改善生活,提升自我,一部分钱用来谈恋爱,一部分钱用来储蓄,这几部分各不相干,哪天要是生活开支的钱花完了,那就吃土呗,也不去动其他部分的钱。

这样,我每次把手伸向钱包的时候,我就知道该打开哪一层,取哪张卡。

通俗易懂吧。


什么是子网划分?

划分子网的基本思路如下:

1)一个拥有许多物理网络的单位,可以将所属的物理网络划分为若干个子网。

划分子网纯属单位内部的事情,单位以外的网络是看不见这个网络是由多少个子网组成的,因为这个单位对外仍然表现为一个网络。

2)划分子网的方法是从网络的主机号借用若干位作为子网号,当然主机位就少了相应的位数,这时候三级IP地址的表示法就是这样了:

IP地址 ::={<网络号>,<子网号>,<主机号>}

3)凡是从其他网络发送给本单位某台主机的 IP 数据,仍然是根据 IP 数据报的目的网络号找到连接在本地单位网络上的路由器,再由该路由器找到目的子网,将数据发给目的主机。


子网掩码

从IP的首部是无法看出源主机或者目的主机是否进行了子网划分,碧如:127.127.127.127,你看看有没有划分哈哈哈。

子网掩码应运而生。

看下面这张图,很经典的一张图:

在这里插入图片描述

最上面是我们前面讲的原始的两级IP地址,第二栏是我们现在在讲的三级IP地址,主机部分分为了子网号和主机号,第三栏的子网掩码有什么用呢?表示主机位分出了多少位作为子网位,从图中可以看出是拿出了八位,相应的,主机位就减少了八位。

所以得到了第四栏的“划分子网时的网络地址”。

这里要注意一下,子网位数不一定就是8,可能是1,2,3,4,5····只要在主机位可分割的范围内,都可以。


子网掩码 & IP地址 = 网络地址

知道了子网掩码和IP地址,就可以推出目的IP的网络地址,看图:

在这里插入图片描述

将IP和子网掩码进行与运算,得出网络地址。

注意,这是个特例,因为子网掩码刚好为8位,如果不是8位呢?思考一下。

想象不出来就看这张:

在这里插入图片描述

该看的看,不该看的别急。


不划分子网,也要有子网掩码?

对啊,不然呢,在想什么呢?

如果不划分子网,就用默认的子网掩码:

在这里插入图片描述

子网掩码是一个网络或一个子网的重要属性。


可容纳子网数

我们以一个C类地址为例,说明可以有多少种子网划分的方法:

在这里插入图片描述

借用位数,也就是子网位数,记为n,子网数换算公式:2^n-2。

子网位数会算吧,前面有。

为什么要减2,也不解释了吧(全0,全1)。

据说现在是可以用那两个了(因为CIDR,一会儿说),但是没什么事儿还是别用。

tips:1,2,4,8,16,32,64,128 //自己悟吧

主机数(对C类地址)2^(8-n)-2

这个知识点也是卡了我好一会儿,直到我相通,子网数不一定要是8或8的倍数啊!!!


再来张B类的图,琢磨琢磨吧:

在这里插入图片描述


使用子网时分组的转发

(1) 从收到的分组的首部提取目的IP地址D。

(2) 先用各网络的子网掩码和D逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付, 执行(3)。

(3) 若路由表中有目的地址为D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行(4)。

(4) 对路由表中的每一行,将子网掩码和D 逐位相“与”。若结果 与该行的目的网络地址匹配,则将分组传送给该行指明的下 一跳路由器;否则,执行(5)。

(5) 若路由表中有一个默认路由,则将分组传送给路由表中所指明 的默认路由器;否则,执行(6)。

(6) 报告转发分组出错。


看个题来的实在:

已知互联网和路由器R1 中的路由表。 主机H1 向H2 发送分组。 试讨论R1 收到H1 向H2 发送的分组后查找路由表的过程。

在这里插入图片描述

主机H1 要发送分组给H2,要发送的分组的目的 IP 地址:128.30.33.138。因此 H1首先检查主机 128.30.33.138 是否连接在本网络上如果是,则直接交付; 否则,就送交路由器 R1,并逐项查找路由表。主机H1 首先将本子网的子网掩码255.255.255.128与分组的IP地址128.30.33.138 逐比特相“与”(AND 操作) ,得出结果:128.30.33.128。

因此H1 必须把分组传送到路由器R1 然后逐项查找路由表。路由器R1收到分组后就用路由表中第1个项目的子网掩码和128.30.33.138 逐比特AND操作。

在这里插入图片描述

那就继续往下匹配呗:

在这里插入图片描述

是比较抽象一点哈,但是还是要理解的。


休息一下,可以先收藏再看,下面的更抽象,又要绕回二分类了。

在这里插入图片描述

在这里插入图片描述


无分类编址:CIDR(构造超网)


CIDR基础知识

提出背景

划分子网是在一定程度上缓解了IP地址越来越稀缺的问题,但是毕竟只是延缓。

为了加强这种延缓效果,RFC(一个组织)指明了使用变长子网掩码可以进一步提高IP地址资源的利用率。

在这个基础上,又进一步提出无分类编址的方法。

CIDR的特点

1)消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码。记法:IP地址::={<<网络前缀>,<<主机号>}。CIDR还使用“斜线记法”即在IP地址后面加上“/”然后写网络前缀所占的位数。

2)CIDR把网络前缀都相同的连续IP地址组成一个“CIDR地址块”,即强化路由聚合(构成超网)。

地址掩码:是一连串的1和0组成,而1的个数救赎网络前缀长度。在斜线记法中。斜线后面的数字就是地址掩码中1的个数。

构成超网:将网络前缀缩短,网络前缀越短,其地址块所包含的地址数就越多。

CIDR示例

IP地址:128.14.35.7/20 = 10000000 00001110 0010 0011 00000111

最小地址:128.14.32.0  = 10000000 00001110 0010 0000 00000000

最大地址:128.14.47.255 = 10000000 00001110 0010 1111 11111111

注:为了方便地进行路由选择,CIDR使用32位的地址编码(address mask),地址编码是一串1和1串0组成的,而1的个数就是网络前缀的长度。例如,/20地址块的地址掩码是:11111111 11111111 11110000 00000000(20个连续的1),斜线记法中,斜线后面的数字就是地址掩码中1的个数。

最大地址就是主机号全为1,最小地址就是主机位全为0,一般不使用。

CIDR的好处:

1)路由聚合有利于减少路由之间的路由选择信息交换,从而提升了整个因特网性能。

2)使用CIDR另一个好处就是可以更有效地分配IPV4的地址空间。

在使用CIDR中,在查找路由表时可能会得到不止一个匹配结果,这时应当从匹配结构中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因而路由就越具体。

使用CIDR后查找最长前缀匹配,应使用二叉线索,即将无分类编址的路由表放在一层次的数据结构中,自上而下的按层次查找。操作时应先找出每一个IP地址的唯一前缀,唯一前缀就是在表中所有的IP地址中,该前缀是唯一的。

CIDR支持路由归纳,可以将多个地址块聚合在一起,将路由表中的许多路由条目合并为更小的数目,这样减少路由器中路由表的大小,减少路由通告的时间。


常用的CIDR地址块

网络前缀小于13或大于27的都比较少用。

在这里插入图片描述

除最后几行外,CIDR地址块都包含了多个C类地址(是C类地址的2n,n是整数),这就是“构造超网”这一名称的来源。


最长前缀匹配

看题:

已知:

收到的分组的目的地址 D = 206.0.71.128

路由表中的项目:206.0.68.0/22 206.0.71.128/25

问:分组发往哪个地址?

求解思路

将子网掩码与目的地址相与,确定该目的地址是否属于该子网内部。如果两者都属于,则选择网络前缀(掩码)最长的。

求解过程

1.先用 D 和第一个下一跳地址的子网掩码相与

在基于GBT28181的SIP协议组件开发中,SIP服务端流程是非常关键的一部分。本文将介绍如何使用eXosip2实现SIP服务端流程。 一、eXosip2简介 eXosip2是一个基于SIP标准的开源协议栈,它提供了一组API,可以用来实现SIP客户端和服务端。eXosip2具有高度的可移植性和灵活性,可以在不同平台上运行。eXosip2的主要特点包括: 1. 遵循SIP标准,功能齐全。 2. 支持IPv4和IPv6协议栈。 3. 支持TLS和SRTP协议。 4. 提供了一组易于使用的API,方便开发人员进行二次开发。 5. 可以在不同的平台上运行,包括Linux、Windows、Android等。 二、eXosip2的使用 1. 安装eXosip2库 首先需要安装eXosip2库,可以通过以下命令在Ubuntu下安装: sudo apt-get install libexosip2-dev 2. 初始化eXosip2 在使用eXosip2之前,需要初始化eXosip2库,这可以通过调用eXosip_init函数来实现。例如: eXosip_t *g_eXosipContext=NULL; g_eXosipContext = eXosip_malloc(); if (g_eXosipContext!=NULL) { iRet = eXosip_init(g_eXosipContext); } 3. 注册SIP服务器 使用eXosip2可以实现SIP服务器的注册,这可以通过调用eXosip_register_build函数构造注册消息,然后通过调用eXosip_register_send发送注册消息。例如: eXosip_event_t *pEvent = NULL; osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_register_build_initial_register(g_eXosipContext, "sip:192.168.1.100", "sip:192.168.1.100", "sip:192.168.1.100", 3600, &pMsg); if (iRet == 0) { iRet = eXosip_register_send_register(g_eXosipContext, pMsg); osip_message_free(pMsg); } 4. 接收SIP消息 使用eXosip2可以接收SIP消息,这可以通过调用eXosip_listen函数实现。例如: while (1) { iRet = eXosip_listen(g_eXosipContext, 0, &pEvent); if (iRet >= 0) { switch (pEvent->type) { case EXOSIP_REGISTRATION_SUCCESS: // 注册成功 break; case EXOSIP_REGISTRATION_FAILURE: // 注册失败 break; case EXOSIP_MESSAGE_NEW: // 收到新的SIP消息 break; } eXosip_event_free(pEvent); } } 5. 回复SIP消息 使用eXosip2可以回复SIP消息,这可以通过调用eXosip_message_build_response函数构造回复消息,然后通过调用eXosip_message_send_response发送回复消息。例如: osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_message_build_response(pEvent->tid, 200, &pMsg); if (iRet == 0) { iRet = eXosip_message_send_response(g_eXosipContext, pEvent->tid, 200, pMsg); osip_message_free(pMsg); } 三、总结 本文介绍了如何使用eXosip2实现SIP服务端流程。eXosip2是一个功能齐全、易于使用的SIP协议栈,可以方便地实现SIP客户端和服务端。在GBT28181的SIP协议组件开发中,eXosip2是一个非常好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值