HTTP-点开浏览器输入网址背后发生的那点事

 

前言

Internet最先来源于美国国防部ARPANet,1969年投入运行,到如今已有很长一段路了,各位想要了解发展史能够百度下,这里就很少说了。android

现现在当咱们想要获取一些资料,首先是打开某个浏览器,在地址栏输入地址,想要的信息出如今你的面前。web

你们有没有想过输入地址就能返回给你想要的信息是怎么实现的呢?浏览器

下面就来简单说下它的实现流程,不过在这以前先来了解下HTTP基本概念以下缓存

HTTP基本概念

在这引用http://www.zsythink.net/archives/76

这是一篇为初学者准备的文章,因此做者会尽可能从基础出发,尽可能细致的描述每个细节,以求让初学者不会一头雾水,有必定基础的同窗就不用看了,以避免浪费你的时间。服务器

 

假设博主今天春心荡漾,想要访问一些不可描述的小网站,因而,博主悄悄的打开了浏览器,在浏览器的地址栏中输入了一个小网站的网址,多线程

此处假设这个小网站的网址为 www.zsythink.net ,当博主输入了这个网址之后,浏览器中就显示了博主想要看到的内容,整个过程以下图所示。学习

   201803

那么,浏览器返回给咱们的内容是怎么产生的呢?

这些内容确定不是凭空产生的,而是有人为咱们准备了这些内容,当咱们在浏览器的地址栏中输入网址之后,网站

这些提早准备好的内容便可返回到浏览器中,以便有须要的人可以查看到这些内容,spa

而查看这些内容的人就是咱们日常所说的"客户",客户每每会经过"客户端程序"去请求、查看这些内容,.net

咱们最常使用的客户端程序就是浏览器了,因此,在以后的http相关的文章中,

若是没有特别说明,咱们所说的"客户端"就是指"浏览器",咱们使用客户端去查看咱们想要的内容,

而提供内容的一端被称为"服务端",看成为客户时,咱们须要在电脑上安装客户端软件(即浏览器),

经过客户端软件查看咱们想要的内容,而做为提供内容的人,也须要在服务端的计算机上安装对应的软件,

才能为咱们提供服务,而服务端的计算机就是咱们常说的"服务器",安装在服务器上的、为咱们提供内容的软件被称之为"web服务器软件"。

 

因此,综上所述,咱们能够了解到以下名词

注:以下名词的解释均针对http而言,在后面的文章中咱们会解释什么是http,此处不用纠结

客户端:客户端一般是指浏览器,好比谷歌浏览器、火狐浏览器、IE等,浏览器安装在客户使用的电脑上,因此,在描述http时,客户端一般也代指那些安装了浏览器的电脑。

服务端:服务端一般是指那些安装了"web服务软件"的计算机,这些服务端的计算机被称为服务器。

 

没错,聪明如你必定想到了,说白了,客户端与服务端就是两台电脑,分别安装了不一样的软件,服务端提供内容,客户端查看内容。201801

 

因此,当咱们访问网页时,大体的过程以下图所示。

 

201802

 

客户端与服务端既然可以通信,那么证实它们之间必定是经过某种方法进行沟通的,就像你我之间可以进行沟通同样。

举例说明

你和我都说汉语,因此,当我说"苹果"这个词的时候,你就会想到一种水果,或者想到一个手机品牌,

可是当我对一个美国人说"苹果"两个字时,他可能并不能理解我在说什么,由于他可能听不懂汉语,

若是我想要对他表达"苹果"这个词,我须要说"Apple",他才会明白我说的是什么,当我跟你聊天时,咱们都说汉语,

当两个美国人聊天时,他们都说英语,这样,才能有效的沟通,总之,若是想要可以顺畅的沟通,

沟通双方都必须遵照相同的协议,咱们能够把汉语理解成一种协议,把英语也理解成一种协议,

只要沟通双方都遵照相同的协议,双方就可以顺畅的沟通,只要沟通双方都遵照相同的协议,双方就可以理解对方想要作什么。

固然,之因此拿汉语、英语举例,是为了让初学者可以更加容易的理解"协议"这个词,可是请不要错误的觉得"协议"就是"语言",

之因此拿语言举例,是为了方便理解,说白了,"协议"能够理解为某种规则或者某种约定,

只要你们都严格按照这种约定行事,世界就会正常的运转,好比"红灯停,绿灯行"也能够理解为一种协议,

好比在马路上都要靠右行驶(在中国),也是一种协议,好比在小饭馆,你给老板人民币,老板给你对应的餐食,

也是一种协议,"协议"的概念稍微有一些抽象,稍微有一些宽泛,此处大概有一个印象便可,在学习的过程当中,咱们本身就会慢慢的理解它了。

 

客户端与服务端之间,也须要遵照某些相同的协议,才可以顺畅的通信,细心如你必定注意到了,我说的是"某些"协议,也就是说,双方要遵照的协议不止有一种,它们须要同时遵照多种协议,才可以正常的完成整个通信过程。

 

好比http协议,刚才已经说过,不一样的"层面"中,须要使用不一样的协议,http协议就是应用层的一种协议,http协议是什么意思呢?

http是HyperText Transfer Protocol的缩写,HyperText Transfer Protocol译为"超文本传输协议"。

从字面上理解,这种协议是用来传输"超文本"的,咱们能够暂且粗暴的将"超文本"理解成咱们所谓的"网页"(这样并不许确,可是方便理解),那么,咱们能够将http协议理解为一种"网页传输协议"。

一次完整的HTTP请求过程

web服务请求处理步骤

image

HTTP服务通讯过程

image

人性化HTTP请求相应图

图片来自:理解Http请求与响应

大体以下

域名解析 --> TCP3次握手 --> 发起http请求 --> 服务器响应http请求并传输数据 –>  浏览器解析并渲染呈现给用户 –> TCP4次挥手

域名解析

当用户在浏览器输入https://www.cnblogs.com/时,浏览器会对此域名或主机进行解析,获得对应的IP地址,那么它时怎么进行域名解析的呢?

一、首先先去本机hosts文件查找此FQDN没有没定义的指向所在的IP地址条目,若是找到,就结束解析

二、若是没有找到,回去浏览器器自己DNS缓存里去寻找,找打结束解析

三、没有找到,会去本机配置的首选DNS服务器查询,通常这是三大运营商提供的,经过UTP53端口发起请求,这个请求是递归查询,DNS服务器收到请求后,会查询自身缓存,找到条目而且没有过时,就返回给用户,结束解析。若是没有找到,它会去找根服务器,全球13个根服务器(根服务器地址本机DNS服务器内置),询问根服务器(你知不知道一个域名叫“www.cnblogs.com”的IP地址),根回复说,(我不知道此域名的IP地址,但我知道com域的IP地址,你去询问它吧),因而运行商提供的DNS服务器就去询问com这个域,(你知不知道一个叫“www.cnblogs.com”域名IP地址),com域回答你说,(我不知道此域名的IP地址,但我知道“cnblogs.com域的IP地址,你去问他吧“),这是运行商DNS服务器,对cnblogs.com域发起请求询问,(你知不知道一个叫”www.cnblogs.com“域的IP地址,它一查,发现此域,就是它负责的,就会对你说,此域是我负责的,它的IP是X.X.X.X这时运行商DNS服务器拿到地址,就会返回客户主机内核,内核再返回给浏览器,到此解析结束,进行下一步。

固然这里面还要涉及到IP –> MAC(物理地址)的解析

TCP3次握手

浏览器拿到域名对应的IP后,会拿一个随机端口向WEB服务程序80端口发起TCP请求连接

image

备注:

SYN(synchronous创建联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码)

Acknowledge number(确认号码)

举例

A : 你好我是A,你能听获得我说话吗?

B : 听到了,我是B,你能听到我说话吗?

A : 能够,听到了

好创建链接,开始聊天!

过程

第一次握手:创建链接,客户端将SYN标记为1,seq标记为x,并将SYN包发送到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN,知道客户端要创建连接,同时向客户端也发送一个SYN包(SYN=1)和一个ACK包(ACK=1),随机产生一个数seq=y,ack=x+1(客户端的seq值x加1),来确认客户端的SYN,并进入SYN_RECV;

第三次握手:客户端收到服务器发来的SYN+ACK后,确认ack值,并回复服务器端一个ACK确认,发送完毕后,双方进入ESTABLISHED状态。

三次握手成功后,开始传输数据。

一个完整的三次握手也就是 请求---应答---再次确认

连接创建成功后,就要开始下一步,传输数据

 

HTTP请求相应处理

一、创建TCP链接:

接收或拒绝链接请求

发送请求报文

image

二、接收请求:

接收客户端发来的请求报文中的信息对某资源的一次请求的过程

Web访问响应模型(Web I/O)

1)单进程I/O模型:

启动一个进程处理用户请求,并且一次只处理一个,多个请求被串行响应

2)多进程I/O模型:

并行启动多个进程,每一个进程响应一个链接请求

3)复用I/O结构:

启动一个进程,同时响应N个链接请求

实现方法:    多线程模型和事件驱动

      多线程模型: 一个进程生成N个线程,每线程响应一个链接请求

      事件驱动:    一个进程处理N个请求

4)复用的多进程I/O模型:

启动M个进程,每一个进程响应N个链接请求,同时接收M*N个请求

三、处理请求:

服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理

image

HTTP经常使用请求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

四、访问资源:

服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

资源放在服务端特定的目录下

备注:经过MAC地址和端口号肯定具体的应用程序

五、构建响应报文:

一旦Web服务器识别除了资源,就执行请求方法中描述的动做,并返回响应报文。响应报文中 包含有响应状态码、响应首部,若是生成了响应主体的话,还包括响应主体

image

六、发送响应报文

向客户端回复报文

七、记录日志:

最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

备注:这中间还要涉及到https的创建过程

数据传输完毕就要断开连接了

四次挥手

如图

image

备注:

数据传输完毕后,双方均可释放链接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,而后客户端主动关闭,服务器被动关闭。

过程

  1. 客户端进程发出链接释放报文,而且中止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即便不携带数据,也要消耗一个序号。
  2. 服务器收到链接释放报文,发出确认报文,ACK=1,ack=u+1,而且带上本身的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,可是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送链接释放报文(在这以前还须要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送链接释放报文,FIN=1,ack=u+1,因为在半关闭状态,服务器极可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的链接释放报文后,必须发出确认,ACK=1,ack=w+1,而本身的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP链接尚未释放,必须通过(最长报文段寿命)的时间后当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,当即进入CLOSED状态。一样,撤销TCB后,就结束了此次的TCP链接。能够看到,服务器结束TCP链接的时间要比客户端早一些。

 

问题1-为何链接的时候是三次握手,关闭的时候倒是四次握手?


答:

由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,

SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,

因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,

我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。

问题2-为何要三次握手

答:

为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误。

 

网上转载的例子不错:

三次握手:

A:“喂,你听获得吗?”A->SYN_SEND

B:“我听获得呀,你听获得我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:

A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,不然重说一次”我知道了”,A->CLOSED

 

参考连接

一、http://www.zsythink.net/archives/76

二、http://www.javashuo.com/article/p-ucrnmzvv-gg.html

三、https://zhuanlan.zhihu.com/p/21940234

四、https://www.jianshu.com/p/c1d6a294d3c0?from=jiantop.com

相关文章
相关标签/搜索