TCP Fast Open
We know that Web services use the TCP protocol at the transport layer. Standard TCP protocol to three-way handshake (three-way handshaking), the server can respond to the client's request to send data. If the three-way handshake phase, the client can send a request to the server, and the server sends a response, you can reduce the delay of Web services.
1、背景
标准的TCP规范允许客户端在初始化连接中的SYN包中携带应用数据,但是服务端的应用程序要在三路握手完成后才能从内核中得到SYN包携带的数据。如果我们直接移除这个限制,客户端可以在SYN包携带HTTP GET Request,服务端在SYN+ACK包中携带响应数据,虽然这可以满足TFO(TCP Fast Open)的需求,但很容易遭受拒绝服务攻击。攻击者可以使用伪造的IP地址向服务端发送大量的携带HTTP GET request的SYN包,这会导致服务端不能正常工作。TFO需要安全机制让服务端抵御此类攻击。TFO的目标是让TCP连接双方在三路握手过程中安全地交换数据。
2、TFO设计
TFO使用cookie抵御地址伪造攻击。如果客户端希望使用TFO,那么需要打开TCP TFO选项并且在建立TCP连接时向服务端请求cookie。下图说明TFO的使用方法:

整个过程可以分为两个阶段:TFO cookie请求阶段和TFO cookie使用阶段 。上图的红线部分表示cookie请求阶段,过程如下:
(1、客户端打开TCP TFO选项,在SYN包中携带cookie请求
(2、服务端对客户端的IP地址进行加密,生成一个cookie,然后在SYN+ACK包中携带这个cookie给客户端
(3、客户端收到cookie后缓存起来,当下次向服务端发起连接请求时,使用对应的缓存cookie
上图的蓝线部分表示cookie的使用阶段:
(1、客户端发送携带缓存的cookie和应用数据的SYN包给服务端(需要打开TCP TFO选项)
(2、服务端接收到SYN包后,对cookie进行验证。如果cookie有效,那么服务端发送SYN+ACK包对客户端的SYN包和携带的应用数据进行确认,服务端应用程序可以获取应用数据。如果cookie无效,那么服务端丢弃SYN包携带的应用数据,仅仅对SYN包本身进行确认,然后使用常规的三路握手方法建立连接
(3、如果服务端应用程序接收了SYN包中携带的数据,那么服务端可能在客户端的ACK到达之前,向客户端发送响应数据,也就是说,在TCP连接过程中,服务端就可以向客户端发送数据
(4、客户端向服务端发送ACK包进行确认,如果客户端在SYN包中携带的数据没有得到确认,那么会在ACK包中重新传送
(5、客户端与服务端接下来使用正常的TCP处理方式进行数据交换
3、TFO Cookie
TFO cookie是一个加密的数据字符串,服务端负责生成和验证TFO cookie。客户端或者连接的主动打开方缓存cookie,并且用于后续的初始化连接中。服务端加密客户端SYN包里的源IP地址,生成至多16字节的cookie。与正常的SYN包或者SYN+ACK包所需的处理时间相比,cookie的加密和验证是非常快的。没有服务端生成cookie时所使用的密匙,客户端是不能生成有效的cookie的。
4、安全考虑
TFO的目标是在TCP的连接过程中进行数据交换,并且避免任何新的安全问题。
4.1、SYN Flood Attack
如果攻击者提供的TFO cookie无效,那么SYN包中的数据就会被丢弃,接下来使用正常的TCP三路握手建立连接,那么服务端此时可以使用已有的技术如SYN cookies来抵御攻击。如果攻击者提供的cookie有效(任何客户端都可以从服务端得到一个有效的cookie),那么服务端就有资源耗尽的危险。为了解决这个问题,服务端可以为每个端口或者所有端口维护一个挂起的TFO连接计数。挂起的TFO连接表示服务端已经接受客户端的请求并发送SYN+ACK包,但是还没有收到客户端的ACK包。当挂起的TFO连接计数超过某一个阈值,所有的新TFO连接都会直接使用正常的三路握手,从而可以使用已有的抵御洪水攻击的方法保护服务端受到攻击。也就是说,攻击者可能使服务端和客户端暂时不能使用TFO建立连接,但双方仍然可以使用三路握手建立连接,保证服务端能够继续工作。
洪水攻击最初出现在90年代后期,攻击者的目标是让服务端的backlog队列溢出,导致新的SYN包被丢弃,让服务端不能正常工作。攻击者通常都会使用一个得不到响应的伪造地址向服务端发送SYN包,否则服务端向客户端发送SYN+ACK包后会接收一个RST包。服务端接收到RST包后,会释放响应的半连接,导致攻击失效。对于TFO连接来说,此类的RST包会加大攻击者造成的伤害因为服务端接收到RST包后会释放掉对应的挂起的TFO连接,导致新的TFO连接可以使用。为了解决这个问题,服务端在接收到RST波后并不释放挂起的TFO连接,直到超时发生。
4.2、Amplified Reflection Attack
TFO连接允许服务端在SYN+ACK包之后向服务端发送响应数据,如果没有TFO cookies机制,很容易遭受放大反射攻击。在之前提过,服务端的挂起的TFO连接数量是有限制的,这可以保证服务端的资源不会被消耗完。
5、重复的SYN包
当前标准的TCP允许在SYN包中携带应用数据,但是只有在完成三路握手后,服务端应用程序才能从内核中获得数据,这主要为了处理重复的SYN包。尽管TFO连接不会在重传的SYN包中携带数据,在网络中有可能产生重复的带数据的SYN包,这会导致服务端应用程序重新接收数据。假设TFO客户端在发送携带数据的SYN包并在重复的SYN包到达前主动关闭连接,服务端作为被动关闭的一方,将会接收这个重复的SYN包并且处理携带的数据。如果重复包是在2MSL时间内生成的,服务端向客户端发送SYN+ACK包,而客户端此时处于TIME_WAIT状态,会回复一个RST包给服务端,导致服务端终止连接。尽管如此,服务端仍然响应了这个重复的请求。一个探索性的方案是,当服务端接收到客户端的最后ACK包时,让服务端在2MSL时间内继续保持LAST_ACK状态,这可以阻止服务端接收迟到的重复包。像信用卡或银行应用等一些不能容忍重复事务的应用,在应用层确保幂等性。
6、性能分析
性能分析和其他细节可以参考TCP Fast Open这篇论文。
TCP Fast Open的更多相关文章
- linux TCP Fast Open开启和测试
linux上要开启TCP Fast Open,内核版本至少为3.7.0, 且需要设置 /proc/sys/net/ipv4/tcp_fastopen 为3. 开启后,如果有连接进来,使用如下命令查看: ...
- 面试题-你听过TCP Fast Open (TFO/TCP快速打开)吗?能解释一下吗?
TCP Fast Open (TFO/TCP快速打开) TCP快速打开(TCP Fast Open,TFO)是什么? TCP快速打开(TCP Fast Open,TFO)是对TCP的一种简化握手手续的 ...
- [转载] HTTP请求的TCP瓶颈分析
原文: http://bhsc881114.github.io/2015/06/23/HTTP%E8%AF%B7%E6%B1%82%E7%9A%84TCP%E7%93%B6%E9%A2%88%E5%8 ...
- [转载] TCP协议缺陷不完全记录
原文: http://www.blogjava.net/yongboy/archive/2015/05/07/424917.html tcp是一个非常复杂并且古老的协议, 之前教科书上将的很多东西应用 ...
- (转)TCP注册端口号大全
分类: 网络与安全 cisco-sccp 2000/tcp Cisco SCCPcisco-sccp 2000/udp Cisco SCCp# Dan Wing <dwing&cisco ...
- Tcp抓包以及tcp状态解释
tcp三次握手 发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它, ...
- HTTP请求的TCP瓶颈分析
这篇文章基本是对<Web性能权威指南>第一章和第二章的读书笔记,另外加一些扩展内容,这本书确实赞,推荐 针对三次握手.流量控制(接收窗口).慢启动(cwnd,拥塞窗口).队首阻塞等方面看下 ...
- HTTP请求的TCP瓶颈分析[转]
阅读目录 延迟的因素 速度延时 带宽延时 最后一公里延时-tracerouter 目标 rwnd的设置 慢启动过程 慢启动的影响 慢启动对HTTP影响的一次计算 拥塞窗口的合适值 服务器配置调优 应用 ...
- 第五节 面向连接传输:TCP
第五节 面向连接传输:TCP TCP概述RFCs:793,1122,1323,2018,2581 点对点: 一个发送方,一个接收方 可靠,按序的字节流: 无“报文边界”,无结构但有 ...
随机推荐
- js获取鼠标当前的位置
有时候,我们需要得到窗口拖动或者鼠标移动的距离,此时可以通过计算鼠标前后在页面中的位置来得到想要的结果,下面介绍几个事件属性: 1.客户区坐标位置 鼠标事件都是在浏览器视口中的特定位置上发生的.这个位 ...
- 控制反转IOC与依赖注入DI
理解 IOC http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例 的http:// ...
- NGUI 新手引导
现在我们的游戏已到了开发后期,这个时候需要做新手引导这一块(恶心的新手引导,真想说游戏行业究竟哪个2B最先想出来要引导的???代码搞的到处都是,改了一次又改!) 吐槽过后进入正题:主要还是UI相关的操 ...
- MongoDB学习:(二)MongoDB简单使用
MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...
- [刘阳Java]_斗胆介绍一下Eclipse快捷键大全[超详细]_第6讲
斗胆让我在这里介绍一下Eclipse快捷键有哪些 ctrl+shirt+r 打开资源 这组快捷键可以让你开打Eclipse工作区中任何一个文件,你只需要输入你想查找的文件名字即可,而且绝对支持模糊检索 ...
- Codeforces 703B (模拟) Mishka and trip
题目:这里 题意:n个城市,每个城市有个魅力值vi,首先,有n条路将这n个城市连成一个环,1号城市连2号城市,2号连3号****n号连1号城市,每条路的魅力值是其连接的两个城市 的魅力值的乘积,这n个 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- delphi真随机数发生器
当然不是绝对真随机,是相对真随机数 下载
- 学习html心得
最近我们小组在搞一个网站项目,每个组员都在学习html与css. 我们先找到相关网站寻找信息进行学习,内容不多,我很快就把html的教程看完了.感觉还不错,就下载了html编辑器Notepad++进行 ...
- 2. Abstract Factory(抽象工厂)
意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关 ...