在广域网中是基于IP地址进行通信的。但通常客户访问的是一个网址,为此需要先得到网址对应的IP地址,这就需要域名服务系统将域名转换成IP地址。在客户端浏览器中输入网址时,浏览器会根据本地客户端DNS服务器配置,向DNS服务器获取域名对应的IP地址。
域名解析服务器是基于UDP协议实现的一个应用程序,通常通过监听53端口来获取客户端的域名解析请求。
DNS查找过程为:
浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归搜索
递归搜索过程为:从根域名服务器到顶级域名服务器到所查询的域名服务器。
2、域名服务器向客户端返回查询结果域名,从而完成域名到IP地址的转换。
3、客户端向web服务器发送HTTP请求
得到了域名对应的IP地址后客户端便可向真正的web服务器发生HTTP请求。通常一个HTTP请求格式如下:
如果浏览器存储了该域名下的cookie,那么cookie也会放入http请求中
HTTP请求是一个基于TCP协议之上的应用层协议——超文本传输协议。浏览器通过DNS获取到web服务器真的IP地址后,便向Web服务器发起TCP连接请求,通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求数据通过发送给服务器了。
TCP三次握手连接:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
4、服务器给浏览器进行一个301永久重定向响应。
IP对应的服务器很可能是代理服务器,比如输入“http://baidu.com”,而不是“http://www.baidu.com”,这两个网址对应的是同一个网页,因此通过代理服务器的方式进行重定向响应,让这两个网址访问的同一个网页。
浏览器根据重定向地址再次进行HTTP请求。
5、发送响应数据给客户端
Web服务器通常通过监听80端口来获取客户端的HTTP请求。与客户端建立好TCP连接后,Web服务器开始接受客户端发来的数据,并通过HTTP解码,从接受到的网络数据中解析出请求的url信息以前其他诸如Accept-Encoding、Accept-Language等信息。
Web服务器根据HTTP请求头的信息,得到响应数据返回给客户端。一个典型的HTTP响应头数据报如下:
至此,一个HTTP通信过程完成。web服务器会根据HTTP请求头中的Connection字段值决定是否关闭TCP链接通道,当Connection字段值为keep-alive时,web服务器不会立即关闭此连接。
6、浏览器响应过程
浏览器收到响应内容之后,生成主页框架,同时向服务端继续发送请求,请求的内容是主页里的一些资源,比如说图片、视频等。 对于静态的页面内容,浏览器通常进行缓存,对于动态的内容通常不缓存,缓存的时间也是有期限的。
浏览器向服务器发送异步请求,因为有些页面显示完成之后客户端仍需要与服务端保持联系。
整个过程结束之后,浏览器关闭TCP连接。
TCP四次挥手断开连接
假设Client端发起中断连接请求,即发送FIN报文。Server端接到FIN报文后,意思是说"Client端没有数据要发送了",但是如果Server端还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以Server端先发送ACK,告诉Client端"请求已经收到,但是Server端还没准备好,请继续等待消息"。这个时候Client端进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端"数据发送完成,准备好关闭连接"。Client端收到FIN报文后知道可以断开连接,但是怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后断开连接。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,则自身关闭连接。