云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

微软云_人皮客栈百度云_限时特惠

小七 141 0

优化TCP上的TLS以减少延迟

互联网的分层特性(HTTP位于某些可靠传输(如TCP)之上,TCP位于某些数据报层(如IP)之上,IP位于某些链路(如以太网)之上)的发展过程中非常重要。随着时间的推移,不同的链路层来了又去了(有没有读者还在使用802.5?)这种灵活性还意味着,从您的web浏览器连接可能会通过WiFi穿越家庭网络,然后沿着DSL线路,穿过光纤,最后通过以太网传输到web服务器。每一层都非常幸运地不知道它下面的层的实现。但这种模式也有一些缺点。对于TLS(在Internet上发送加密数据的最常用标准,以及浏览器访问https://web站点时使用的协议),TLS在TCP之上的分层可能会导致web页面的传递延迟。这是因为TLS将正在传输的数据分成固定(最大)大小的记录,然后将这些记录交给TCP进行传输。TCP会立即将这些记录分成若干段,然后再进行传输。最终,这些段被发送到穿越互联网的IP包中。为了防止因特网上的拥塞并确保可靠的传输,TCP在等待接收者确认已经接收到段之前只发送有限数量的段。此外,TCP保证将段传递给应用程序。因此,如果一个包被丢弃在发送方和接收方之间的某个地方,那么在缓冲区可以释放给应用程序之前,可能会有一大堆段被保存在缓冲区中,等待丢失的段被重新传输。TLS和TCP对于TLS来说,这意味着跨多个TCP段分割的大记录可能会遇到意外的延迟。TLS只能处理完整的记录,因此丢失的TCP段会延迟整个TLS记录。在一个TCP连接开始时,当TCP慢启动发生时,记录可能会被分割成多个传输相对较慢的段。在TCP连接期间,TLS记录被分割成的一个段可能丢失,导致记录被延迟,直到丢失的段被重新传输。因此,最好不要使用固定的TLS记录大小,而是在底层TCP连接向上(在拥塞的情况下向下)旋转时调整记录大小。从较小的记录大小开始有助于将记录大小与TCP在连接开始时发送的段相匹配。连接运行后,记录大小可以增加。CloudFlare使用NGINX处理web请求。默认情况下,NGINX不支持动态TLS记录大小。NGINX有一个固定的TLS记录大小,默认值为16KB,可以通过ssl_buffer_size参数进行调整。NGINX中的动态TLS记录我们修改了NGINX以增加对动态TLS记录大小的支持,并且正在开源我们的补丁。你可以在这里找到它。该补丁向NGINX ssl模块添加参数。ssl_dyn_rec_size_lo:要开始的TLS记录大小。默认为1369字节(设计用于在单个TCP段中容纳整个记录:1369=1500-40(IPv6)-20(TCP)-10(时间)-61(最大TLS开销))ssl_dyn_rec_size_hi:要增长到的TLS记录大小。默认为4229字节(设计为将整个记录放入3个TCP段)ssl dyn_rec峎u threshold:更改记录大小之前要发送的记录数。每个连接都以ssl yu dyn_rec_size_lo大小的记录开始。在发送ssl yu dyn_rec_threshold记录后,记录大小将增加到ssl yu dyn_rec_size_hi。在发送额外的ssl yu dyn_rec_threshold记录(大小为ssl yu dyn_rec_size_hi)之后,记录大小将增加到ssl_buffer_size。ssl yu dyn_rec_timeout:如果连接空闲时间超过此时间(以秒为单位),则TLS记录大小将减小为ssl yu dyn_rec_size_lo,并且重复上述逻辑。如果此值设置为0,则动态TLS记录大小将被禁用,而将使用固定的ssl缓冲区大小。结论我们希望人们发现我们的NGINX补丁很有用,并且很乐意听到使用它和/或改进它的人的意见。