HTTP 报文 是指在HTTP应用程序之间发送的数据块
TCP 为HTTP提供了一条 可靠的比特传输管道,从TCP连接一段填入的字节会从另一端以原有的顺序、正确的传送处理
TCP流是分段的,由IP分组传送
-
tcp 的数据是通过名为 IP分组(或IP数据报)的小数据块来发送的
HTTP 要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连
接按序传输。TCP 收到数据流之后,会将数据流砍成被称作段的小数据块,并将段
封装在 IP 分组中,通过因特网进行传输。所有这些工作都是由 TCP/
IP 软件来处理的,HTTP 程序员什么都看不到。每个 TCP 段都是由 IP 分组承载,从一个 IP 地址发送到另一个 IP 地址的。每个 IP
分组中都包括:
• 一个 IP 分组首部(通常为 20 字节);
• 一个 TCP 段首部(通常为 20 字节);
• 一个 TCP 数据块(0 个或多个字节)。
IP 首部包含了源和目的 IP 地址、长度和其他一些标记。TCP 段的首部包含了 TCP
端口号、TCP 控制标记,以及用于数据排序和完整性检查的一些数字值。 安全版本https 就说在http和tcp 之间掺入一个(称为TLS或SSL)的密码加密层
保持TCP连接的正确运行
- tcp是通过 端口号 来保持所有这些连接的正确运行的
通过4个值来识别:<源IP地址、源端口号、目的IP地址、目的端口号>
用TCP套接字socket编程
举例说明:
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。连接过程
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP
端点进行连接,并对数据流进行读写。TCP API 隐藏了所有底层网络协议的握手细
节,以及 TCP 数据流与 IP 分组之间的分段和重装细节
- 流程
我们从 Web 服务器等待连接(参见图 4-6,S4)开始。客户端根据 URL 判定出 IP地址和端口号,并建立一条到服务器的 TCP 连接(参见图 4-6,C3)。建立连接可能要花费一些时间,时间长短取决于服务器距离的远近、服务器的负载情况,以及因特网的拥挤程度。
一旦建立了连接,客户端就会发送 HTTP 请求(参见图 4-6,C5),服务器则会读取请求(参见图 4-6,S6)。一旦服务器获取了整条请求报文,就会对请求进行处理,执行所请求的动作(参见图 4-6,S7),并将数据写回客户端。客户端读取数据(参见图 4-6,C6),并对响应数据进行处理(参见图 4-6,C7
对TCP性能的考虑
-
tcp事务的时延
描绘了 HTTP 事务主要的连接、传输以及处理时延
注意: 与建立TCP连接,以及传输请求和响应报文的时间相比,事务处理时间可能很短;除非客户端或服务端超载,或正在处理复杂的动态资源,否则HTTP时延是由TCP网络时延造成的
HTTP 事务的时延有以下几种主要原因。
(1) 客户端首先需要根据 URI 确定 Web 服务器的 IP 地址和端口号。如果最近没有对
URI 中的主机名进行访问,通过 DNS 解析系统将 URI 中的主机名转换成一个 IP
地址可能要花费数十秒的时间 3。
(2) 接下来,客户端会向服务器发送一条 TCP 连接请求,并等待服务器回送一个请
求接受应答。每条新的 TCP 连接都会有连接建立时延。这个值通常最多只有一
两秒钟,但如果有数百个 HTTP 事务的话,这个值会快速地叠加上去。
(3) 一旦连接建立起来了,客户端就会通过新建立的 TCP 管道来发送 HTTP 请求。
数据到达时,Web 服务器会从 TCP 连接中读取请求报文,并对请求进行处理。因特网传输请求报文,以及服务器处理请求报文都需要时间。
(4) 然后,Web 服务器会回送 HTTP 响应,这也需要花费时间。
这些 TCP 网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文
的尺寸,以及客户端和服务器之间的距离。TCP 协议的技术复杂性也会对时延产生
巨大的影响。 性能聚焦区域
-
TCP连接的握手时延
TCP 连接握手需要经过以下几个步骤三次握手
(1)
请求新的 TCP 连接时,客户端要向服务器发送一个小的 TCP 分组(通常是 40 ~60 个字节)。这个分组中设置了一个特殊的 SYN 标记,说明这是一个连接请求。【对应a】
(2)
如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受【对应b】
(3)
最后,客户端向服务器回送一条确认信息,通知它连接已成功建立
现代的 TCP 栈都允许客户端在这个确认分组中发送数据。【对应c】
通常 HTTP 事务都不会交换太多数据,此时,SYN/SYN+ACK 握手(参见图 a
和图 b)会产生一个可测量的时延。TCP 连接的 ACK 分组(参见8c)通常
都足够大,可以承载整个 HTTP 请求报文 ,而且很多 HTTP 服务器响应报文都可
以放入一个 IP 分组中去(比如,响应是包含了装饰性图片的小型 HTML 文件,或
者是对浏览器高速缓存请求产生的 304 Not Modified 响应)。
最后的结果是,小的 HTTP 事务可能会在 TCP 建立上花费 50%,或更多的时间
- 延迟确认
由于因特网自身无法确保可靠的分组传输(因特网路由器超负荷的话,可以随意丢
弃分组),所以 TCP 实现了自己的确认机制来确保数据的成功传输。
每个 TCP 段都有一个序列号和数据完整性校验和。每个段的接收者收到完好的段时,都会向发送者回送小的确认分组
。如果发送者没有在指定的窗口时间内收到确认信息,发送者就认为分组已被破坏或损毁,并重发数据。
由于确认报文很小,所以 TCP 允许在发往相同方向的输出数据分组中对其进行“捎带”。TCP 将返回的确认信息与输出的数据分组结合在一起,可以更有效地利用网络。
TCP慢启动
- TCP 数据传输的性能还取决于 TCP 连接的使用期(age)。TCP 连接会随着时间进行
自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移
提高传输的速度。这种调谐被称为 TCP 慢启动(slow start),用于防止因特网的突
然过载和拥塞