你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

一、HTTP 是如何使用 TCP 链接的;

世界上几乎全部的 HTTP 通讯都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络设备都 在使用的一种经常使用的分组交换网络分层协议集。客户端应用程序能够打开一条 TCP/IP 连 接,链接到可能运行在世界任何地方的服务器应用程序。一旦链接创建起来了,在客户端 和服务器的计算机之间交换的报文就永远不会丢失、受损或失序。程序员

尽管报文不会丢失或受损,但若是计算机或网络崩溃了,客户端和服务器之间的通讯仍然会被断开。在这种状况下, 会通知客户端和服务器通讯中断了。编程

当浏览器收到一个 URL 的时候,会执行几个相对应的步骤,以下浏览器

  1. 浏览器解析出主机名;缓存

  2. 浏览器查询主机名的 IP 地址;安全

  3. 浏览器得到端口号;性能优化

  4. 浏览器发起对该 IP 地址对应端口号的连接;服务器

  5. 浏览器向服务器发送一条 HTTP GET报文;网络

  6. 浏览器从服务器读取 HTTP 相应报文;数据结构

  7. 浏览器关闭链接;

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

1.一、TCP 链接的基本知识并发

TCP 是可靠的数据管道

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

TCP 会按序、无差错地承载 HTTP 数据,TCP 为 HTTP 提供了一条可靠的比特传输管道。从 TCP 链接一端填入的字节会从另外一端 以原有的顺序、正确地传送出来。

TCP 流是分段的、由 IP 分组传送

TCP 的数据是经过名为 IP 分组(或 IP 数据报)的小数据块来发送的。

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

这样的话,如图 HTTP 就是 “HTTP over TCP over IP” 这个“协议栈”中的最顶层了。其安全版本 HTTPS 就是在 HTTP 和 TCP 之间插入了一个(称为 TLS 或 SSL 的)密码加密层(安全层),就是在图中的右半部分。

HTTP 要传送一条报文时,会以流的形式将报文数据的内容经过一条打开的 TCP 链接按 序传输。TCP 收到数据流以后,会将数据流砍成被称做段的小数据块,并将段封装在 IP 分组中,经过因特网进行传输,以下图中你们看到的内容:

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

每一个 TCP 段都是由 IP 分组承载,从一个 IP 地址发送到另外一个 IP 地址的。

而每一个 IP 分组中都包括:

  • 一个 IP 分组首部(一般为 20 字节);

  • 一个 TCP 段首部(一般为 20 字节);

  • 一个 TCP 数据块(0 个或多个字节)。

IP 首部包含了源和目的 IP 地址、长度和其余一些标记。TCP 段的首部包含了 TCP 端口 号、TCP 控制标记,以及用于数据排序和完整性检查的一些数字值。

保持 TCP 链接的持续不间断地运行

在任意时刻计算机均可以有几条 TCP 链接处于打开状态。TCP 是经过端口号来保持全部 这些链接的正确运行的。端口号和雇员使用的电话分机号很相似。

这就和我以前举得例子是同样的,公司的总机和你本身的座机同样,公司的总机号码能将你接到前台,而分机号 能够将你接到正确的雇员位置同样,IP 地址能够将你链接到正确的计算机,而端口号则 能够将你链接到正确的应用程序上去。TCP 链接是经过 4 个值来识别的:

源IP 地址源端口号目的IP 地址目的端口号

这 4 个值一块儿惟一地定义了一条链接。两条不一样的 TCP 链接不能拥有 4 个彻底相同的地 址组件值(但不一样链接的部分组件能够拥有相同的值)。

这里须要咱们注意的是,有些链接共享了相同的目的端口号,有些链接使用了相同的源 IP 地址,有些使用了相同的目的 IP 地址,但没有两个不一样链接全部的 4 个值都同样。

TCP 套接字

操做系统提供了一些操纵其 TCP 链接的工具。为了更具体地说明问题,咱们来看一个 TCP 编程接口,这些套接字我就不一一介绍了,我给你们一个表格,你们能够理解一下

套接字API调用 描 述
s = socket() 建立一个新的、未命名、未关联的套接字
bind(s,) 向套接字赋一个本地端口号和接口
connect(s,) 建立一条链接本地套接字与远程主机及端口的链接
listen(s,...) 标识一个本地套接字,使其能够合法接受链接
s2 = accept(s) 等待某人创建一条到本地端口的链接

套接字 API 容许用户建立 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进 行链接,并对数据流进行读写。TCP API 隐藏了全部底层网络协议的握手细节,以及 TCP 数据流与 IP 分组之间的分段和重装细节。

TCP 客户端和服务器是如何经过 TCP 套接字接口进行通讯的

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

上图中说明了能够怎样经过套接字 API 来凸显客户端和服务器在实现 HTTP 事务时所应执行的步骤。

二、TCP 链接的握手

TCP 链接握手须要通过如下几个步骤。如图所示:

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

请求新的 TCP 链接时,客户端要向服务器发送一个小的 TCP 分组(一般是 40 ~ 60 个字节)。这个分组中设置了一个特殊的 SYN 标记,说明这是一个链接请求。

  1. 若是服务器接受了链接,就会对一些链接参数进行计算,并向客户端回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明链接请求已被接受。

  2. 最后,客户端向服务器回送一条确认信息,通知它链接已成功创建

咱们永远不会看到这些分组——这些分组都由 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 中有一些能够重用现存链接 的工具。

三、HTTP 链接的处理

前面咱们说了 TCP 链接,咱们从新来分析一下 HTTP ,以前我也说过在 HTTP 1.0的时候和1.1以后,有 Keep-Alive ,关于 Keep-Alive 不懂的请翻看前面的公众号的文章内容,接下来我分几个内容给你们讲述 HTTP 对链接上的处理。

  • 并行链接:经过多条 TCP 链接发起并发的 HTTP 请求。

  • 持久链接:重用 TCP 链接,以消除链接及关闭时延。

  • 管道化链接:经过共享的 TCP 链接发起并发的 HTTP 请求。

咱们来看一下串行:

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

每一个事务都须要(串行地创建)一条 新的链接,那么链接时延和慢启动时延就会叠加起来

并行链接就是说 HTTP 容许客户端打开多条链接,并行的去执行多个 HTTP 的事务,就会出现多条线路平行的状况。

你知道 HTTP 是如何使用 TCP 链接的吗?今天我就来告诉你!

其实并行链接并无说是页面的传输速度,是由于多个对象同时在进展,因此,他的速度要比叠加起来,让你在感受上快很多。

持久链接

HTTP 1.1 容许 HTTP 设备在事务处理结束以后 将 TCP 链接保持在打开状态,以便为将来的 HTTP 请求重用现存的链接。在事务处理结束以后仍然保持在打开状态的 TCP 链接被称为持久链接。非持久链接会在每一个事务结束以后关闭。持久链接会在不一样事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。

管道化链接(也有人称之为管线化)

HTTP/1.1 容许在持久链接上可选地使用请求管道。这是相对于 keep-alive 链接的又一性能优化。在响应到达以前,能够将多条请求放入队列。当第一条请求经过网络流向地球另外一端的服务器时,第二条和第三条请求也能够开始发送了。在高时延网络条件下,这样作能够下降网络的环回时间,提升性能。

其实管道化说白了就是 传送过程当中不需先等待服务端的回应,而后又发了几条,浏览器将 HTTP 要求大批提交可大幅缩短页面的加载时间,特别是在传输延迟(lag/latency)较高的状况下(如卫星链接)。此技术之关键在于多个 HTTP 的要求消息能够同时塞入一个 TCP 分组中,因此只提交一个分组便可同时发出多个要求,借此可减小网络上多余的分组并下降线路负载。

相关文章
相关标签/搜索