- 基本概念见1.5 连接
- 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。
- 一旦连接建立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失、受损或失序。尽管报文不会丢失或受损,但如果计算机或网络崩溃了,客户端和服务器之间的通信仍然会被断开。在这种情况下,会通知客户端和服务器通信中断了。
- 建立连接步骤:
1. TCP 的可靠数据管道
- HTTP 连接实际上就是 TCP 连接及其使用规则。
- TCP 为 HTTP 提供了一条可靠的比特传输管道。从 TCP 连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。TCP 会按序、无差错地承载 HTTP 数据。
2. TCP 流是分段的、由IP分组传送
- TCP 的数据是通过名为 IP 分组(或 IP 数据报)的小数据块来发送的。
- HTTP 就是“HTTP over TCP over IP”这个“协议栈”中的最顶层了。其安全版本 HTTPS 就是在 HTTP 和 TCP 之间插入了一个(称为 TSL 或 SSL 的)密码加密层。
- HTTP 和 HTTPS 网络协议栈:
- HTTP 要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连接按序传输。TCP 收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在 IP 分组中,通过因特网进行传输(见下图)。所有这些工作都是由 TCP/ IP 软件来处理的,HTTP 程序员什么都看不到。
- 每个 TCP 段都是由 IP 分组承载,从一个 IP 地址发送到另一个 IP 地址的。每个 IP 分组中都包括:
- 一个 IP 分组首部(通常为20字节),包含了源和目的 IP 地址、长度和其他一些标记;
- 一个 TCP 段首部(通常为 20 字节),包含了 TCP 端口号、TCP 控制标记,以及用于数据排序和完整性检查的一些数字值;
- 一个 TCP 数据块(0 个或多个字节)。
3. 保持 TCP 连接持续不断运行
- 在任意时刻计算机都可以有几条 TCP 连接处于打开状态。TCP 是通过端口号来保持所有这些连接持续不断地运行。
- IP 地址可以将你连接到正确的计算机,而端口号则可以将你连接到这台计算机上的正确的应用程序上去。
- TCP 连接是通过 4 个值来识别的:< 源 IP 地址、源端口号、目的 IP 地址、目的端口号 >。这一组值称为套接字。这 4 个值一起唯一地定义了一条连接。两条不同的 TCP 连接不能拥有 4 个完全相同的地址组件值(但不同连接的部分组件可以拥有相同的值)。
- 举例:
有 4 条连接:A、B、C 和 D。注意,有些连接共享了相同的目的端口号(C 和 D 都使用目的端口号 80)。有些连接使用了相同的源 IP 地址(B 和 C)。有些使用了相同的目的 IP 地址(A 和 B,C 和 D)。但没有两个不同连接所有的 4 个值都一样。
| 连接 | 源IP地址 | 源端口 | 目的IP地址 | 目的端口 |
|---|---|---|---|---|
| A | 209.1.32.34 | 2034 | 204.62.128.58 | 4133 |
| B | 209.1.32.35 | 3227 | 204.62.128.58 | 4140 |
| C | 209.1.32.35 | 3105 | 207.25.71.25 | 80 |
| D | 209.1.33.89 | 5100 | 207.25.71.25 | 80 |
4. TCP 套接字程序
- 操作系统提供了一些操纵其 TCP 连接的工具。为了更具体地说明问题,我们来看一个 TCP 编程接口:套接字程序。
- 套接字(socket):源IP地址和目的IP地址以及源端口号和目的端口号的组合。
- 下表显示了套接字 API 提供的一些主要接口。这个套接字 API 向 HTTP 程序员隐藏了 TCP 和 IP 的所有细节。套接字 API 最初是为 Unix 操作系统开发的,但现在几乎所有的操作系统和语言中都有其变体存在。
| 套接字API调用 | 描述 |
|---|---|
| s = socket() | 创建一个新的、未命名、未关联的套接字 |
| bind(s,) | 向套接字赋一个本地端口号和接口 |
| connect(s, ) | 创建一条连接本地套接字与远程主机及端口的连接 |
| listen(s,…) | 标识一个本地套接字,使其可以合法接受连接 |
| s2 = accept(s) | 等待某人建立一条到本地端口的连接 |
| n = read(s, buffer, n) | 尝试从套接字向缓冲区读取 n 个字节 |
| n = write(s, buffer, n) | 尝试从缓冲区中向套接字写入 n 个字节 |
| close(s) | 完全关闭 TCP 连接 |
| shutdown(s,) | 只关闭 TCP 连接的输入或输出端 |
| getsockopt(s,…) | 读取某个内部套接字配置选项的值 |
| setsockopt(s,…) | 修改某个内部套接字配置选项的值 |
- 套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进行连接,并对数据流进行读写。TCP API 隐藏了所有底层网络协议的握手细节,以及 TCP 数据流与 IP 分组之间的分段和重装细节。
- 通过套接字 API 来凸显客户端和服务器在实现 HTTP 事务时所应执行的步骤:

本文详细介绍了TCP连接的工作原理,包括TCP如何为HTTP提供可靠的比特传输管道,数据如何通过IP分组传输,以及如何通过端口号保持连接。TCP连接由4个值(源和目的IP地址、端口号)唯一识别,套接字API隐藏了TCP和IP的底层细节,简化了TCP编程。
756

被折叠的 条评论
为什么被折叠?



