[TCP灵魂之问]TFO 流程、TCP快速打开(TFO)原理、TFO优势

TFO 流程

首轮三次握手
就是第二次握手的时候不是立即返回SYN+ACK了,
而是返回计算得到的`SYN cookie`,
放在TCP报文的Fast Open(快速打开)选项中,
客户端拿到cookie将其缓存
  • 首先客户端发送SYN给服务端,服务端接收到。
  • 注意哦!现在服务端不是立刻回复 SYN + ACK,而是通过计算得到一个SYN Cookie, 将这个Cookie放到 TCP 报文的 Fast Open选项中,然后才给客户端返回。
  • 客户端拿到这个 Cookie 的值缓存下来。后面正常完成三次握手。
    首轮三次握手就是这样的流程。而后面的三次握手就不一样啦!
后面的三次握手
客户端发送Cookie+SYN+HTTP请求,
服务端验证合法,先确认,返回SYN+ACK,`返回HTTP响应`
客户端传ACK
  • 在后面的三次握手中,客户端会将之前缓存的 Cookie、SYN 和HTTP请求(是的,你没看错)发送给服务端,服务端验证了 Cookie 的合法性,如果不合法直接丢弃;如果是合法的,那么就正常返回SYN + ACK。
  • 重点来了,现在服务端能向客户端发 HTTP 响应了!这是最显著的改变,三次握手还没建立,仅仅验证了 Cookie 的合法性,就可以返回 HTTP 响应了。
  • 当然,客户端的ACK还得正常传过来,不然怎么叫三次握手嘛。
    在这里插入图片描述
    注意: 客户端最后握手的 ACK 不一定要等到服务端的 HTTP 响应到达才发送,两个过程没有任何关系。

TFO 的优势

拿到Cookie验证通过就能返回HTTP请求了,
利用了1个往返时延`RTT`提前进行数据传输

TFO 的优势并不在与首轮三次握手,而在于后面的握手,在拿到客户端的 Cookie 并验证通过以后,可以直接返回 HTTP 响应,充分利用了1 个RTT(Round-Trip Time,往返时延)的时间提前进行数据传输,积累起来还是一个比较大的优势。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化这段代码:if (icbcDtlRsp.getBillSta().equals("CS01") && icbcDtlRsp.getRangeStage().equals("TF0101")) { //CS01已出票 & TFO101待收票---010004出票已登记 ecdsDrftInf.setDrftSndStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_CPYDJ, ecdsDrftInf.getDrftSndStat())); // 票据发送人状态 ecdsDrftInf.setDrftRcvStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_CPYDJ, ecdsDrftInf.getDrftRcvStat())); // 票据接收人状态 ecdsDrftInf.setDrftCurrStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_CPYDJ, ecdsDrftInf.getDrftCurrStat())); // 人行当前状态 } else if (ecdsDrftInf.getDrftOrgStat().equals(ECDSConstants.DRAFT_STATUS_CPYDJ) && icbcDtlRsp.getBillSta().equals("CS01") && icbcDtlRsp.getRangeStage().equals("TF0302")) { //CS01已出票 & TF0302已锁定--- 020001承兑待签收 ecdsDrftInf.setDrftSndStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDDQS, ecdsDrftInf.getDrftSndStat())); // 票据发送人状态 ecdsDrftInf.setDrftRcvStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDDQS, ecdsDrftInf.getDrftRcvStat())); // 票据接收人状态 ecdsDrftInf.setDrftCurrStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDDQS, ecdsDrftInf.getDrftCurrStat())); // 人行当前状态 } else if (ecdsDrftInf.getDrftOrgStat().equals(ECDSConstants.DRAFT_STATUS_CPYDJ) && icbcDtlRsp.getBillSta().equals("CS02") && icbcDtlRsp.getRangeStage().equals("TFO101")) { //CS02已承兑 & TFO101待收票---020006承兑已签收 ecdsDrftInf.setDrftSndStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDYQS, ecdsDrftInf.getDrftSndStat())); // 票据发送人状态 ecdsDrftInf.setDrftRcvStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDYQS, ecdsDrftInf.getDrftRcvStat())); // 票据接收人状态 ecdsDrftInf.setDrftCurrStat(getValueOrDefault(ECDSConstants.DRAFT_STATUS_TSCDYQS, ecdsDrftInf.getDrftCurrStat())); // 人行当前状态 }
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值