一 TCP Fast Open 快速建立连接
说明: 之前讲解'TCP 相关知识点'遗漏了这个'知识点',补充上
① TFO简介
② 请求 Fast Open Cookie过程
++++++++++++ "原理图" ++++++++++++
③ 真正开始 TCP Fast Open
重点: 'TFO' 使 'SYN包' 可以包含'payload 数据'
④ 抓包分析
1、Linux 上快速打开是'默认关闭'的,需要'先开启 TFO' --> '客户端'和'服务端'都开启
echo 3 > /proc/sys/net/ipv4/tcp_fastopen
思考: 如何让'快速连接' Cookie的'进快'过期 --> '设置为0',再'请求一次'即可
2、nginx 来'充当'服务器,修改 nginx 配置'listen 80 fastopen=256;',使之支持 TFO
知识点: 在nginx '1.5.8' 版本以及之后,'listen 指令'开始支持 'fastopen' 参数
3、服务端'抓包'
tcpdump -nni br0 tcp and host 172.25.2.157 -w tcp_fast_open.pcap
4、客户端'测试'
curl --tcp-fastopen -kv nginx.wzj.com/ok
知识点: curl '7.42.0+'后才'支持' TFO 选项 '--tcp-fastopen'
实验1: 第一次:'请求 Fast Open Cookie' 抓包分析
说明: 实验'1' 的第'1'个 SYN 包:wireshark 有标记 'TFO=R',看下这个包的 'TCP 首部'
特点: 这个首部包含了 TCP Fast Open 选项,但是 Cookie 为'空',表示向服务器请求新的Cookie
说明: 实验 '1' 的第 '2' 个包是 'SYN + ACK' 包,wireshark 标记为TFO=C
备注: 这个包的'首部'如下图'所示':
补充: 服务器已经生产了一个值为 "df8f286592b0187c" 的 Cookie
说明: 实验 '1' 的第'3'个包是'客户端' 对服务器的 'SYN 包'的'确认'包
小结: 到此三次握手完成,这个过程跟'无 TFO 三次握手'唯一的'不同点'
--> 就在于 Cookie 的请求和返回
后面的几个包就是'正常'的'数据传输'和'四次挥手'断开连接了
实验2: '第二次':'真正的快速打开' 抓包分析
第 1 个包就很'亮瞎眼',wireshark 把这个包识别为了 'HTTP 包','展开头部'看一下
需求: '显示'当TFO密钥
cat /proc/sys/net/ipv4/tcp_fastopen_key
遗留: 系统为什么'默认'没有开启'TFO'快速连接?
备注: 'mac' 默认情况下已经'支持TFO'
在TFO的'问题':
1、如伪造TFO SYN攻击 '通过DHCP及NAT、Moles获取有效的Cookies'
2、这种场景下,Server资源会'被攻击耗尽'
TFO 系统知识点汇总 TFO的安全性
二 TCP 快速建立连接
① 常规的TCP三次握手过程
1、RTT '往返'时间 Round-trip Time 含义
说明: 一个'TCP数据包'从源端'发送'到接收端,源端收到接收端'确认'的时间'间隔'
2、怎么'简单'的看一下RTT是多少:
说明: ping一下'对端'机器,最后的'time值'其实就是这两台机器的'RTT时间'啦
3、 2.5 RTT 是'如何'计算的
1.5 RTT(握手) + 1 RTT(数据往返) = 2.5 RTT
4、 2 RTT 是'如何'计算的
一般来说,比较'积极'的TCP在第三次握手的时候,已经顺便携带了'数据'请求,需要的时间将减小为:
1 RTT(握手) + 1 RTT(数据往返) = 2 RTT
高RTT值的网络中,如何提高短连接的传输速度
补充: 客户端发送完'第三次'握手包后,'不再需要'服务端的确认,立即可以'发送'数据
思考: 如何证明'第三次'握手携带了'payload 数据报文'?
验证TCP第三次握手刻意携带数据
思考: 如果第'三次握手包'服务器'没有'收到,就'直接'发送数据,会发生什么?
结论:
1、如果第三次握手包服务器'没有'收到,就直接'发送'数据
2、服务器将这个'携带应用数据'的包当做'第三次'握手
原因:直接发送的那个GET请求包中,ACK标记是置位了的,所以服务端就把这个GET包当成了第三次握手了
3、前提:这一个包中携带有'ACK'标记
② 快速建立连接
说明: 注意'演进'的过程
TCP Fast Open 的'优势': 一个最显著的优点是可以利用'握手'去除一个'往返 RTT'
特点: 在开启 TCP Fast Open以后,从'第二次请'求开始,就可以在'一个RTT'时间拿到'响应'的数据
++++++++++++ "原理描述" ++++++++++++
使用TCP 快速打开 'TCP Fast Open, TFO',尽可能'降低'握手对'网络延迟'的影响
③ 在 Linux 上如何打开 Fast Open 功能?
注意: Fast Open 功能是'3.7+'内核引入的
内核参数: 'tcp_fastopen'
④ TFO 抓包分析
DDOS: 耗光'内存'从而'拒绝'服务