在浏览器输入URL后,发生了什么?

  1. 浏览器解析主机名
  2. 浏览器查询这个主机名的IP地址(DNS)
  3. 浏览器获得端口号
  4. 浏览器发起IP:port的连接
  5. 浏览器想服务器发送一条HTTP GET报文
  6. 浏览器从服务器读取HTTP响应报文
  7. 浏览器关闭连接

HTTP通信都是由TCP/IP承载的,TCP/IP是一种常用的分组交换网络分层协议集.TCP的数据是通过名为IP分组
(或IP数据报)的小数据块来发送的。HTTP(应用层)->TCP(传输层)->IP(网络层)->网络接口(数据链路层),
HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据之后
会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网传输,这些工作都是通过TCP/IP软件
处理的。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址,每个IP分组中都包括:

  1. 一个IP分组首部(通常为20字节),包含了源和目的地的IP地址,长度和其他标记
  2. 一个TCP段首部(通常为20字节),包含了TCP的端口号、TCP的控制标记,以及数据排序和完成性的数字值
  3. 一个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相关时延,包括:

  1. TCP连接建立握手
  2. TCP慢启动拥塞控制
  3. 数据聚集的Nagle算法
  4. 用于捎带的TCP延迟确认算法
  5. TIME_WRIT时延和端口耗尽

TCP连接的握手时延
建立一条新的TCP连接时,甚至是在发生任意数据之前,TCP软件之间会交换一系列的IP分组,对连接
的有关参数进行沟通,如果连接只是用来传送少量数据,这些交换过程就会严重降低HTTP的性能。

TCP连接握手的步骤

  1. 请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组,这个分组设置了一个特殊的SYN标记,说明这是一个连接请求。
  2. 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明请求已被接受。
  3. 最后,客户端向服务器回送一个确认信息,通知它连接已成功建立,现代的TCP栈都允许客户端在这个确认分组中发送数据。