关于rfc3581/rport参数的阐述

一:简述

一般情况下,服务器在接收到request后,应答发向哪里呢?服务器在计算回应应答的算法是一种混合模式,具体说来是这样的:

1,IP:从哪里接收到的就会给哪里,即ip包上记录的源地址

2,port:根据sip报文的头解析出来,

对于处理被NAT包裹的环境中的客户端,请求是可以发出去的,但是应答却无法穿透NAT,就要借助rport这个位于via 类型header的param来处理了

附:目前还借助了“received”这个param in topmost via header,原理是这样的

服务器会将自己实际从哪个ip上接收到的请求记录在“received”,通过他可以有助于让应答穿越NAT。但是没有指定port,那怎么半呢?

二,客户端

可以在其声称的请求中,包含"rport" 这个参数in the top  via header,但是不能有值,这个只是表示我支持该扩展属性。

当客户端使用udp将请求发送出去后,他必须在其发送请求的那个ip:port上准备好接收回来的应答,

同时,他还需要在“sent-by”中指定的端口上准备接收。

一旦在客户端和服务器之间有一个NAT存在,那么当请求经过NAT的时候会在nat上创建一条绑定,这个绑定记录还要保有一个超时时间,保证在这个时间内能够接收到服务器端的应答。

大部分的udp NAT,这个超时时间设置的是1min,这个远远超过了non-invite传输的时间。所以,对于non-invite请求,接收到应答是没问题的。

而,INVITE传输则可以是任意的超时时长,所以为了不让nat把我关掉,客户端应该每20s就传一次,这种重传必须一直延续着,尽管接收到临时应答了

三,服务端

服务器(这里的服务器包括proxy 或者 UAS)在接收到请求之后,会检查topmost via的头域,如果头域中包含“rport”参数 with no value,则把该值设置成接收到请求的源端口号

这个原理等同于服务端在向topmost via中insert “reseived”一样。实际上,服务端必须要insert一个包含接收请求的源地值的 “reseived”到via中,即使这个源地值域sent-by是一样的。

注:以上处理域传输层协议无关

当一个服务器想要发送应答的时候,他会检查应答中的topmost via ,如果“sent-protocol”组件指示要使用不可靠传输协议比如udp,那么时不可以有“maddr”这个参数的,但是有 “reseived”和“rport”参数,

这个应答必须发送给“reseived”中列出的所有ip,对应的端口为“rport”中指定的,而这个应答必须经由接收请求的那个ip:port发送出去,这么做是为了穿越对称NAT

当一个server监听在多interface或者多port上时,他需要记住从哪一个上接收到了请求。对于有状态proxy,在传输期间存储这些信息也不是什么难题。然而对于无状态proxy,不会存储请求和应答的关系,所以不能记住从哪里接收到的请求。

所以,为了实现上述的要求,一个无状态的proxy就需要把请求中的目的地址和端口号编码进via 头域中,一旦这个应答来了,他就可以提取这个信息用于指导如何转发应答。

四,例子

1,A client sends an INVITE to a proxy server which looks like, in part:INVITE sip:user@example.com SIP/2.0Via: SIP/2.0/UDP 10.1.1.1:4540;rport;branch=z9hG4bKkjshdyff
这个INVITE 请求从源地址:10.1.1.1:4540这个客户端发出来的,想要到达的目的地是user@example.com
服务proxy的地址为192.0.2.2即proxy.example.com,他会在5060和5070端口上。
于是,请求会发向proxy的5060端口这个过程会经过nat,所以ip包上的源地值会变成192.0.2.1,而端口号变成9988proxy接收请求再转发,但是转发之前要把"rport"参数insert到via中,于是头变成了这样:
INVITE sip:user@example.com SIP/2.0Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77   ---因为经过了一个proxy嘛,所以肯定要加一个viaVia: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff      ---因为发现接收request的源ip和via中指定的ip不同,所以这里要加上received和rportThis request generates a response which arrives at the proxy:   (wxy:针对这个请求,proxy会生成一个应答,是如下这个样子的:)SIP/2.0 200 OKVia: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

The proxy strips its top Via header field value, and then examinesthe next one.  It contains both a "received" parameter and an "rport"parameter.  The server follows the rules specified in Section 4 andsends the response to IP address 192.0.2.1, port 9988, and sends itfrom port 5060 on 192.0.2.2:
   proxy首先找到top via header,然后检查他的下一个,他既包含了received也包含了rport参数   于是这个服务器就会根据之前说的原则,将应答发给192.0.2.1:9988,并且是从192.0.2.2:5060上发出去的
   SIP/2.0 200 OKVia: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyffThis packet matches the binding created by the initial request.Therefore, the NAT rewrites the destination address of this packetback to 10.1.1.1, and the destination port back to 4540.  It forwardsthis response to the client, which is listening for the response onthat address and port.  The client properly receives the response.

转载于:https://www.cnblogs.com/shuiguizi/p/11235982.html

SIP协议的传输层原理报文解析(解读rfc3581)(待排版)相关推荐

  1. 网络层协议和传输层协议

    目录 一.网络层功能 二.IP数据包格式 三.ICMP协议 四.ARP协议 五.传输层协议 六.TCP报文段 七.TCP三次握手 八.TCP四次断开 九.常用的TCP端口号及功能 十.UDP协议 十一 ...

  2. TCP、UDP(网络协议:传输层协议)

    面试和笔试中,如果记住下面这张图,基本就能解决网络协议中70%的问题.需要记住: OSI模型和TCP/IP模型每一层名称: 每一层对应有哪些协议,或者说给出该协议要知道对应那一层: 该协议是基于TCP ...

  3. 网络协议分析 | 传输层 :史上最全UDP、TCP协议详解,一篇通~

    文章目录 UDP 概念 格式 UDP如何实现可靠传输 基于UDP的应用层知名协议 TCP 概念 格式 保证TCP可靠性的八种机制 确认应答.延时应答与捎带应答 超时重传 滑动窗口 滑动窗口协议 后退n ...

  4. 4-1:TCP协议之传输层的作用及传输层协议TCP和UDP

    文章目录 一:传输层的定义 二:通信处理 三:传输层协议 四:TCP协议的可靠和性能 一:传输层的定义 前面说过,IP首部有一个协议字段用于标识网络层(IP)的上一层采用哪一种传输层协议.根据这个字段 ...

  5. 网络:传输层 TCP报文格式解析

    一.TCP报文格式 1.为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图: 图2 TCP报文格式 16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数 ...

  6. 互联网协议 — TLS 传输层安全协议

    目录 文章目录 目录 SSL/TLS TLS 1.2 的握手(安全验证)流程 1. client_hello 2. server_hello + server_certificate + sever_ ...

  7. 网络协议:传输层(http://java-mzd.iteye.com/blog/1007577)

    转载于:https://www.cnblogs.com/balala/p/6474637.html

  8. 简述tcp协议三报文握手过程_华为原理 | 传输层协议amp;交换转发原理

    Interface GigabitEthernet0/0/0 ip address 12.1.1.2 255.255.255.0 arp-proxy enable \\华为接口下默认没有开启代理ARP ...

  9. 网络原理 --- 传输层Ⅱ TCP协议中的确认应答,超时重传和连接管理

    文章目录 网络原理 传输层 TCP 协议 TCP的基本特性 1.确认应答 2.超时重传 3.连接管理 ❗❗①建立连接(三次握手) ②断开连接(四次挥手) 总结 网络原理 介绍TCP/IP协议中每一层里 ...

最新文章

  1. 17 个品牌,113 款 5G 手机,5G 离我们越来越近
  2. py 的 第 38 天
  3. mxnet 配置gpu
  4. mahout 算法集
  5. 八句经典座右铭必有一句适合你
  6. 微软发布的python教程_微软发布Python 教程《Develop with Python on Windows》
  7. NSTimeInterval和CMTime
  8. bert 中文 代码 谷歌_ELECTRA中文预训练模型开源,110个参数,性能媲美BERT
  9. pip安装软件 Command “python setup.py egg_info“ failed with error code 1 in
  10. 基于强跟踪卡尔曼滤波的隔振系统故障诊断——matab simulink仿真
  11. 1-4 多文档界面处理(2)
  12. 未解决:configure: error: XCode tool ‘metal‘ neither found in path nor with xcrunchecking for metal...
  13. java 订单减库存_订单和库存处理方案
  14. 使用onlyoffice让你轻松实现word、ppt、excel在线编辑功能
  15. 逻辑回归阈值_逻辑回归算法
  16. 笔记本禁用键盘的方法(已试过win10/win11均可生效)
  17. lcx端口转发工具的使用
  18. android storage 路径,风儿带你了解Android存储路径。
  19. 九宫格图案解锁、支付宝解锁、微信钱包解锁
  20. 确定sw1开关信号输入端口_老电工教大家变频器,怎么接入浮球液位调节信号

热门文章

  1. BZOJ 4059: [Cerc2012]Non-boring sequences ( )
  2. Discuz! X2.5 添加自定义数据调用模块(简单方法)
  3. PHP basename() 函数
  4. SQL Server 数据库备份
  5. 用TCP/IP进行网际互联一
  6. OpenCV+python:ROI与泛洪填充
  7. 永州科技学院有计算机专业吗,永州科技学院有哪些专业
  8. java i18n 转换,Java的国际化支持(I18N问题)
  9. pg数据库json数据类型_PG数据类型
  10. mysql语句优化百条_优化mysql语句