如何降低TCP三次握手延迟负面影响

目录

一、前言

二、HTTP长连接

三、TCP FAST OPEN

四、标准TCP协议握手报文传输数据

五、参考


一、前言

        TCP传输协议是可靠性协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。建立TCP连接需要进行三次握手,而这个阶段不能用来传输有效负载数据。对于一些场景(HTTP短连接),频繁的新建TCP连接会增大任务延迟,减低通讯效率。那么如何降低TCP握手带来的负面影响呢,可以主要从两个方面考虑,首先是提高TCP连接的利用率,避免频繁的建立和断开;其次是实现握手阶段可以传输数据。下面主要是简略的介绍,详细的文档请点击第五节的参考连接。个人做的笔记,有错误或不足的可以评论区指出来,谢谢。

二、HTTP长连接

HTTP使用过程中分为短连接与长连接。

        如下图展示了 HTTP1.0 短连接的使用过程。客户端与服务器的每次通讯都需要新建TCP连接,并在通讯结束后断开连接。每次的通讯过程描述如下:

1、新建TCP连接(三次握手)

2、客户端发送请求到服务端,服务端根据请求进行回复

3、断开TCP连接(四次挥手)

        HTTP短连接通讯过程中出现大量的TCP重建过程,通讯效率很低。

        HTTP1.1响应头中引入了 connection : keep-alive 选项开关 HTTP 长连接,默认开启。HTTP长连接中减少了 TCP 连接的重建过程,即在客户端与服务端通讯过程中只需要新建一次TCP连接,并在该TCP连接上进行多次请求回复的通讯过程。在HTTP长连接通讯过程中需要TCP连接一直存活,这个主要依赖TCP的保活机制。

三、TCP FAST OPEN

        标准TCP的通讯过程是在客户端和服务端建立连接后,才可以进行send和recv,而建立连接的三次握手过程中是没有负载数据的发送。TCP FAST OPEN 通过引入 cookie 机制来提高 TCP 连接的通讯效率,实现在三次握手过程中进行有效数据传输任务。 详细文档参考RFC 7413

        具体过程如下图所示。

        在客户端与服务端初次建立连接时,第一次握手过程中cookie为空,之后服务端根据客户端IP生成 8 byte 的 cookie 并在第二次握手时返回给客户端,客户端会缓存 cookie 数据,之后在第三次握手时即可发送携带有效负载数据的应答。

        当 TCP 连接断开后,客户端需要重新与服务端建立连接时,会在第一次握手时将之前缓存的 cookie 和 有效负载数据一同发送给服务端;服务端进行验证成功后即可正常收发数据,如果验证失败(如cookie过期等)则更新cookie,并在第二次握手时告知客户端。

         TCP FAST OPEN功能由 /proc/sys/net/ipv4/tcp_fastopen 控制开关。

        服务端需要对socket设置TCP_FASTOPEN选项:

int len = 5;	//fast open 队列
setsockopt(socket, IPPROTO_TCP, TCP_FASTOPEN, &len, sizeof(len));

        客户端则可以直接使用sendto函数建立连接和发送数据

sendto(socket, data, data_len, MSG_FASTOPEN, 
      (struct sockaddr *) &serv_addr, sizeof(serv_addr));

四、标准TCP协议握手报文传输数据

TCP SYN握手报文可以传输数据吗_Netfilter,iptables/OpenVPN/TCP guard:-(-CSDN博客https://blog.csdn.net/dog250/article/details/122995484?spm=1001.2014.3001.5502

        区别于在标准TCP上添加TCP FAST OPEN选项实现握手阶段传输数据。这个大神博主,提到标准TCP协议其实是支持握手阶段携带数据传输的(不考虑安全性等因素),但由于 socket API 不支持(使用顺序必须是先连接再发送数据,根本不给在握手阶段发送的数据的机会),一直不被人了解。所以之前一直讨论的三次握手的延迟是TCP协议的缺陷就有些强人所难了,TCP协议是支持的,只是其使用实现不支持。

五、参考

TFO(tcp fast open)简介_我的人生的技术博客_51CTO博客

TCP Fast Open原理和使用_罗宾王的博客-CSDN博客_fastopen

TCP SYN握手报文可以传输数据吗_Netfilter,iptables/OpenVPN/TCP guard:-(-CSDN博客

RFC Search Detail

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值