使用浏览器访问网站是日常生活中必不可少的一件事情,当我们在浏览器地址栏中输入网址后会看到网站的内容,这个过程简单来说就是浏览器从服务器中获取网站信息,经过渲染后将效果呈现给用户,但过程细节上则包含了网络传输层的TCP协议、网络应用层的HTTP协议、SOCKET通信、服务器和客户端的开发等等技术点,涉及面比较广,对初学者来说存在一定的难度。笔者结合了自身学习的经验选取一些关键技术来和大家进行分享,对技术的原理和实现进行概括和说明。
Web访问过程浏览器访问网站总体来说可以分为以下几步:
1)第一步:浏览器向DNS服务器发起DNS请求,DNS服务器解析域名后返回域名对应的网站服务器IP地址
2)第二步:浏览器获取IP地址后向网络服务器发送一个HTTP请求
3)第三步:网络服务器解析浏览器的请求后从数据库获取资源,将生成的html文件封装至HTTP 响应包中,返回至浏览器解析
4)第四步:浏览器解析HTTP 响应后,下载html文件,继而根据文件内包含的外部引用文件、图片或者多媒体文件等逐步下载,最终将获取到的全部文件渲染成完整的网站页面。
下图抓包显示了访问“www.baidu.com”时,DNS请求和响应、HTTP请求和响应
浏览器与Web服务器之间的请求和响应是使用HTTP协议进行的,但HTTP协议只是应用层使用的协议,传输层进行的数据通信则是通过TCP协议来保证的。
TCP协议是面向连接的协议,总体包括建立连接、数据传输和关闭连接这三个过程,建立连接采用“三次握手”方式来完成,连接成功后即可发送数据,在关闭连接之前,为确保数据正确传递完毕,需要采用“四次挥手”方式关闭连接。
第一次握手:客户端发送连接请求报文段至服务器
第二次握手:服务器收到报文后确认连接请求,向客户端返回应答报文
第三次握手:客户端收到响应后检查ACK(num)和ACK(flag)值,并向服务器给出确认
完成三次握手,客户端与服务器开始传送数据
第一次挥手:客户端发送释放请求报文段至服务器,并不在发送数据
第二次挥手:服务器收到释放连接请求后向客户端返回应答报文。此时连接处于半关闭状态,即客户端不再向服务器发送数据,但如果服务器仍有数据要发送给客户端,仍可以发送,客户端只要正确收到数据,仍应向服务器发送确认
第三次挥手:若服务器不再向客户端发送数据,则服务器发送连接释放应答至客户端,关闭反方向连接
第四次挥手:客户端收到响应后向服务器给出确认,释放从服务器至客户端方向的连接
完成四次挥手,客户端与服务器全部连接完全释放
也许有人会有疑惑,为什么建立连接协议是“三次握手”,而关闭连接却是“四次挥手”呢?由于TCP连接是全双工的,当关闭连接时,服务器收到客户端的FIN报文通知,仅仅表示客户端没有数据发送给服务器,但未必服务器所有的数据都发送给了客户端,可能还需要发送一些数据后再关闭连接。所以ACK报文和FIN报文分开发送形成了“四次挥手”。
Socket编程在网络编程中不可避免地会使用到Socket编程,Socket将TCP/IP协议封装成API接口,使得程序员更方便地使用TCP/IP协议栈。Socket是以"打开—读/写—关闭"模式实现,以TCP协议通讯的Socket为例,交互流程大致如下,这里从服务器的角度对流程进行介绍:
创建socket()。socket()根据指定的协议族(IPv4/IPv6)、通信类型(TCP/UDP)在sockfs文件系统中分配一个使用socket描述字关联的资源,进程可以像访问一个已经打开的文件一样访问socket资源。
绑定bind()。bind()在这个socket上绑定一个指定的端口号和IP地址。网络通信归根结底可视为不同计算机上的进程间通讯,IP地址只能确定进程所在的计算机,而结合端口号可以唯一确定整个网络中的一个网络进程。当IP地址为INADDR_ANY(0)时,表示本地计算机的默认IP地址。
监听listen()。服务器socket端口一直处于等待状态,监听网络中所有客户端对端口号请求,随时准备接收客户端发来的连接
接受accept()。服务器socket监听到客户端请求之后,将请求放在等待队列中,accept()从等待队列中提取连接请求,创建一个新的socket进行操作,而原来所监听的socket不受影响。
读/写write()/read()。发送内容即向socket写入内容,读取内容即从socket获取内容
关闭close()。close()关闭socket。
浏览器显示的网页即为web前端界面,提供用户与网站进行交互的可视化接口,而web后端服务主要指在服务器中执行的逻辑运算和数据处理,它为前端提供着访问服务。所谓的前后端只是从代码被执行的位置来区分的,前端代码在用户面前被执行,后端代码在遥远的服务器上被执行。但是,无论前端或后端代码,都是存放在服务器上的,只是当浏览器请求的时候,从服务器发送过去而已。
通常情况下网页的实现是由HTML、CSS和Javascript三者结合完成的,HTML是一种标记语言,负责网页的结构,由HTML的标签元素和文本编写的文档可被浏览器描述为一幅网页,CSS渲染网页元素的样式,而Javascript脚本给网页增加了动态的行为,比如响应用户的行为等。当浏览器载入页面内容时,通常会从上往下顺序执行


