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的更多相关文章

  1. linux TCP Fast Open开启和测试

    linux上要开启TCP Fast Open,内核版本至少为3.7.0, 且需要设置 /proc/sys/net/ipv4/tcp_fastopen 为3. 开启后,如果有连接进来,使用如下命令查看: ...

  2. 面试题-你听过TCP Fast Open (TFO/TCP快速打开)吗?能解释一下吗?

    TCP Fast Open (TFO/TCP快速打开) TCP快速打开(TCP Fast Open,TFO)是什么? TCP快速打开(TCP Fast Open,TFO)是对TCP的一种简化握手手续的 ...

  3. [转载] 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 ...

  4. [转载] TCP协议缺陷不完全记录

    原文: http://www.blogjava.net/yongboy/archive/2015/05/07/424917.html tcp是一个非常复杂并且古老的协议, 之前教科书上将的很多东西应用 ...

  5. (转)TCP注册端口号大全

    分类: 网络与安全 cisco-sccp 2000/tcp Cisco SCCPcisco-sccp 2000/udp Cisco SCCp# Dan Wing <dwing&cisco ...

  6. Tcp抓包以及tcp状态解释

    tcp三次握手 发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它, ...

  7. HTTP请求的TCP瓶颈分析

    这篇文章基本是对<Web性能权威指南>第一章和第二章的读书笔记,另外加一些扩展内容,这本书确实赞,推荐 针对三次握手.流量控制(接收窗口).慢启动(cwnd,拥塞窗口).队首阻塞等方面看下 ...

  8. HTTP请求的TCP瓶颈分析[转]

    阅读目录 延迟的因素 速度延时 带宽延时 最后一公里延时-tracerouter 目标 rwnd的设置 慢启动过程 慢启动的影响 慢启动对HTTP影响的一次计算 拥塞窗口的合适值 服务器配置调优 应用 ...

  9. 第五节 面向连接传输:TCP

    第五节 面向连接传输:TCP   TCP概述RFCs:793,1122,1323,2018,2581   点对点:   一个发送方,一个接收方   可靠,按序的字节流:   无“报文边界”,无结构但有 ...

随机推荐

  1. python学习之——调用adb命令完成移动端界面测试

    实现原理 Hierarchy Viewer:获得当前手机实时的UI信息,方便用于手机的自动化测试: python中的subprocess.Popen():调用系统命令: uiautomator工具:获 ...

  2. Eclipse中调试Android技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...

  3. 通过js获得html标签的值

    js获取html元素的值并赋值 1).input文本框 <input type="text" value="时间" placeholder="姓 ...

  4. CDN系统对网站的性能有极大的提升

    CDN系统对网站的性能有极大的提升 打开一个网站 我们只是请求了一个页面.单个页面,实际上所有文件都是一个新的请求.以新浪为例一共发起了35个请求. 这35个请求中.只有一个动态内容.其它均为静态.这 ...

  5. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

  6. appcan切换帐号无法提交SVN

     C:\Documents and Settings\Administrator\Application Data\Subversion\auth\svn.simple 

  7. 一个Angular模块中可以声明哪些组件?

    一个Angular模块中可以声明哪些组件? (1) controller        控制器 (2) directive                指令 (3) function         ...

  8. 面向对象的OOA、OOD、OOP

    OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...

  9. 一句话的代码,从集合中找出第一个重复字符的方法javascript版。

    有的时候需求是这样的: 找出集合中第一个重复的字符所在的位置,刚才看了园内某自许为算法的代码,感觉非常之啰嗦故写了以下代码! 本人对神马算法之类的完全不懂,但那些伪算法家们也别出来装蒜.一句话:不要欺 ...

  10. PHP那些非常有用却鲜有人知的函数

    PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用.这篇文章里,我列举了一些鲜为人知但会让你眼睛一亮的PHP函数. levenshtein() 你有 ...