Mr.J-- HTTP学习笔记(四)-- 连接管理

TCP 为 HTTP 提供了一条可靠的比特传输管道。 从 TCP 连接一端填入的字节会从另一端以原有的顺序、 正确地传送出来。

我的专栏:  HTTP学习笔记

Web 浏览器通过 TCP 连接与 Web 服务器进行交互

TCP 会按序、 无差错地承载 HTTP 数据

TCP 的数据是通过名为 IP 分组(或 IP 数据报) 的小数据块来发送的。  其安全版本 HTTPS 就是在 HTTP 和 TCP 之间插入了一个(称为 TLS 或 SSL的) 密码加密层。

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

• 一个 IP 分组首部(通常为 20 字节) ;
• 一个 TCP 段首部(通常为 20 字节) ;
• 一个 TCP 数据块(0 个或多个字节)。

IP 首部包含了源和目的 IP 地址、 长度和其他一些标记。 TCP 段的首部包含了 TCP端口号、 TCP 控制标记, 以及用于数据排序和完整性检查的一些数字值。
TCP 是通过端口号来保持所有这些连接持续不断地运行。TCP 连接是通过 4 个值来识别的:;

< 源 IP 地址、 源端口号、 目的 IP 地址、 目的端口号 >

这 4 个值一起唯一地定义了一条连接

TCP套接字编程

套接字 API 允许用户创建 TCP 的端点数据结构, 将这些端点与远程服务器的 TCP端点进行连接, 并对数据流进行读写。

例如:

从 Web 服务器等待连接开始。 客户端根据 URL 判定出 IP地址和端口号, 并建立一条到服务器的 TCP 连接。 建立连接可
能要花费一些时间, 时间长短取决于服务器距离的远近、 服务器的负载情况, 以及因特网的拥挤程度。一旦建立了连接, 客户端就会发送 HTTP 请求, 服务器则会读取请求。 一旦服务器获取了整条请求报文,就会对请求进行处理,执行所请求的动作, 并将数据写回客户端。 客户端读取数据, 并对响应数据进行处理。

HTTP事务的时延

HTTP 事务的时延有以下几种主要原因。

(1) 客户端首先需要根据 URI 确定 Web 服务器的 IP 地址和端口号。
(2) 客户端会向服务器发送一条 TCP 连接请求,并等待服务器回送一个请求接受应答。
(3) 连接建立起来,客户端就会通过新建立的 TCP 管道来发送 HTTP 请求。
(4) Web 服务器会回送 HTTP 响应,这也需要花费时间。

常见的 TCP 相关时延

• TCP 连接建立握手;
• TCP 慢启动拥塞控制;
• 数据聚集的 Nagle 算法;
• 用于捎带确认的 TCP 延迟确认算法;
• TIME_WAIT 时延和端口耗尽。

TCP连接的握手时延

主要步骤如下

(1) 请求新的 TCP 连接时,客户端要向服务器发送一个小的TCP分组(通常是40~60 个字节)。 这个分组中设置了一个特殊的 SYN 标记, 说明这是一个连接请求。
(2) 如果服务器接受连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组, 分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受。
(3) 最后,客户端向服务器回送一条确认信息,通知它连接已成功建立。

串行事务处理时延

假设有一个包含了 3 个嵌入图片的 Web 页面。 浏览器需要发起 4 个 HTTP 事务来显示此页面:1 个用于顶层的 HTML 页面, 3 个用于嵌入的图片。 如果每个事务都需要(串行地建立) 一条新的连接, 那么连接时延和慢启动时延就会叠加起来。

并行连接

并行连接可能会提高页面的加载速度。

并行连接不一定更快, 如果并行加载多个对象, 每个对象都会去竞争这有限的带宽, 每个对象都会以较慢的速度按比例加载, 这样带来的性能提升就很小, 甚至没什么提升。但是可能让人“感觉” 更快一些。

持久连接

在事务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接。 非持久连接会在每个事务结束之后关闭。 持久连接会在不同事务之间保持打开状态, 直到客户端或服务器决定将其关闭为止。

并行连接可以提高复合页面的传输速度。 但并行连接也有一些缺点。

• 每个事务都会打开 / 关闭一条新的连接, 会耗费时间和带宽。
• 由于 TCP 慢启动特性的存在, 每条新连接的性能都会有所降低。
• 可打开的并行连接数量实际上是有限的。

管道化连接

管道化连接几条限制

• 如果 HTTP 客户端无法确认连接是持久的, 就不应该使用管道。
• 必须按照与请求相同的顺序回送 HTTP 响应。
• HTTP 客户端必须做好连接会在任意时刻关闭的准备, 还要准备好重发所有未完成的管道化请求。
• HTTP 客户端不应该用管道化的方式发送会产生副作用的请求(比如 POST)。

关闭连接

TCP连接是双向的

应用程序可以关闭 TCP 输入和输出信道中的任意一个, 或者将两者都关闭了。 套接字调用 close() 会将 TCP 连接的输入和输出信道都关闭了。 这被称作“完全关闭”。 还可以用套接字调用 shutdown() 单独关闭输入或输出信道。 这被称为“半关闭”。

关闭连接的输出信道总是很安全的。 连接另一端的对等实体会在从其缓冲区中读出所有数据之后收到一条通知, 说明流结束了, 这样它就知道你将连接关闭了。

关闭连接的输入信道比较危险, 除非你知道另一端不打算再发送其他数据了。 如果另一端向你已关闭的输入信道发送数据, 操作系统就会向另一端的机器回送一条TCP“连接被对端重置” 的报文。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值