在我还没有开始接触计算机和编程的时候,虽然天天上网,但仅限于输入网址→回车键→等待结果的不走心过程,脑子里从未思考过,网络上的信息传递到底经历了怎样的过程,才把结果呈现在我眼前,今天就让我们都用程序员的眼和脑来梳理一下背后的过程。
从网址到真正的IP地址
输入网址:https://www.jianshu.com/p/4aa3bb16f36c
一般情况下,网络上输入的地址都称为网址,官方的名字叫URL(Uniform Resource Locator,统一资源定位符),完整的URL的完整格式包括:协议名://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件/文件名.后缀?参数=值#标志,之所以使用它也是为了便于非专业人士记忆,就用刚刚的网址为例,它的组成包括了:
协议名称:https,每个协议有自己固定的通讯规则,所以协议主要规定了浏览器通过何种内容格式来获取想要的文件。
网络地址:www.jianshu.com(依次为 子/三级域名.二级域名.顶/一级域名),网络地址指示目标资源所在的服务器,也可用IP地址+端口号表示。
资源路径:/p/4aa3bb16f36c,以“/”开始,说明目标资源放在服务器的具体的位置,类似我们的文件路径。
将上述地址输入完毕后,浏览器首先会查看浏览器缓存,若未找到对应的IP地址,则会查看系统缓存里的host文件,会再去查找路由器缓存,若还是未找到,则通过查询DNS服务器将网址转换成网络便于读取的IP地址,这一步也叫DNS解析服务。
建立TCP连接
HTTP协议的底层依靠的是TCP连接,所以查到真正的IP地址后,浏览器会跟服务器之间建立TCP连接,TCP连接是一种面向连接的,可靠的传输协议,所以它的建立需要先进行“三次握手”,三次握手在专门讲TCP/IP协议的部分已经讲过,在此不再赘述,配置网上找的简图一张:
三次握手.png
浏览器向服务器发送HTTP请求
HTTP是网络模型里应用层的协议,HTTP协议有一套自己的通讯规则,所以在TCP建立之前,浏览器会按照http协议的规则,将需要请求的内容生成HTTP报文的格式,以这种统一规划的报文形式在网络里传输。当TCP连接的三次握手完成,代表TCP连接成功建立,浏览器就会将HTTP请求的报文发送给服务器。请求报文的格式可以大致划分为请求头和请求体,请求头包含了关键的信息:协议名称,请求方法(常用为post和get),目标URL,请求返回是否需要缓存,客户端是否需要cookie等。
按照网络模型的层次划分,HTTP协议处于应用层,在浏览器客户端的这一层来说,应用层的下面依次还有传输层(TCP),网络层(IP),数据链路层和物理层,浏览器生成的HTTP协议会在TCP连接建立好后,会加上TCP/IP两层的报文首部,IP协议的作用是把TCP分割好的数据包包装好发送给接收方,但保证数据准确送达还有需要MAC地址(物理链路层唯一性),经过ARP协议,将IP地址转换成MAC地址,拥有TCP/IP首部的数据包经由物理链路层、物理层,传给MAC地址显示的目标地。
服务器接收HTTP请求
数据包到达服务器会按照物理层、数据链路层、网络层、传输层、应用层的顺序将数据包恢复到HTTP报文的格式。
服务器响应HTTP请求并返回浏览器
服务器上的操作系统发现Tomcat监听8080端口,所以操作系统会将HTTP报文传给Tomcat,Tomcat是一个servlet容器,所谓servlet,它是运行在Web服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。Tomcat在收到HTTP请求的报文并解析后,会生成HttpServletRequest和HttpServletResponse两个对象,HttpRequestServlet封装HTTP报文的请求资源,Tomcat将HttpServletRequest对象传递给Servlet,并通过Servlet的service()方法处理请求(诸如访问数据库之类),生成的结果将由HttpServletResponse传给Tomcat,Tomcat获取内容,会生成一个HTTP响应体,响应体(包含协议版本,状态码,响应数据等)会经由服务器端的封装,经由TCP/IP,回到浏览器,浏览器再经过一层层解析,最后将响应数据渲染成页面。
关闭TCP连接
浏览器完成了一次完整的请求并收到回复,此时,TCP连接等待下一次请求或选择关闭连接,若需要关闭连接,则通过四次挥手关闭,简图如下:
四次挥手.png
网友评论