TCP快速连接(tfo,TCP fastopen)
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)相关推荐
- tcp长连接java_JAVA TCP长连接
做了一个指纹门锁,需要用TCP长连接进行服务端和门锁间的数据通信. 目前JAVA写socket服务端,门锁连接JAVA服务端. 服务端开了一个线程在监听门锁发来的数据(此处必须实时监听数据) 在监听的 ...
- TCP长连接和短连接代码及其比较
前言: 最近又看到了关于TCP长连接和短连接的概念,以前也看过Http长连接和短连接的概念,因为Http是建立在TCP协议之上的,所以它其实是依赖TCP的长连接和短连接.所以,我就萌生了一个想法,看看 ...
- TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题
近期遇到一个问题,简单点说,主机A上显示一条ESTABLISHED状态的TCP连接到主机B,而主机B上却没有任何关于主机A的连接信息,经查明,这是由于主机A和主机B的发送/接收缓冲区差异巨大,导致主机 ...
- TCP全连接和半连接的问题探讨
个人博客: https://rebootcat.com/2020/11/14/tcp_accept/ 从何说起 说起 tcp 的连接过程,想必 "3次握手4次挥手"是大家广为熟知的 ...
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇
1. 查看系统网络配置和当前TCP状态 在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...
- java nio长连接实现_kio: kio是基于jdk 1.6 nio实现的TCP长连接即时通讯框架。
#kio: TCP长连接框架 适用于Android前端 #为何要开发kio# 由于之前开发的Android推送系统,使用HTTP实现的,随着业务的扩展,服务器的压力随之增大,开始考虑使用TCP长连接来 ...
- 重学TCP协议(11)TFO(Tcp Fast Open)
1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...
- android连接此设备时打开,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...
- qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...
最新文章
- offsetLeft 解析
- Rails之格式化价格方法
- 福州大学计算机专业考研,2015年福州大学计算机考研经验贴
- NVIDIA DLI 深度学习培训 | 北京 上海两站新年火热来袭
- 错误: 找不到或无法加载主类
- 用c语言编写函数流程,C语言课程设计————写下流程图! 谢谢
- WIN7安装.Net Framework 4报错的解决方法
- AEJoy ——表达式代码列表和示例(四)【代码详解】
- 从张家界火车站如何去张家界玻璃桥游玩,最详细的张家界攻略
- Java解P2678 [NOIP2015 提高组] 跳石头,有图有注释,通俗易懂
- 网友自制 MIUI 13 海报被疯传
- html中加入公告,添加公告.html · 举子/layuiadmin-templete - Gitee.com
- 保障4-0601任务打卡
- 连锁企业如何迈出网络运维数字化升级第一步?
- 金融数据python分析实例_Python金融大数据分析-蒙特卡洛仿真
- [ACL22] SummaReranker (Ravaut et al, 2022) 阅读笔记
- AR9331 SDK编译
- cero3.0曲面合并后阵列注意事项
- 顶尖项目管理高手,都在用“敏捷预算”模式!
- PS把证件照的蓝底换成其他底色
热门文章
- history of program atan2(y,x)和pow(x,y)
- 警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
- 《变量:大国的腾挪》摘记
- 联邦学习(FL)+差分隐私(DP)
- NC/ncat的使用
- nico和niconiconi
- 技术普及帖:你刚才在淘宝上买了一件东西
- 大学物理复习笔记——静电场
- python @符号
- Android利用Cookie实现码源登录效果