HTTP深入浅出

853 阅读7分钟

开始:从输入 URL 到页面展现中间发生了什么?

  • 我们可以把大致过程分为:域名解析 ->TCP(3次握手)->建立连接 ->HTTP请求 ->后台处理请求 ->HTTP响应 ->关闭连接 (4次挥手)->解析HTML ->渲染

1、域名解析

IP地址

  • 互联网上分布着数以亿计的主机,但是他们是通过什么方式去准确的建立通信?答案是IP。每一台主机都有一个对应的IP地址,通过访问IP地址就可以准确的和另一台主机建立通信了。

域名解析系统

  • 主机之间的通信建立是通过访问IP实现的,但是IP的形式类似于(203.208.60.97)。这种数字串不便于我们的记忆。所以,我们通过域名解析系统,自动将类似与(www.baidu.com)的网址解析成对应的IP地址。

域名解析过程

  • 当我们输入(ww.baidu.com)时,系统首先会在本地浏览器查看对应缓存,从缓存中查找,如果没有搜索到,会进入
  • 本地缓存,也就是我们的host文件夹,如果还没有查找到,会进入
  • 本地服务器,比如你是学校的网络,一般就在学校。如果还没找到,
  • 首先本地服务器会向Root Server发送请求信息,然后Root Server 会返回一个gTLD(通用顶级域),接下来本地服务器会访问gTLD。gTLD会返回Name Server服务器地址,也就是你注册网络的服务器提供商的地址。最后NAME Server会把指定域名的ip发送给客户端
  • 这样域名解析就完成了。

2、TCP三次握手

下面是一张TCP三次握手的过程图

接下来是TCP报文
解释一下TCP报文中,红色部分对应(seq)。蓝色部分对应(ack)。首先我来解释一下这张报文,seq是序号字段、ack是确认号(seq+1),ACK是确认序号有效标识。SYN是同步序号标识,用来发起一个连接。其他的自行百度。

  • seq 序号字段,每一次传输的数据流都有一个序号。当数据到达目的地后,接收端会按照这个序列号把数据重新排列,保证数据的正确性。
  • ack 确认号,它是用来分辨是哪一次传输的数据流。因为我们传输的数据不仅仅是一次,为了不打乱顺序,我们会通过(ack=seq+1)来匹配对应的传输数据流。如果一个数据段一直没有被确认,它将会被要求重发。这样数据的完整性就得到了保证。
  • ACK 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。在上图中其实第一次传输时应该加上 ACK=0。
  • SYN 同步序号标志,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。所以第三次没有带上SYN。因为,不需要在连接了。

所以TCP三次连接的过程可以解释为:

  • 第一次:SYN=1 (请求连接), seq=x(传输数据流序号),ACK=0(上图没有,应该加上)。因为不需要确认数据流所以没* 有(ack)
  • 第二次:SYN=1(接受连接) ,ack=x+1(ack=seq+1)确认接受数据流,ACK=1(确认序号),seq=y(传输响应数据序号)。
  • 第三次:ack=y+1,ACK=1(确认序号),seq=x+1(因为第一次是x)。没有SYN,因为SYN这个标志位只有TCP建立连接时才被置为1。

3、HTTP请求

TCP三次握手相当于创建了一个数据流通道,HTTP请求通过这条数据通道进行传输。

HTTP数据流通过程大致可以通过TCP/IP4层模型来说明:

应用层

应用层直接和应用程序接口(比如,qq,百度),并且提供相应的网络服务,其中就包括了HTTP协议和DNS协议。DNS协议上文已经解释了,其实DNS域名解析就是存在于这一层。接下来我要说的就是HTTP协议,它是超文本传输协议,它定义了数据传输的最终形态。以下是一个简单的请求报文格式:

POST /index.html HTTP/1.1
Connection:keeep-alive
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0

Username=admin&password=admin

HTTP请求头部信息可以分为4部分:

  • 请求行,具体内容包括:动词 路径 协议/版本 如上图中的(GET /psot....)。
  • 请求头部,具体形式为:Key: value ,如上图中(Connection:keeep-alive)
  • 空格()
  • 请求数据(Username=admin&password=admin)

下面是一个简单的响应报文:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <p>this is http response</p>
</body>
</html>

HTTP响应头部信息可以分为4部分:

  • 响应行,具体内容包括:协议/版本号 状态码 状态解释 如上图中的(HTTP/1.1 200 OK.)。
  • 响应体,具体形式为:Key: value ,如上图中(Content-Encoding: gzip) 空格()
  • 响应数据(HTML代码)

传输层

网络层通过(ip协议)保证了点到点,即主机到主机之间的通信。而传输层,保证了端到端之间的通信,也就是应用进程之间的通信。(进程是程序的一次执行。比如每个IE浏览器的窗口都是一个进程实例,它们都是IE浏览器程序的一次执行。)传输层的协议主要有两种TCP/UDP

  • TCP即传输控制协议,是一个可靠的、面向连接的协议。它允许网络间两台主机之间无差错的信息传输。TCP协议还进行流量控制,以避免发送过快而发生拥塞。
  • UDP即用户数据报协议,它采用无连接的方式传送数据,也就是说发送端不关心发送的数据是否到达目标主机,数据是否出错等。收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。

所以数据流通到传输层,会将从应用层得到的数据进行分割成多个小数据包(TCP报文)。同时,标记上序号和端口号。

网络层

数据经过网络层,数据会加上IP地址,这样数据就能够实现主机与主机之间的通信。网络层的作用主要是:

  • 路由的选择,也就是传输路线的选择,存储转发,当客户端传输的数据大于转发给服务器数据的时候,可以将数据置于自己的缓存中
  • 拥塞控制,当预定的传输线路,有故障的时候,可以选择性的更换传输路线。

链路层

数据链路层在物理提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。(来自百度百科)

4.关闭连接(4次挥手)

TCP的4次挥手参考TCP报文来理解就是:

  • 第一次,客户端发送FIN=1即表示断开连接请求
  • 第二次,服务器接收到信息后发送ACK=1表示确认收到信息,同时可能存在服务器没有将数据全部传输完成所以
  • 第三次,等服务器将数据传输完成后,发送FIN=1表示可以关闭连接
  • 第四次,客户端发送ACK=1表示确认收到信息,断开连接。

关于TCP连接为什么是3次,断开需要四次

因为在断开的时候,服务器需要保证自己的数据传输完成,所以,先发送确认信号(ACK=1),等到数据传输完成才发送断开信号(FIN=1)

参考资源: