http基础系列之《了解web以及网络基础》

我们一起来了解学习下http。

看完本系列,让大家对 HTTP 协议形成一个整体概念,明确设计 HTTP 的目的及意义所在,了解 HTTP 的工作机制。 同时做到对各种客户端与服务器的通信交互场 景的细节等都做到了然于心,从而在平时的开发工作中独立思考,迅速准确地定位分析由 HTTP 引发的问题,并辅以适当的方法加以解决。

先从最基础的网络知识了解。

思考

经典面试题:从地址栏输入URL到页面呈现的过程发生了什么?

大部分人都清楚, 从客户端发出请求到收到响应的开发过程, 但是中间具体发生了什么事情,大部分人就懵了。所以,跟着本系列,让我们一起去了解这个过程吧!

1、TCP/IP协议族

TCP/IP 是互联网相关的各类协议族的总称。
通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作 的。
而 HTTP 属于它内部的一个子集。


图(1.1) - TCP/IP协议族

互联网中计算机之间的通信都按照某种约定进行, 这种约定我们称为协议。上图1.1中就包含了各种通信协议。

1.1 TCP/IP协议族的分层

TCP/IP 协议族按层次分别分为以下 4 层:

  • 应用层
  • 传输层
  • 网络层
  • 数据链路层。

分层的意义在于,在规定好各层的接口之后, 我们可以自由的更改对应层的设计以及可按照层级去方便的定位问题。

各层的作用

  • 应用层:直接为应用进程提供通信服务(FTP、HTTP、DNS)
  • 传输层:提供应用程序间的数据通信 (TCP、UDP)
  • 网络层:规定传输路线, 将网络中流动的数据包发送给指定的计算机
  • 数据链路层: 又称链路层、网络接口层。处理网络的硬件部分。包括控制操作系统、硬件的设备驱 动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等 物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在 链路层的作用范围之内。

1.2 TCP/IP协议族的通信传输流

TCP/IP协议族的通信传输流

发送端从应用层按照顺序往下走。
接收端从链路层到应用层往上走。

比如HTTP请求, 也就是我们通常在发起一个网页浏览请求的操作。

  • 首先作为发送端的客户端在应用层 (HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求
  • 接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数 据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端 口号后转发给网络层
  • 在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了

接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用 层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP 请求。

http请求过程

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该 层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层 时会把对应的首部消去。 这种把数据信息包装起来的做法称为封装

1.3 与HTTP关系密切的IP、TCP、DNS

1.3.1 负责传输的IP协议

IP不同于我们常说的“IP地址”,IP是一种协议的名称。
按层次, IP协议(Internet Protocal)位于网络层。

IP协议的作用:将数据包传送到指定计算机。
而保证数据包确实传送到指定计算机的两个重要条件是:IP地址MAC地址(Media Access Control Address)。
IP地址指明了节点被分配到的地址。
MAC地址是指网卡所属的固定地址。
IP地址和MAC地址可配对。
IP地址可变, MAC地址基本不会变。

IP地址间的通信依赖MAC地址映射。
在网络上,通信的双方在同一局域网 (LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。
中转过程中:

  • 采用ARP(Address Resolution Protocol)协议对IP地址进行解析,
  • 然后根据解析出的IP地址可以反查出通信方的MAC地址。
  • 再与当前中转设备的MAC地址做比对,即可找到下一个通信节点。

在通信过程中,无论哪台计算机、哪台网络设备,它们都无法全面掌握互联网中的细节,只能粗略的获取传输路线,这种机制称为路由选择(routing)

路由选择过程

1.3.2 确保可靠性的TCP协议

可靠的传输服务:能够把数据准确、可靠的传输给对方。
按层次分,TCP协议位于传输层, 提供可靠的字节流服务

TCP协议将数据分割成报文段(segment)进行传输, 且TCP能够确认数据最终是否送达到对方。

TCP协议如何确保数据送达对方?
TCP协议采用三次握手策略(three-way handshaking)建立一个连接。

所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。
在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

因此, TCP协议将数据包发送出去之后,一定会去确认数据是否发送到对方。
握手的过程使用了TCP协议的两个标志:SYN(synchronize)和ACK(acknowledgement)

  • 发送端首先发送一个带 SYN 标志的数据包给对方。
  • 接收端收到后, 回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。
  • 最后,发 送端再回传一个带 ACK 标志的数据包,代表“握手”结束。

若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包。

三次握手过程

为什么要三次握手?
客户端和服务端都需要确认双方的发送、接收的能力都是ok的。至少需要三次才能确认。

TCP协议采用4次挥手来关闭一个连接。

  • 1、客户端想要关闭的时候,会发出一个FIN给服务端,
  • 2、服务端收到来自客户端的FIN会响应一个ACK, 至此客户端不再发送数据,但仍可接收数据。
    这时上层的应用程序会被告知另一端发起了关闭操作
  • 3、当服务端处理完请求之后, 服务端也会发送一个FIN给客户端, 表示我服务端也要关闭了。
  • 4、客户端收到来自服务端的FIN之后,会回送一个ACK给服务端表示确认收到服务端的关闭操作。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送

TCP协议使用其他手段确保通信的可靠性

  • 将数据截断为合理的长度:应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。
  • 确认响应:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。其间可能因为对包校验而产生延迟。
  • 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 接收时对包进行校验: TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
  • 对失序数据进行重新排序,然后才交给应用层:TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • 丢弃重复数据:既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
  • 流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。TCP使用的流量控制协议是可变大小的滑动窗口协议。

1.3.3 DNS服务(Domain Name System)

按层次划分, DNS服务位于应用层。提供域名到 IP 地址之间的解析服务。

计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。

主机名或者域名方便人类记忆访问, IP地址方便计算机识别。

因此, 为了人类和计算机的无障碍沟通, DNS服务就诞生了。
DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。

了解了IP 协议、TCP 协议和 DNS 服务之后, 我们看一下IP 协议、TCP 协议和 DNS 服务在使用 HTTP 协议的通信过程中各自发挥了哪些作用?

一次http请求过程

  • 首先我想访问网站,将域名发送给DNS去解析,DNS解析后将网站的IP地址返回给客户端,然后通过IP地址发起HTTP请求。
  • HTTP协议生成针对目标WEB服务器的HTTP请求报文,然后将请求报文传送给传输层
  • 此时传输层的TCP协议会将HTTP请求报文分割成报文段,这些报文段会有一个序号,这里的报文段哪一个先发送哪一个先到达,它们是按序传送的。并且建立起TCP连接,进行三次握手。
  • 接着到了网络层,此时IP协议搜索对方的地址,一边中转一边传送。然后找到了服务器上的资源
  • 此时服务器的传输层中 TCP的职责是接收到对方传送过来的报文段后,对其进行重组,这里的重组是按序号进行重组的。
  • 然后到了服务器的应用层,HTTP会对客户端请求的内容进行处理。
  • 处理完后,服务器同样会利用TCP/IP通信协议向客户端进行回传响应
  • 最后客户端收到响应后,将内容输出页面显示。即完成了一次HTTP事务。

上述过程也完整的说明了我们的思考题:从地址栏输入URL到页面呈现的过程发生了什么?现在你知道该如何完美的去回答这个问题了吗?
(不包括浏览器渲染的部分:

  • 解析DOM、CSSOM
  • 根据DOM、CSSOM计算render tree
  • 根据render tree进行layout
  • paint,至此,用户可以看到页面了)

上述了解了从请求到响应的过程, 那么在地址栏输入地址, 我们还涉及两个基础概念:URI和URL。

1.4 URI 和 URL

URL: 就是我们平时在浏览器访问的地址。

1.4.1 URI (Uniform Resource Identifier)
Uniform
规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文 环境来识别资源指定的访问方式。另外,加入新增的协议方案(如 http: 或 ftp:)也更容易。
Resource
资源的定义是“可标识的任何东西”。除了文档文件、图像或服务(例 如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另 外,资源不仅可以是单一的,也可以是多数的集合体。
Identifier
表示可标识的对象。也称为标识符。

综上, URI 就是由某个协议方案表示的资源的定位标识符

URI 用字符串标识某一互联网资源,而 URL表示资源的地点(互联网上所处的位置)。可见 URL是 URI 的子集。

URI:它是一个字符串用来标示抽象物理资源

Web上可用的每种资源( HTML文档、图像、音频、视频片段、程序等)都由一个通用资源标识符(Uniform Resource Identifier, 简称”URI”)进行定位。

URI的格式由三部分组成:

  • 访问资源的命名机制。
  • 存放资源的主机名。
  • 资源自身的名称,由路径表示。

URL的格式一般由下列三部分组成:

  • 协议(或称为服务方式);
  • 存有该资源所在的服务器的名称或IP地址(包括端口号);
  • 主机资源的具体地址。

他们的定义看起来很类似,但是有一定的差别。

URI与URL之间的联系
  • URI 属于 URL 更高层次的抽象,一种字符串文本标准。
  • 就是说,URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集
  • URI 表示请求服务器的路径,定义这么一个资源。而 URL 同时说明要如何访问这个资源(http://)。./)
  • URI可以分为URL,URN,或同时具备locators 和names特性的一个东西。URN作用就好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。”

可能看完这些概念, 还是有些绕。
个人觉得,只要记住URI是更高层次的抽象, URL是具体的访问地址。他们之间是抽象和具体的关系,应该就容易理解了。

总结

本文简单介绍了网络基础中TCP/IP协议族的分层以及每层之间的相互作用。
每层中的不同协议之间是如何协作完成一个http请求的?
了解URI、URL的定义以及他们之间的区别是什么?
你可以按照层次, 从上到下依次回顾,每层之间的作用是什么。
比如应用层有HTTP协议、DNS协议,就可以联想到DNS协议将我们平时访问的URL地址解析为对应的IP地址,然后通过IP地址发起http请求;发起请求后, 通过HTTP协议生成请求报文,然后将请求报文传送给传输层。

到了传输层, 就有TCP协议。TCP协议将请求报文进行分割等操作, 并确认报文可靠的发送到对方(三次握手过程)。

接着到了网络层,此时IP协议通过IP地址搜索对方的MAC地址(ARP协议),一边中转一边传送。然后找到了服务器上的资源(链路层)。

最后将找到的资源按照顺序进行重组,按照原路返回回传到应用层,这样就完成了一次请求到响应的过程。

下次, 我们将简单了解一下http协议结构。
我的博客地址
后续持续更新,欢迎关注~

你可能感兴趣的:(http基础系列之《了解web以及网络基础》)