您的位置:首页 > 理论基础 > 计算机网络

HTTP权威指南(读书笔记)2

2015-07-10 14:52 531 查看

第四章 链接管理

TCP连接

世界上几乎所有的HTTP 通信都是由TCP/IP 承载的,TCP/IP 是全球计算机及网络

设备都在使用的一种常用的分组交换网络分层协议集。客户端应用程序可以打开一

条TCP/IP 连接,连接到可能运行在世界任何地方的服务器应用程序。一旦连接建

立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失、受损或

失序。
TCP 为HTTP 提供了一条可靠的比特传输管道。从TCP 连接一端填入的字节会从另

一端以原有的顺序、正确地传送出来

HTTP 要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP 连

接按序传输。TCP 收到数据流之后,会将数据流砍成被称作段的小数据块,并将段

封装在IP 分组中,通过因特网进行传输。

在任意时刻计算机都可以有几条TCP 连接处于打开状态。TCP 是通过端口号来保持

所有这些连接的正确运行的。

端口号和雇员使用的电话分机号很类似。就像公司的总机号码能将你接到前台,而

分机号可以将你接到正确的雇员位置一样,IP 地址可以将你连接到正确的计算机,

而端口号则可以将你连接到正确的应用程序上去。TCP 连接是通过4 个值来识别的:

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

这4 个值一起唯一地定义了一条连接。两条不同的TCP 连接不能拥有4 个完全相同

的地址组件值(但不同连接的部分组件可以拥有相 同的值)。

套接字 API 调用 描  述

s = socket(<parameters>) 创建一个新的、未命名、未关联的套接字

bind(s,<local IP:port>) 向套接字赋一个本地端口号和接口

connect(s, <remote IP:port>) 创建一条连接本地套接字与远程主机及端口的连接

listen(s,...) 标识一个本地套接字,使其可以合法接受连接

s2 = accept(s) 等待某人建立一条到本地端口的连接

n = read(s, buffer, n) 尝试从套接字向缓冲区读取n 个字节

n = write(s, buffer, n) 尝试从缓冲区中向套接字写入n 个字节

close(s) 完全关闭TCP 连接

shutdown(s,<side>) 只关闭TCP 连接的输入或输出端

getsockopt(s,...) 读取某个内部套接字配置选项的值

setsockopt(s,...) 修改某个内部套接字配置选项的值

图4-1 显示了Web 浏览器是如何用HTTP 从Joe 的五金商店下载power-tools.html

页面的。图4-6 中的伪代码说明了可以怎样通过套接字API 来凸显客户端和服务器

在实现HTTP 事务时所应执行的步骤。

图4-6 TCP 客户端和服务器是如何通过TCP 套接字接口进行通信的

HTTP 紧挨着TCP,位于其上层,所以HTTP 事务的性能在很大程度上取决于底层

TCP 通道的性能。

本节其余部分列出了一些会对HTTP 程序员产生影响的、最常见的TCP 相关时延,

其中包括:

• TCP 连接建立握手;

• TCP 慢启动拥塞控制;

• 数据聚集的 Nagle 算法;

• 用于捎带确认的 TCP 延迟确认算法;

• TIME_WAIT 时延和端口耗尽。

如果要编写高性能的HTTP 软件,就应该理解上面的每一个因素。如果不需要进行

这个级别的性能优化,可以跳过这部分容。

TCP连接的握手时延

TCP 连接握手需要经过以下几个步骤。

(1) 请求新的TCP 连接时,客户端要向服务器发送一个小的TCP 分组(通常是40 ~

60 个字节)。这个分组中设置了一个特殊的SYN 标记,说明这是一个连接请求。

(参见图4-8a)。

(2) 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个

TCP 分组,这个分组中的SYN 和ACK 标记都被置位,说明连接请求已被接受

(参见图4-8b)。

(3) 最后,客户端向服务器回送一条确认信息,通知它连接已成功建立(参见图4-8c)。

现代的TCP 栈都允许客户端在这个确认分组中发送数据。

每个TCP 段都有一个序列号和数据完整性校验和。每个段的接收者收到完好的段

时,都会向发送者回送小的确认分组。如果发送者没有在指定的窗口时间内收到确

认信息,发送者就认为分组已被破坏或损毁,并重发数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: