在浏览器端生成HTTP协议之后,虽然浏览器能够解析URL,但是浏览器并不具备将消息发送到网络中的功能,所以浏览器需要委托操作系统中一个叫做协议栈的程序发送请求,目前为止我们还有一件事需要做,那就是查询服务器对应的IP地址,IP地址由四组8比特(1字节)的数字组成,因为人们很难记住这些ip地址,所以就产生了ip地址和域名并用的情况。所以我们需要用到DNS解析域名,但是系统怎么知道去哪里找DNS服务器呢,在windows系统中实际上设置了DNS服务器的地址,因为DNS概念还要涉及到根服务器所以简单表述,不在做过多的解释。
DNS客户端(UDP协议)
4.收发消息
当浏览器委托协议栈查询到服务器IP地址之后,我们就可以收发消息了,收发操作大概分为四个部分
4.1:创建套接字(socket)
上面说到协议栈查询了域名对应的IP地址后,接着协议栈创建套接字,并申请一块内存空间,用来存储IP地址,端口号,通信操作状态,以及代表本次请求的描述符等。比如说请求发送了很久没有回应,这个时候我们不能一直等待,需要一段时间后重发。协议栈需要这些状态来判断它的进一步行动。
4.2:连接(服务器和客户端相互感知对方的存在,并初始化控制信息)
当我们创建完成套接字(socket)之后,开始尝试连接,何为连接?简单来说就是双方交互信息,你的ip地址和端口号,我的ip地址和端口号,我的syn,ack,seq。你是否收到了我的信息等,俗称三次握手过程如下:
三次握手过程
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。