http协议是基于TCP协议,具备TCP协议的所有功能。但是与一般TCP的长连接不同的是http协议往往连接时间比较短,一个请求一个响应了事。但是总所周知,TCP协议除了具备可靠的传输以外,还有拥塞控制,慢启动等策略。在当年提出这些策略的时候网速普遍较低,这些策略引起的负面影响尚不明显,然而现在的动则百兆光纤的高速网络下TCP也必须不断优化以适应现在的环境,因为从目前来看弄出第二种协议才取代TCP是不可能的。

1.增大发送窗口

TCP的慢启动就是说,协议一开始从设置发送窗口从某个数值开始,如果没有出现丢包,则发送窗口以指数级增长,一旦发生丢包那么立刻减半防止因为拥塞大量丢包。

那么问题来了,http协议很多时候传输数据量很小,当慢启动还在试探的时候整条连接就被咔嚓了,这么一来本来可以两三个包交互的过程可能被拖到了4,5,6个,网络资源得不到完美利用。因此增大TCP的初始化窗口是极为必要的,可以在较短的时间内获得极大的吞吐量以便于网络资源得到充分发挥。

Google建议TCP初始化传输窗口增大到10个MSS,差不多16K左右。据统计,百分之九十的http回包大都数都是在16K以下。

2.优化三次握手策略

TCP在建立连接的时候首先要进行三次握手,所谓的三次握手就是彼此协商好一切初始化数据。比如说初始化序列号,协商好MSS。。。但是如果放到http协议里面,本来一个请求一个响应,可能很多时候根本就是一个包来就可以了事的事,却偏偏弄成了三次握手,一个包来,回复一个ack,然后再加上4次挥手断开连接,网络资源平白无故的浪费了许多。

事实上这里如果我们能优化掉一个包,那么整个互联网上减少的数据包会少掉多少?虽说无法统计但是能想像得到。不过有一点是有统计数据的,三次握手在http协议当中占据的传输时间少则占用百分之十,多则占用百分之三十。

其实TCP协议是可以在SYN数据包当中带数据的,不过为了安全考虑必须要等到三次握手结束之后才提交给应用程序,其套接字选项是TCP_LISTEN_TFO,对于编程来说也很简单。此时TCP协议会所带的数据和生成的cookis一起发送过去,据统计采用此技术后一些门户网站延迟效率提升了近百分之四十,而linux内核从3.6版本开始也采用了此项技术。

3.尾部探测技术

据统计,TCP传输的过程中,大约有30%的链接出现过丢包的情况。而TCP协议在处理丢包主要有两种方式:
1、发送端收到重复响应出发快速重传机制,大约需要1个RTT时间
2、当重传超时时进行数据包重传,一般都是5个甚至更多的RTT时间

数据包超时重传所需要的延迟远大于快速重传机制,另外TCP丢包往往发生在数据包的尾部,而且更多是连续性丢包,此时快速重传机制很难发挥作用,绝大多数这种情况下的丢包最后都是等到超时后重传的,如果我们能优化掉这个细节点,那么http协议传输效率则会有很大提高,于是我们出现了TLP机制。

TLP机制就是尾部丢失探测Tail Loss Probe,其原理就是当出现尾部连续性丢包时,补发最后那个包,此时就可以利用快速重传来代替超时重传,从而缩短TCP数据恢复的时间。而触发快速重传机制的根本就是引入了探测包的超时时间。当网络丢包时,探测的超时先于重传超时先触发,于是使得发送端发送最后那个数据,此时就可以从服务端收到ack回包,那么中间丢掉的包就会因为进入快速重传机制而很快补上而不用等到彻底超时。

有统计表明,因为这项改进增加了百分之一不到的探测报,从而导致搜索延迟减少了百分之六,数据重传减少了百分之十以上,可见其优化效果。

高速网络下的http协议优化的更多相关文章

  1. 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)

    卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...

  2. Windows系统下的TCP参数优化

    1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...

  3. 入木三分学网络第一篇--VRRP协议详解第一篇(转)

    因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...

  4. Mysql优化系列(1)--Innodb引擎下mysql自身配置优化

    1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...

  5. CentOS服务器下对mysql的优化

    原文链接: CentOS服务器下对mysql的优化 一.mysql的优化思路 mysql的优化分为两方面: 1. 服务器使用前的优化 2. 服务使用中的优化 二.mysql的基础优化步骤 1. 硬件级 ...

  6. Windows系统下的TCP参数优化(注册表\TCPIP\Parameters)

    转自:https://blog.csdn.net/libaineu2004/article/details/49054261 Windows系统下的TCP参数优化   TCP连接的状态与关闭方式及其对 ...

  7. C#下实现的K-Means优化[1]-「离群点检测」

    资源下载 #本文PDF版下载 C#下实现的K-Means优化[1]-「离群点检测」 前言 在上一篇博文中,我和大家分享了「C # 下实现的多维基础K-MEANS聚类」的[C#下实现的基础K-MEANS ...

  8. java ->网络通信协议(UDP协议、TCP协议)

    网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规 ...

  9. SSL/TLS协议详解(下)——TLS握手协议

    本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...

随机推荐

  1. nginx启停脚本

    安装nginx时,源码包中未带官方的启动脚本,也就无法使用service nginxd start这种启动方式,查了下资料自己写了一个: #!/bin/bash #@version: #@author ...

  2. Putty 两步代理访问互联网

    工作在机房,有时需要访问外网. 此时浏览器需要使用代理服务器,访问的流程如下: 由于SERVER2不能直接访问互联网,而SERVER3可以(机房无法直接访问SERVER3)所以需要两步代理. 配置流程 ...

  3. shell脚本实现取当前时间

    shell 实现获取当前时间,并进行格式转换的方法: 1)原格式输出 2018年 09月 30日 星期日 15:55:15 CST time1=$(date) echo $time1 2)时间串输出 ...

  4. tensorflow 训练的时候loss=nan

    出现loss为nan 可能是使用了relu激活函数,导致的.因为在负半轴上输出都是0

  5. Jsoup 学习笔记

    这里写自定义目录标题 Jsoup 学习笔记 解析 HTML 的字符串解析 URL 解析 本地文件解析 解析数据 DOM 解析 使用选择器解析 选择器概述 选择器组合用法 过滤用法 修改数据 HTML ...

  6. HTTP请求默认值

    填写后,后面的请求如果对应的未填写,默认使用该参数

  7. 请求参数MD5加密---函数助手

  8. 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱

    斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...

  9. redis随记

    CONFIG REWRITE  将config文件  将服务器当前所使用的配置记录到 redis.conf 文件中.

  10. 浏览器自带记忆功能,使input颜色和字体丢失

    方法一 : 会有视觉上颜色的变化input:-internal-autofill-selected { /*内置阴影填充 背景颜色*/ box-shadow: inset 0 0 0 1000px # ...