HTTP是如何使用TCP连接( 二 )


套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进 行连接,并对数据流进行读写 。TCP API 隐藏了所有底层网络协议的握手细节,以及 TCP 数据流与 IP 分组之间的分段和重装细节 。
TCP 客户端和服务器是如何通过 TCP 套接字接口进行通信的
 

HTTP是如何使用TCP连接

文章插图
 
 
上图中说明了可以怎样通过套接字 API 来凸显客户端和服务器在实现 HTTP 事务时所应执行的步骤 。
2. TCP 连接的握手TCP 连接握手需要经过以下几个步骤 。如图所示:
HTTP是如何使用TCP连接

文章插图
 
  1. 请求新的 TCP 连接时,客户端要向服务器发送一个小的 TCP 分组(通常是 40 ~ 60 个字节) 。这个分组中设置了一个特殊的 SYN 标记,说明这是一个连接请求 。
  2. 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受 。
  3. 最后,客户端向服务器回送一条确认信息,通知它连接已成功建立
我们永远不会看到这些分组——这些分组都由 TCP/IP 软件管理,对其是不可见 的 。HTTP 程序员看到的只是创建 TCP 连接时存在的时延 。
在这里我们需要注意的就是 TCP 连接的握手时延,通常 HTTP 事务都不会交换太多数据,此时,SYN/SYN+ACK 握手(参见图中的 a 段 和图中的 b 段)会产生一个可测量的时延 。TCP 连接的 ACK 分组(参见图中的 c 段)通常都足够大,可以承载整个 HTTP 请求报文,而且很多 HTTP 服务器响应报文都可 以放入一个 IP 分组 中去(比如,响应是包含了装饰性图片的小型 html 文件,或者是对浏览器高速缓存请求产生的 304 Not Modified 响应) 。
TCP 慢启动
TCP 数据传输的性能还取决于 TCP 连接的使用期(age) 。TCP 连接会随着时间进行自 我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输 的速度 。这种调谐被称为 TCP 慢启动(slow start),用于防止因特网的突然过载和拥 塞 。
TCP 慢启动限制了一个 TCP 端点在任意时刻可以传输的分组数 。简单来说,每成功接收 一个分组,发送端就有了发送另外两个分组的权限 。如果某个 HTTP 事务有大量数据要发 送,是不能一次将所有分组都发送出去的 。必须发送一个分组,等待确认;然后可以发送 两个分组,每个分组都必须被确认,这样就可以发送四个分组了,以此类推 。这种方式被 称为“打开拥塞窗口” 。
由于存在这种拥塞控制特性,所以新连接的传输速度会比已经交换过一定量数据的、“已 调谐”连接慢一些 。由于已调谐连接要更快一些,所以 HTTP 中有一些可以重用现存连接 的工具 。
3. HTTP 连接的处理前面我们说了 TCP 连接,我们重新来分析一下 HTTP ,之前我也说过在 HTTP 1.0的时候和1.1之后,有 Keep-Alive ,关于 Keep-Alive 不懂的请翻看前面的公众号的文章内容,接下来我分几个内容给大家讲述 HTTP 对连接上的处理 。
  • 并行连接1 通过多条 TCP 连接发起并发的 HTTP 请求 。
  • 持久连接1 重用 TCP 连接,以消除连接及关闭时延 。
  • 管道化连接1 通过共享的 TCP 连接发起并发的 HTTP 请求 。
我们来看一下串行:
HTTP是如何使用TCP连接

文章插图
 
每个事务都需要(串行地建立)一条 新的连接,那么连接时延和慢启动时延就会叠加起来
并行连接就是说 HTTP 允许客户端打开多条连接,并行的去执行多个 HTTP 的事务,就会出现多条线路平行的情况 。
 
HTTP是如何使用TCP连接

文章插图
 
 
其实并行连接并没有说是页面的传输速度,是因为多个对象同时在进展,所以,他的速度要比叠加起来,让你在感觉上快不少 。
持久连接
HTTP 1.1 允许 HTTP 设备在事务处理结束之后 将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接 。在事务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接 。非持久连接会在每个事务结束之后关闭 。持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止 。
关于持久连接上一篇文章已经描述的很清楚了,文章链接封上【http://www.justdoJAVA.com/2019/10/13/java-Http2/】


推荐阅读