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“连接被对端重置” 的报文。

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

  1. Linux学习笔记(四)账号管理之管理用户账号

    1.管理用户账号:每一个登录Linux操作系统的用户在系统中都应该有其对应的注册账号,这些账号记录了用户的信息,如用户名.登录口令.用户目录所在位置.所用的shell.建立时间.权限等信息.其中用户账 ...

  2. CC2640R2F学习笔记(四.电源管理:用电源管理开发应用程序)

    文章目录 前言 一.电源管理默认工作情况 1. Power Manager Initialization 2.Driver Initialization, Constraint Management, ...

  3. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  4. 文件和存储管理学习笔记-动态磁盘管理

    Server 2008 R2 文件和存储管理学习笔记-动态磁盘管理 基本磁盘是包含基本分区.扩展分区或逻辑驱动器的一种物理磁盘 动态磁盘提供了基本磁盘不提供的一些高级功能,创建无限数量卷.跨越多个磁盘 ...

  5. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  6. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  7. linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc

    linux学习笔记_09_软件包管理解析 软件包管理 软件包分类 源码包(C语言编写的源代码) linux主要由C语言来写. 源码包可以用写字板打开 脚本安装包:源码包进行再开发的源码包(提供安装界面 ...

  8. STM32F103学习笔记四 时钟系统

    STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...

  9. 华清远见fs4412开发板学习笔记(四)

    fs4412开发板学习笔记(四) 今天的课程安排 1.复习 1.1 VIM 编辑器 [1] vim + filename 打开 [2] 工作模式 命令模式 编辑模式 底行模式 [3] 模式切换 命令- ...

  10. 【http学习笔记四】安全篇

    [http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...

最新文章

  1. 二值网络--TBN: Convolutional Neural Network with Ternary Inputs and Binary Weights
  2. zookeeper代码浅析
  3. Python学习总结18:函数 参数篇
  4. SAP Cloud for Customer(C4C)和微信集成系列教程
  5. 【VScode】使用VScode 来写markdown时序图
  6. 各类木材强度_凯狄解析各类抽芯铆钉的工作原理
  7. 【前端】VUE UI的安装
  8. c语言实现输入任何十进制数,转换为相对应的2进制数 递归,我做的是这个C语言程序:采用递归方法,实现将十进制整数转换成二进制数(含整数部分与小数部分)...
  9. 11月3日云栖精选夜读:《maven实战》读书笔记2——maven安装(windows和eclipse插件)...
  10. springboot定时发送短信_阿里大于可以发送定时短信
  11. 如何知道域名是否解析成功
  12. 性能飙升160%!阿里云发布第七代ECS、云原生数据库PolarDB-X等重磅新品 | 凌云时刻...
  13. Pointnet网络结构与代码解读
  14. 数据可视化Matplotlib库
  15. 深入了解scratch中的“移动10步”和(你真的了解scratch吗?scratch初学者值得一看)
  16. 【JavaWeb】之富文本编辑器
  17. 自动创建 api 模拟数据
  18. PINN解偏微分方程实例3(Allen-Cahn方程)
  19. LaTex公式、函数、希腊字母、符号、运算符号总结
  20. 一文读懂量化数据efinance

热门文章

  1. python爬虫实战教程分享 或许你可以看一下这篇文章
  2. 年底清理垃圾了,整理了一整套python学习资料无偿送给大家
  3. 最新变体Transformer!∞-former!DeepMind 出品!
  4. 百度计算机视觉暑期实习面经(成功上岸!已拿offer)
  5. 《TensorFlow:实战Google深度学习框架》——5.3 TensorFlow中的变量初始化函数
  6. 复练-面试的科技树-我是谁、我喜欢、我能够
  7. 开发vue用什么ide_VUE项目开发前期需要准备和配置些什么环境?
  8. oracle清除bin,Oracle recyclebin详解(闪回删除的表)
  9. golang for循环_10. Go语言流程控制:for 循环
  10. pandas 空字符串与na区别_关于python:Pandas用空白/空字符串替换NaN