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 对连接上的处理 。
- 并行连接:通过多条 TCP 连接发起并发的 HTTP 请求 。
- 持久连接:重用 TCP 连接,以消除连接及关闭时延 。
- 管道化连接:通过共享的 TCP 连接发起并发的 HTTP 请求 。

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

文章插图
其实并行连接并没有说是页面的传输速度,是因为多个对象同时在进展,所以,他的速度要比叠加起来,让你在感觉上快不少 。
持久连接
HTTP 1.1 允许 HTTP 设备在事务处理结束之后 将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接 。在事务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接 。非持久连接会在每个事务结束之后关闭 。持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止 。
管道化连接(也有人称之为管线化)
HTTP/1.1 允许在持久连接上可选地使用请求管道 。这是相对于 keep-alive 连接的又一性能优化 。在响应到达之前,可以将多条请求放入队列 。当第一条请求通过网络流向地球另一端的服务器时,第二条和第三条请求也可以开始发送了 。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能 。
推荐阅读
- 你知道 HTTP 是如何使用 TCP 连接的吗?今天我就来告诉你
- 让你的Mac运行流畅的5个实用技巧
- C/C++开发环境搭建详解!10分钟带你搭建高效的开发环境
- 计算机储存数字和字符的方法你了解多少?
- 4个色彩知识,让你PS设计配色更高级
- 开淘宝店注册流程 怎样注册淘宝开店流程
- |近七成求职者向往互联网,六成因没有成长空间跳槽,你怎么看?
- 现在怎么开淘宝店 淘宝怎么开淘宝店
- 揭秘你不知道的洗发水真相
- 为什么跑高速方向盘会抖动,看完你就知道了
