- 浏览器解析主机名
- 浏览器查询这个主机名的IP地址(DNS)
- 浏览器获得端口号
- 浏览器发起IP:port的连接
- 浏览器想服务器发送一条HTTP GET报文
- 浏览器从服务器读取HTTP响应报文
- 浏览器关闭连接
HTTP通信都是由TCP/IP承载的,TCP/IP是一种常用的分组交换网络分层协议集.TCP的数据是通过名为IP分组
(或IP数据报)的小数据块来发送的。HTTP(应用层)->TCP(传输层)->IP(网络层)->网络接口(数据链路层),
HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据之后
会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网传输,这些工作都是通过TCP/IP软件
处理的。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址,每个IP分组中都包括:
- 一个IP分组首部(通常为20字节),包含了源和目的地的IP地址,长度和其他标记
- 一个TCP段首部(通常为20字节),包含了TCP的端口号、TCP的控制标记,以及数据排序和完成性的数字值
- 一个TCP数据块(0个或多个字节)
TCP连接通过4个值识别: <源IP地址, 源端口号, 目的地IP地址, 目的地端口号>
TCP客户端和服务器是如何通过TCP套接字接口进行通信的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16客户端 服务器
S1 创建新的套接字(socket)
S2 将套接字绑定到端口上去(bind)
S3 允许套接字进行连接(listen)
S4 等待连接(accept)
C1 获取IP地址和端口号
C2 创建新的套接字(socket)
C3 连接到服务器的IP:port上去(connect)
S5 通知应用程序有连接到来
S6开始读取请求
C4 连接成功
C5 发送HTTP请求(write)
C6 等待HTTP响应(read)
S7 处理HTTP请求报文
C7 处理HTTP响应 S8 回送HTTP响应(write)
C8关闭连接(close) S9 关闭连接(close)
对TCP性能的考虑
HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能取决于底层TCP通道的性能。TCP网络的时延取决于
硬件速度、网络和服务器的负载、请求和响应报文的尺寸、以及客户端和服务器之间的距离。
最常见的TCP相关时延,包括:
- TCP连接建立握手
- TCP慢启动拥塞控制
- 数据聚集的Nagle算法
- 用于捎带的TCP延迟确认算法
- TIME_WRIT时延和端口耗尽
TCP连接的握手时延
建立一条新的TCP连接时,甚至是在发生任意数据之前,TCP软件之间会交换一系列的IP分组,对连接
的有关参数进行沟通,如果连接只是用来传送少量数据,这些交换过程就会严重降低HTTP的性能。
TCP连接握手的步骤
- 请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组,这个分组设置了一个特殊的SYN标记,说明这是一个连接请求。
- 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明请求已被接受。
- 最后,客户端向服务器回送一个确认信息,通知它连接已成功建立,现代的TCP栈都允许客户端在这个确认分组中发送数据。