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. SAP 创建物料主数据分类视图特性

    1.CL01创建物料分类 2.去CT04中去创建特性值 创建完成之后保存, 3.创建物料的分类视图,选择相应的特性值

  2. The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name

    可以强迫部署EntityFramework.SqlServer.dll这个文件到输出目录 找到1个老外的帖子,戳这里(本人测试无效,大家有可能试一下..) 解决方案以下: 在EF的上下文代码CS文件( ...

  3. 遇到IIS7配置PHP出现403和404错误的解决办法

    服务器要配置PHP,总是出现403错误.服务器是新装的,操作系统是windows server 2008 R2,装的IIS7. IIS里PHP和本地服务器对比了好几遍,都没到出错的原因,后来通过cmd ...

  4. 【摘】BPMN2.0-概要

    BPMN2.0-概要   原文地址:http://www.uml.org.cn/workclass/201206272.asp 作者:AliKevin2011,发布于2012-6-27   一.BPM ...

  5. 各大门户网站的css初始化代码

    腾讯QQ官网 css样式初始 body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select ...

  6. 我开发的SNMP编译器和浏览器

    我开发的SNMP编译器和浏览器 什么是SNMP SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进 ...

  7. [mk] 喝一杯咖啡, 写一写 Makefile

    Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...

  8. mysql 获取权限

    mysql> grant all privileges on *.* to root@"%" identified by "Passwd"; Query ...

  9. Nodejs 高并发长链接TCP链接的服务器设计问题

    最近有个项目比较棘手,nodejs的tcp服务,目前的服务器支持3W左右的客户端连接,但是客户希望能够支持30W左右,原先的模型是让客户端请求一个地址分发服务器,然后再tcp链接到不同的地址上实现高并 ...

  10. OD使用教程11

    首先把安装好的软件拖入PEID,看看它是用什么语言写的    然后用OD载入程序,查找关键字,步骤看上一个笔记 双击到达代码处,发现这在一个跳转里面.可能第一反应是修改跳转,经试验后发现这是没用的所以 ...