最近在学习计算机网络,看的是《自顶向下》那本书,而且找到了国立清华大学以此书做为教材录制的公开课。不一样于一般计算机网络教学书籍的知识安排——从网络的低层次开始到高层次,本书是从高层次开始,而后深刻到低层次,其主要的优点在于可以调动学生学习的动力。对于一个学习前端的人,在看完第一章对计算机网络整体的简介后,书籍随后的第二章就开始讲解计算机网络层次中的最顶层——应用层,在此就能够接触到咱们熟悉或者应该熟悉的HTTP协议和DNS服务。前端
在学习网络过程当中,我深感仅仅看书和视频是不够的,尽管每一章都提供了实践题目,可是其知识点过于针对性,没法使各个部分的知识串联起来。在我看来,把知识串联起来是学习网络很是重要的一环,为了达到这个目的,我发现回答 当你在地址栏输入一个URL地址回车后,将会发生什么事情? 这个问题,是一个很是好的练习。为此我决定,每学完一个计算机网络的层次,便对这个问题进行一次回答。本次是第一次,对应到书籍上,也就是完成第二章对 应用层 的学习。浏览器
输入url(juejin.im/timeline)并回车后,浏览器会建立一个udp类型的socket。缓存
浏览器经过这个socket,向本地dns服务器发送查询请求报文(message),要求其返回域名(juejin.im)对应的ip地址服务器
通常状况下,本地dns服务器不知道域名对应ip地址,因而便向dns根服务器查询,要求其返回域名对应的ip地址cookie
根服务器经过查询,虽然没找到域名对应的ip地址,可是找到了存储以.im结尾域名对应ip地址的dns顶级域服务器,返回一个包含(name, value, type, ttl)被称为资源记录的四元组网络
其中name是juejin.im表示要查询的域名,value也是一个地址,对应着知道juejin.im对应ip的权威dns服务器的地址(顶级域服务器也没有直接给出域名对应的地址),type是NS,表示返回的是另外一个dns服务器的地址,ttl是这条记录的有效时间。socket
本地dns服务器接收到报文后,把根据报文内容,向权威dns服务发送查询请求tcp
权威dns服务器查询到对应的ip地址,一样返回包含资源记录的四元组,不一样的是,value是域名对应的ip地址。type是A,表示这条记录的内容是域名到ip的映射性能
本地dns服务器获得域名对应的ip地址,返回给浏览器建立的udp socket学习
浏览器获得域名对应的ip地址
浏览器建立了一个tcp类型的socket(下文简称为 tcp socket),向目标ip地址的80号端口发起了链接
tcp socket首先与服务器的**欢迎套接字(welcome socket)**完成三次握手
完成三次握手后,服务器会建立一个**链接套接字(connection socket)**专用于握手后的tcp socket
此时tcp链接正式创建,浏览器将经过这个tcp sokcet向服务器发送类型为请求报文的报文(message)(此报文类型由http协议规定)
请求报文通常由**请求行(request line)和多个请求头部(request header)行以及请求体(request body)**组成
请求报文至少含有请求行
请求行的格式为 method url http-version\r\n
例:GET /timeline HTTP/1.1
GET是请求方法(method),/timeline是url,HTTP/1.1是客户端使用的HTTP协议版本,\r\n表示crlf类型的换行符
服务器经过链接套接字获得tcp socket传输过来的请求报文
服务器经过分析请求报文,找到被请求的文件
服务器生成类型为响应报文的报文
响应报文通常包含状态行(status line),多个头部行(header line)和响应体(entity body)
状态行格式为http/version statusCode statusMessage
例:HTTP/1.1 200 OK
HTTP/1.1表示服务器使用的HTTP协议为1.1版本,200是本次响应的状态号码,200表示本次响应是正常的,OK是对状态号的简短解释
头部行取决于服务器的设计
响应体则是被请求对象的数据
服务器经过链接套接字返回响应报文
浏览器接收到响应报文,分析内容,渲染出来
在通常dns查询的过程当中,存在着缓存机制,不须要来回跑那么多趟,也许一次请求就拿到对应ip地址了
http协议也存在缓存相关的规定,经过设置头部和条件GET等方式,能够加快获取网页的速度
假若每个http请求都要走一次三次握手和发收报文的流程,会致使性能上的浪费以及太高的响应时间。把发出请求到收到响应的时间称为一个往返时间(RRT),三次握手会消耗一个RRT,发收报文会消耗一个RRT,对于一个含有四个图片的网页来讲,在串行请求且不复用tcp链接状况下,须要10个RRT时间才能显示完整的页面。而复用TCP链接的状况下,只须要6个RRT时间。(这里忽略了服务器处理请求的时间,而且简化了三次握手和发收报文的流程,在真实的状况下,三次握手和发收报文并非彻底割裂的两个行为,其中存在着交集)
为了尽量的简单,http协议不要求保持状态(尽管这和咱们的认知不合,好比说你在淘宝上把商品加入购物车,在另外一个电脑登录时依然存在)。我我的对此的理解时,http协议自己在设计时就没有考虑保持状态的生气,虽然http协议经过使用cookie的技术使得服务器能够区分请求的发送者,但这是在http层面上的一层进行的一种封装,服务器自己是没法经过http协议自己来区分请求者的。做为对比,ftp协议就是有状态(设计时就考虑到这点)的协议,在使用ftp协议时,须要两条tcp链接,一条用来维持状态,发出命令,一条用来传输数据。