当前位置: 首页 > news >正文

F5 LTM 在SIP消息负载均衡中存在的问题

F5 Local Traffic Manager 常被用来做应用交付负载均衡器,支持HTTP和SIP协议,以及从IP层(3层)到应用层(7层 standard)的负载均衡,同时兼具路由转发功能。业界使用F5 LTM来完成HTTP请求负载较多,基于SIP协议的7层协议较少。在使用该负载均衡器的过程中,我总结了一些问题:

  1. 使用基于TCP的SIP协议传输大消息时,如果使用Standard模式,该消息会被切分,导致服务器端无法正常接收到消息。因此,只能选择Performance Layer4模式。

  2. F5 LTM支持AUTO MAP模式的NAT功能,却无法处理SIP消息的端口问题。
    F5为全代理工作模式,设备同时与客户端和真实服务器各建立一条连接,分别被定义为client side和server side。客户端会与F5的vs建立一条连接,F5会以自身接口IP与真实服务器建立一条连接。即:

    Client Side    Server Side
    Client------F5 VS
    F5 接口IP------Server
    

    由于F5与后端服务器通讯时仅使用的自身一个接口IP,所以就需要通过不同的源端口来区分不同客户端的Session。例:

    192.168.1.1:2000--->192.168.1.100:8080
    192.168.1.200:2000--->192.168.1.254:8080
    192.168.1.200:2000<-----192.168.1.254:8080
    192.168.1.1:2000<-----192.168.1.100:8080
    

    如上为当有一个客户端时F5默认使用与客户端相同端口转发数据包,固定端口2000,不使用rport时,根据VIA字段回复,能正确处理该消息。此时,有另一个客户端也是固定2000端口来访问。例:

    192.168.1.2:2000--->192.168.1.100:8080
    192.168.1.200:5555--->192.168.1.254:8080
    192.168.1.200:**2000**<-----192.168.1.254:8080
    

    当同时有另外一个客户端访问该VS时F5将使用随机端口“举例5555”与服务器通信,不然则无法区分Session。此处,没有使用rport,导致回复给F5的端口和F5发请求的端口不一致。(如果使用rport,服务器会根据rport来回复响应,此处,rport应为5555)。

因此,在实际应用当中使用F5作为SIP负载均衡器存在以下问题:固定端口后,大多数平台和设备使用5060端口进行SIP信令传输,在上次请求连接没有断开时,下次请求会使用随机端口向服务器发送请求响应。在不使用rport机制的情况下,服务器默认向VIA字段里的地址和端口进行回复,即响应被回复到了5060,导致F5无法正确匹配请求和响应,从而响应无法正确返回客户端(而是回复到了最初占用5060端口的那个客户端上了)。

建议解决方案:统一收发端口后,使用rport机制,在VIA字段中携带rport,从而服务器在接收请求后会记录F5发送请求的端口,回复响应会回复到该端口,让F5匹配请求和响应。固定端口使得F5能正常将响应回复到客户端。

另,rport机制详见:RFC 3581。

相关文章:

  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—D qwb与神奇的序列
  • 我所爱的世界
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—J qwb又偷懒了
  • 字符串处理文章outline
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—K qwb与小数
  • java内存管理机制
  • 网络流-割的概念以及定理
  • HDU 3533 Escape
  • 容斥原理+模板题HDU-1796
  • Java日志最佳实践
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—A qwb与支教
  • SDUT-3930(线段树+状压)
  • 【Active入门】ActiveMQ学习-1
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—C 勤劳的ACgirls
  • 让CSS布局更加直观:box-sizing
  • 【Linux系统编程】快速查找errno错误码信息
  • 【个人向】《HTTP图解》阅后小结
  • 10个确保微服务与容器安全的最佳实践
  • Babel配置的不完全指南
  • express.js的介绍及使用
  • Material Design
  • MySQL数据库运维之数据恢复
  • Octave 入门
  • PHP的类修饰符与访问修饰符
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Redash本地开发环境搭建
  • Vue小说阅读器(仿追书神器)
  • windows下使用nginx调试简介
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从伪并行的 Python 多线程说起
  • 面试总结JavaScript篇
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 提醒我喝水chrome插件开发指南
  • 微信小程序设置上一页数据
  • 一、python与pycharm的安装
  • 以太坊客户端Geth命令参数详解
  • python最赚钱的4个方向,你最心动的是哪个?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #define,static,const,三种常量的区别
  • #Java第九次作业--输入输出流和文件操作
  • (C++20) consteval立即函数
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 8.0 发布到 IIS
  • .NET的数据绑定
  • ??eclipse的安装配置问题!??
  • @Async注解的坑,小心