首页 > 编程知识 正文

tcp多路复用,tcp6监听转换tcp

时间:2023-05-04 11:11:56 阅读:176036 作者:1482

一. TFO背景

在当前的web APP应用程序和we B-like APP应用程序中,数据传输通常在三次握手之后开始。 与UDP相比,RTT的延迟增加了一个。 即使当前许多APP应用程序都使用长连接来解决这种情况,但通过一定百分比的短连接,这种额外的RTT仍然会严重影响APP的延迟。 TFO是在这样的背景下被提出来的。

TFO(TCP fast open)是TCP协议的experimental update,它通过允许服务器和客户端在建立连接的握手阶段交换数据来节省APP复制RTT的延迟。 但是,因为TFO会引起几个问题,所以TCP的实现需要默认禁止TFO。 如果需要在服务端口上启用TFO功能,则必须启用APP应用程序视图。

二. TFO进程

1 .在使用tfo之前,客户端需要首先通过普通的三次握手连接获得FOC(fastopencookie )

1 .客户端发送具有Fast Open选项的SYN包,同时具有空cookie域并请求cookie

2.server生成cookie,并使用SYN-ACK软件包的Fast Open选项返回客户端

3 .客户端缓存此cookie以备将来使用TFO连接时使用

2 .执行tfo

1 .客户端发送带有数据的SYN数据包,在Fast Open选项中携带以前通过普通连接获取的cookie

2 .服务器验证此cookie。 如果此cookie有效,server将返回SYN-ACK消息,该服务器将收到的数据传递到APP应用层。 如果此cookie无效,server将丢弃SYN包中的数据,并返回SYN-ACK包以验证SYN包的序列号

如果cookie有效,则在连接完成之前,server可向客户端发送响应数据,所携带的数据量受TCP拥塞控制的限制。 (RFC5681,稍后将描述拥塞控制)。

4 .客户端发送ACK数据包以确认服务器的SYN和数据。 如果服务器未确认客户端SYN包中的数据,客户端将使用此ACK包重新发送相应的数据

4 .剩下的连接处理就像普通的TCP连接一样。 客户端获取FOC后,可以重复快速打开直到cookie过期。

在整个过程中,您会发现TFO的核心是安全的cookie,服务器使用该cookie为客户端提供身份验证。 一般来说,该cookie应该能够认证SYN包中的源IP地址,并且不能被第三方伪造。 为了确保安全,服务器必须在一段时间后创建expire之前的cookie,然后重新生成cookie。 cookie认证通过,服务器在发送SYN-ACK时,如果有要发送的数据,也可以同样携带数据。

当客户端缓存cookie时,协议建议类似地缓存最大消息大小(MSS )。 MSS表示端到端可接收的最大TCP段。 这样,客户端将成为执行TFO时SYN包可以携带的数据量的标准。 即使缓存了MSS,client SYN程序包中的数据也建议不要超过典型的MSS,即IPV4的1460字节和IPV6的1440字节。 如果没有缓存MSS,SYN包中的数据大小将限制为缺省MSS,其中IPV4为536字节(RFC 1122 ),IPV6为1220字节(RFC2460 )。

如果客户端收到来自服务器的SYN包,但在ACK之前没有自己发送的数据,或者没有ICMP错误或SYN-ACK响应,则至少需要在相应的连接路径上暂时禁止TFO功能。

在TFO场景中,客户端将在超时时重新发送SYN包,server将删除与Fast Open选项对应的数据,以便在超时时重新发送SYN-ACK消息时不会由于与TFO不兼容而导致连接建立失败

三. SYN软件包重复提交数据

在TFO下与SYN一起发送的数据可能会重复传递到APP应用层。 例如,如果不可靠的IP层,则发送方一个SYN分组被传输给两个SYN分组,但在接收方接收到第一SYN分组之后,接收方将伴随SYN的数据转发给APP应用层,此连接发送方关闭TCP连接接收方不进入TIME_WAIT保护状态(因此,如果APP应用层无法承受这种重复数据包,则无法打开TFO特性。

四. wireshark抓包

以下wireshark捕捉包仅在篇幅上简要介绍了相关的几个包。 下载并打开wireshark捕获文件后,请自行确认详细的消息内容

No1 :首先,客户端开始正常连接,给SYN软件包赋予FOC选项,并向server请求cookie。 (No1表示wireshark截图编号为No1的消息,后续文章使用同样的表达。 ) ) ) ) )。

NO2 :服务器端回复SYN-ACK包,带有FOC选项,cookie域为0x1a39d8e2100b247e

在客户端发送" hello "消息后立即关闭连接

no7 :客户端已重新启动连接,以便可以看到此SYN数据包的Len=5。 实际上发送了“世界”。 正好五字节。 请注意,随着SYN数据包发送到服务器,客户端端口在57522和第一个连接的端口57520上不同。 但是,仍然可以使用最初获取的端口

补充说明

1.TFO介绍3359 www.IETF.org/proceedings/80/slides/tcpm-3.pdf

2.RFC 741https://data tracker.IETF.org/doc/RFC 7413/include _ text=1

3 .原始RFC793协议也允许TCP在握手过程中传递数据,但在建立连接之前不能传递到APP应用层。 linux实现不支持在非TFO场景中握手期间携带数据。

来自临知笔记(Wiz )

转载于:https://www.cn blogs.com/lshs/p/6038488.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。