通过DNS解析得到了目标服务器的IP之后,接下来要做的肯定就是发起连接了。说到发起连接,最主要的是要搞清楚客户端和服务器建立的是怎样的连接。
这里不卖关子。我们都知道,HTTP并不是传输层的协议,它只是规范了客户端和服务器端的请求和应答,而数据的传输显然需要交给传输层的协议去处理,所以传输层中的TCP/IP协议族是不二之选。所以,在发送一个HTTP请求之前,客户端需要和服务器端建立一个TCP连接。因此本文介绍的“建立连接”其实就是指TCP连接。
著名的TCP连接的三次握手
SEQN = Sequence Number, ACKN = Acknowledge Number, SYN = synchronous, ACK = acknowledgement
第一次握手:
客户端向服务器端发送位码SYN=1,包含随机产生的SEQN的数据包到服务器端。
第二次握手:
服务器端收到客户端请求连接的信息后进行确认,于是产生ACKN=SEQN+1(返回给客户端校验),设置位码ACK=1,同时服务器自己还需要向客户端请求连接,固还要设置SYN=1并产生一个随机的SEQN。也就是说服务器端会返回给客户端一个包含SEQN、ACKN和位码ACK=1、SYN=1的数据包。
第三次握手:
客户端收到服务器端返回的数据包后,先校验ACKN是否正确,ACK是否为1。若没有问题,则处理服务器端提出的连接请求——即产生ACKN=SEQN+1,设置位码ACK=1发回给服务器端。等到服务器端收到了ACKN以及ACK=1的位码信息且校验无误后,客户端和服务器进入ESTABLISHED状态,并开始传输数据。
总结
其实DNS解析到发送HTTP请求之间发生的就是TCP连接的建立,而连接建立的核心就是“三次握手”。完成了TCP的三次握手后,浏览器就可以根据HTTP协议规定的那样向服务器端发送HTTP请求了。