微信付款码是如何完成付款的( 二 )

<=0.6秒(1RTT能完成支付则为0.6秒)TLS握手长连接1.消除TLS握手的耗时 2.安全:业界标准机具需要增加长连接处理逻辑降低耗时1.2秒(2RTT)自主加密协议消除TLS握手的耗时1.需要一套完整安全方案:加密和认证 , 密钥安全等 2.机具程序和后台程序改动量大降低耗时1.2秒(2RTT)业务数据传输精减业务数据改动量小业务协议变化降低耗时和精减字节数有关,1秒/KB( GPRS Wiki )使用二进制协议能最大程度精减机具程序和后台程序改动量大降低耗时和精减字节数有关,1秒/KB后台访问微信支付长连接消除DNS查询+TCP握手+TLS握手的耗时增加长连接维护逻辑降低耗时0.51秒(后台内部建立TLS连接耗时约0.17秒 , 一共建立3次)签名本地化签名无网络交互业务层面可能不支持降低耗时0.6秒(一次签名 , 一次验签)
4.4 方案选择方案选择的考虑点:

  • 支付安全性
  • 支付耗时减少程度
  • 改动成本
综合考虑后选择了3个具体方案:
微信付款码是如何完成付款的文章插图
方案优化耗时项选择原因预期收益 机具使用HTTPS长连接访问收单平台DNS解析 TCP握手 TLS握手1.安全性无变化 2.预期耗时优化收益高 3.改动成本小1.支付耗时0.6秒:扫码完成时 , TLS还未建立完成 , 5秒中有0.6秒是建立TLS连接的耗时 2.可保证稳定可控的支付耗时预期(不受扫码快慢影响)后台使用HTTPS访问微信支付后台访问微信支付1.安全性无变化 2.预期耗时优化收益高 3.改动成本小 4.业务层面签名无法本地化1.支付耗时减少0.51秒:建立TLS连接耗时0.17秒 , 需要建立3次精减业务数据包业务数据传输1.业务数据占HTTP包的80%以上,预期耗时优化收益高 2.改动成本小1.支付耗时减少0.48秒:请求数据包精减470B , 上行约1KB/s;应答精减100B , 下行约10KB/s
4.5 机具HTTPS长连接4.5.1 如何选择心跳时间间隔机具在2G网络环境中的网络拓扑:
微信付款码是如何完成付款的文章插图
一般情况下 , 机具引起空闲连接失效的外部因素有2个:
  • 移动网络出口NAT空闲连接超时
  • 支付后台http服务器的keepalive超时
实际测试得知 , 移动2G网络出口NAT超时时间为5分钟( Android微信智能心跳方案中也有相关说明 一文也有说明) , 支付后台http服务的keepalive_timeout配置也为5分钟 , 因此空闲连接保活时间间隔小于5分钟即可 。
4.5.2 如何选择心跳包内容主要考虑三方面:
  • 触发HTTP服务器的空闲连接计时器重新计时 , 因此需要一个完整HTTP请求
  • 2G网络带宽小 , 流量资费比较贵 , 因此应该尽量发送小数据包
  • 最好不要触发后台业务逻辑
综合来看 , 发送一个HTTP HEAD请求是一个很好的选择 。
4.6 精减业务数据包精减前:
微信付款码是如何完成付款的文章插图
三个精减手段:
  • 去除可选字段
  • 多层嵌套改为平铺
  • 字段名精减
精减后:
微信付款码是如何完成付款的文章插图
精减效果:
  • 请求包精减470B , 预期减少耗时 = 0.47KB / 1KB/s = 0.47s
  • 应答包精减100B , 预期减少耗时 = 0.1KB / 10KB/s = 0.01s
4.7 优化预期效果
微信付款码是如何完成付款的文章插图
优化项预期减少耗时(秒)耗时计算说明 机具使用HTTPS长连接0.65秒中有0.6秒是用于TLS握手后台使用HTTPS访问微信支付0.51建立1次TLS连接耗时0.17秒 , 一共建立3次精减业务数据包0.48上行减少0.47秒 , 下行减少0.01秒合计1.59