关闭

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

标签: 读书笔记HTTP协议
226人阅读 评论(0) 收藏 举报

第四章  链接管理

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 段都有一个序列号和数据完整性校验和。每个段的接收者收到完好的段
时,都会向发送者回送小的确认分组。如果发送者没有在指定的窗口时间内收到确
认信息,发送者就认为分组已被破坏或损毁,并重发数据。






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7538次
    • 积分:144
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:26篇
    • 译文:0篇
    • 评论:1条
    最新评论