TCP Fastopen 简介

首先,回顾下tcp三次握手

tcp fastopen 握手流程:
TFO 首次建联会发送空cookie,完成首次建联后,内核网络会保存该cookie,用于后续建联使用。如下图:

当客户端断开连接,下一次请求同一个服务端的时候,会带上之前存储的Cookie和要发送的数据,在SYN的路径上一起发送给服务端,如下图:

TFO 系统开关配置

#3的意思是开启TFO客户端和服务器端
#1表示开启客户端,2表示开启服务器端echo 3 > /proc/sys/net/ipv4/tcp_fastopen

TFO 客户端和服务端示例

client.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>#define USE_IPV6 1
#if USE_IPV6typedef struct in6_addr sq_in_addr;
typedef struct sockaddr_in6 sq_sockaddr_in;#define SQ_AF_INET      AF_INET6
#define SQ_PF_INET      PF_INET6
#define sq_sin_family   sin6_family
#define sq_sin_port     sin6_port
#define sq_sin_addr     sin6_addr
#define sq_s_addr       s6_addr#define CLIENT_IP_HEX_LEN 32
#define SQ_MAX_IP_STR_LENGTH 40#elsetypedef struct in_addr sq_in_addr;
typedef struct sockaddr_in sq_sockaddr_in;#define SQ_AF_INET      AF_INET
#define SQ_PF_INET      PF_INET
#define sq_sin_family   sin_family
#define sq_sin_port     sin_port
#define sq_sin_addr     sin_addr
#define sq_s_addr       s_addr#define CLIENT_IP_HEX_LEN 8
#define SQ_MAX_IP_STR_LENGTH 16#endif /* USE_IPV6 */int main(){sq_sockaddr_in serv_addr;char *data = "Hello, tcp fast open";int data_len = strlen(data);int sfd = socket(SQ_AF_INET, SOCK_STREAM, 0);#if USE_IPV6inet_pton(SQ_AF_INET, "0:0:0:0:0:0:0:0", (struct sq_sockaddr_in *)&serv_addr.sq_sin_addr);
#elseinet_pton(SQ_AF_INET, "0:0:0:0", (struct sq_sockaddr_in *)&serv_addr.sq_sin_addr);
#endifserv_addr.sq_sin_family = SQ_AF_INET;serv_addr.sq_sin_port = htons(5060);int len = sendto(sfd, data, data_len, MSG_FASTOPEN, (struct sockaddr *) &serv_addr, sizeof(serv_addr));printf("error: %d-%s\n", errno, strerror(errno));close(sfd);
}

server.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define USE_IPV6 1
#if USE_IPV6typedef struct in6_addr sq_in_addr;
typedef struct sockaddr_in6 sq_sockaddr_in;#define SQ_AF_INET      AF_INET6
#define SQ_PF_INET      PF_INET6
#define sq_sin_family   sin6_family
#define sq_sin_port     sin6_port
#define sq_sin_addr     sin6_addr
#define sq_s_addr       s6_addr
#define SQ_INADDR_ANY   IN6ADDR_ANY_INIT#define CLIENT_IP_HEX_LEN 32
#define SQ_MAX_IP_STR_LENGTH 40#elsetypedef struct in_addr sq_in_addr;
typedef struct sockaddr_in sq_sockaddr_in;#define SQ_AF_INET      AF_INET
#define SQ_PF_INET      PF_INET
#define sq_sin_family   sin_family
#define sq_sin_port     sin_port
#define sq_sin_addr     sin_addr
#define sq_s_addr       s_addr
#define SQ_INADDR_ANY   INADDR_ANY#define CLIENT_IP_HEX_LEN 8
#define SQ_MAX_IP_STR_LENGTH 16
#endif /* USE_IPV6 */int main(){char buffer[256] = {0x0};sq_sockaddr_in serv_addr;int cfd = 0;int sfd = socket(SQ_AF_INET, SOCK_STREAM, 0);   // Create socketbzero((char *) &serv_addr, sizeof(serv_addr));serv_addr.sq_sin_family = SQ_AF_INET;
#if USE_IPV6inet_pton(SQ_AF_INET, "0:0:0:0:0:0:0:0", (struct sq_sockaddr_in *)&serv_addr.sq_sin_addr);
#elseinet_pton(SQ_AF_INET, "0:0:0:0", (struct sq_sockaddr_in *)&serv_addr.sq_sin_addr);
#endifserv_addr.sq_sin_port = htons(5060);bind(sfd, (const struct sockaddr *)&serv_addr,sizeof(serv_addr));      // Bind to well known addressint qlen = 5;                 // Value to be chosen by applicationint err = setsockopt(sfd, IPPROTO_TCP/*SOL_TCP*/, 23/*TCP_FASTOPEN*/, &qlen, sizeof(qlen));listen(sfd, 1);                // Mark socket to receive connectionscfd = accept(sfd, NULL, 0);   // Accept connection on new socketwhile(1){int len = read(cfd, buffer, 256);if(len > 0)printf("tcp fast open: %s\\n", buffer);elsebreak;// read and write data on connected socket cfd}close(cfd);
}

备注:
高版本系统支持TCP_FASTOPEN_CONNECT,在内核层面支持tfo的connect处理

TCP快速连接(tfo,TCP fastopen)相关推荐

  1. tcp长连接java_JAVA TCP长连接

    做了一个指纹门锁,需要用TCP长连接进行服务端和门锁间的数据通信. 目前JAVA写socket服务端,门锁连接JAVA服务端. 服务端开了一个线程在监听门锁发来的数据(此处必须实时监听数据) 在监听的 ...

  2. TCP长连接和短连接代码及其比较

    前言: 最近又看到了关于TCP长连接和短连接的概念,以前也看过Http长连接和短连接的概念,因为Http是建立在TCP协议之上的,所以它其实是依赖TCP的长连接和短连接.所以,我就萌生了一个想法,看看 ...

  3. TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题

    近期遇到一个问题,简单点说,主机A上显示一条ESTABLISHED状态的TCP连接到主机B,而主机B上却没有任何关于主机A的连接信息,经查明,这是由于主机A和主机B的发送/接收缓冲区差异巨大,导致主机 ...

  4. TCP全连接和半连接的问题探讨

    个人博客: https://rebootcat.com/2020/11/14/tcp_accept/ 从何说起 说起 tcp 的连接过程,想必 "3次握手4次挥手"是大家广为熟知的 ...

  5. 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    1. 查看系统网络配置和当前TCP状态         在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...

  6. java nio长连接实现_kio: kio是基于jdk 1.6 nio实现的TCP长连接即时通讯框架。

    #kio: TCP长连接框架 适用于Android前端 #为何要开发kio# 由于之前开发的Android推送系统,使用HTTP实现的,随着业务的扩展,服务器的压力随之增大,开始考虑使用TCP长连接来 ...

  7. 重学TCP协议(11)TFO(Tcp Fast Open)

    1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...

  8. android连接此设备时打开,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...

    QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...

  9. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...

    QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...

最新文章

  1. offsetLeft 解析
  2. Rails之格式化价格方法
  3. 福州大学计算机专业考研,2015年福州大学计算机考研经验贴
  4. NVIDIA DLI 深度学习培训 | 北京 上海两站新年火热来袭
  5. 错误: 找不到或无法加载主类
  6. 用c语言编写函数流程,C语言课程设计————写下流程图! 谢谢
  7. WIN7安装.Net Framework 4报错的解决方法
  8. AEJoy ——表达式代码列表和示例(四)【代码详解】
  9. 从张家界火车站如何去张家界玻璃桥游玩,最详细的张家界攻略
  10. Java解P2678 [NOIP2015 提高组] 跳石头,有图有注释,通俗易懂
  11. 网友自制 MIUI 13 海报被疯传
  12. html中加入公告,添加公告.html · 举子/layuiadmin-templete - Gitee.com
  13. 保障4-0601任务打卡
  14. 连锁企业如何迈出网络运维数字化升级第一步?
  15. 金融数据python分析实例_Python金融大数据分析-蒙特卡洛仿真
  16. [ACL22] SummaReranker (Ravaut et al, 2022) 阅读笔记
  17. AR9331 SDK编译
  18. cero3.0曲面合并后阵列注意事项
  19. 顶尖项目管理高手,都在用“敏捷预算”模式!
  20. PS把证件照的蓝底换成其他底色

热门文章

  1. history of program atan2(y,x)和pow(x,y)
  2. 警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  3. 《变量:大国的腾挪》摘记
  4. 联邦学习(FL)+差分隐私(DP)
  5. NC/ncat的使用
  6. nico和niconiconi
  7. 技术普及帖:你刚才在淘宝上买了一件东西
  8. 大学物理复习笔记——静电场
  9. python @符号
  10. Android利用Cookie实现码源登录效果