从输入URL到显示网页的探索之旅

  在日常生活中,我们经常使用浏览器来查询一些资料、浏览一些网页等等,在浏览器的地址栏输入网址之后,背后发生了什么呢?今天我们就一起探索一下~

输入网址

  在此之前,我们先来接受一下网址。网址,准确的说应该叫URL(Uniform Resource Locator,统一资源定位符),通过描述资源的位置来标识资源。还不是很清楚?其实我们看到的http://开头的那一串东西就是URL,网址除了“http”开头,还有“ftp:”、“file:”等等。下面我们来看一下URL的格式:

协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

  其中用户名和密码可以省略。当协议确定后,端口号也可以省略,例如:HTTP协议默认的端口号是80,FTP协议默认的端口号是21。

浏览器解析URL

以HTTP协议为例,URL的格式如下:

http:+ // + web服务器名 + / + 目录名 + /……/ + 文件名

  其中表示数据源(文件)的路径可以省略,当省略时,会请求服务器下的默认文件,如:index.html、default.html等。当我们在输入的网址为:

http://www.google.com/chrome/intl/zh-CN/welcome.html

经浏览器解析后,该URL表示访问的是google的web服务器上位于chrome/intl/zh-CN/目录下的welcome.html文件。

向DNS服务器查询Web服务器的IP地址
  IP很重要:
  TCP/IP网络是通过IP地址来进行通信的,如何没有IP,那么就无法将消息发送给对方,就像我们想给某人打电话,需要对方的电话号码一样。
  为什么不只用IP,不用域名呢?
  IP地址的长度为32bit,通常采用点分十进制表示,最长为12位数字(比手机号码还长),不利于人类的记忆,而域名则不同,人们可以根据语义,名称来记忆。因此,网址中并没有把域名抛弃。
  为什么不只用域名,不用IP呢?
  上面提到,IP地址的长度为32bit,也就是占4个字节;而域名的长度要十几到几十字节不等,最长可达255个字节,这大大增加了网络传输的负担,增加了传送数据的时间。
  so 域名+IP味道更佳~
URL转换为IP的过程被称作解析域名。一般的步骤为:

向本地DNS服务器请求解析
本地DNS服务器向根DNS服务器、域服务器等请求解析(有递归和迭代两种方式)
本地DNS服务器在请求完成后需要缓存url和ip的映射关系

DNS解析过程

生成HTTP请求消息
  对URL进行解析之后,浏览器确定了Web服务器和文件名,通过查询DNS服务器,拿到对方的IP,接下来就是根据这些信息生成HTTP请求消息了。下面我们一起看一下HTTP请求消息的格式:

<方法><空格><URI><空格><HTTP版本>               --请求行
<字段名><字段值>                              --消息头
…
…
…
<空行>
<消息体>                                       --消息体

让我们来看一个栗子,URL如下,我们请求百度的主页面:
这里写图片描述
抓包得到请求头如下:
这里写图片描述
这里写图片描述

委托协议栈发送消息
  做完上面的事,就可以委托操作系统内部的协议栈向我们的目标通信对象发送消息了。此时操作系统会调用Socket库中的程序组件,在通信双方之间建立一条逻辑连接。从传输层的角度来看,整个通信的步骤分为以下几个阶段:

创建套接字
将管道连接到服务器端的套接字
收发数据
断开管道并删除套接字

socket : It is a data structure that is created and used by the application program. –《计算机网络》
socket:Socket库中程序组件的名称。 –《网络是怎样连接的》
套接字:在协议栈的内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如:通信对象的IP地址、端口号、通信操作的进行状态等。本来套接字就只是一个概念而已,并不存在实体,如果一定要赋予它一个实体,我们可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体。 –《网络是怎样连接的》

建立连接
TCP/IP的三次握手

第一次握手:建立连接时,客户端发送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/IP三次挥手

服务器分发数据
  当服务器接受到了客户端的请求,会检索相应的文件,读取套接字中的控制信息,将数据封装成响应消息发送给客户端。

浏览器接受响应消息并显示内容
  应用程序(l浏览器)中操作系统的协议栈中的缓冲区读取响应消息,判断响应消息中的数据属于哪些类型,如:根据响应消息开头的Content-Type头部字段的值进行判断。判断完数据类型,浏览器就可根据数据的数据类型进行显示。
例如请求百度首页后的响应头:
这里写图片描述
这里写图片描述

数据发送完毕后,断开连接
当数据发送完毕后,TCP/IP四次挥手:
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

 客户端                         服务器
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值