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

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

文章插图
- 请求新的 TCP 连接时,客户端要向服务器发送一个小的 TCP 分组(通常是 40 ~ 60 个字节) 。这个分组中设置了一个特殊的 SYN 标记,说明这是一个连接请求 。
- 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受 。
- 最后,客户端向服务器回送一条确认信息,通知它连接已成功建立
在这里我们需要注意的就是 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 允许客户端打开多条连接,并行的去执行多个 HTTP 的事务,就会出现多条线路平行的情况 。

文章插图
其实并行连接并没有说是页面的传输速度,是因为多个对象同时在进展,所以,他的速度要比叠加起来,让你在感觉上快不少 。
持久连接
HTTP 1.1 允许 HTTP 设备在事务处理结束之后 将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接 。在事务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接 。非持久连接会在每个事务结束之后关闭 。持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止 。
关于持久连接上一篇文章已经描述的很清楚了,文章链接封上【http://www.justdoJAVA.com/2019/10/13/java-Http2/】
推荐阅读
- 五分钟搞定 HTTPS 配置,手把手教
- 待到重阳日 还品观景茶
- 这可能是讲分布式系统最到位的一篇文章
- 如何将 Python 的一个类方法变为多个方法?
- 如何在Mac下生成ssh密钥?
- Nginx中配置https中引用http的问题
- 这一次,让你完全理解 HTTPS 到底是如何做到数据传输安全的
- 程序员告诉你微信营销号如何防封、解封
- 黑客是如何控制你手机的?出现这几种情况,你的手机可能已中招
- 一文教会你如何申请ios开发者账号
