关于客户端和服务器的一点知识

350 阅读7分钟

网络的基本知识

之间对于网络方面的知识一直很困惑,最近学了相关方面的知识,写出来供大家参考

http协议:计算机与计算机之间通信的一套规则, HTTP协议是位于应用层的一种协议。HTTP协议仅仅是应用层协议之一。 HTTP协议是基于TCP协议。

eg: http://127.0.0.1:5500/01-html/01-初识html.html

127.0.0.1 ip地址

5500 端口

过程是通过http协议去访问服务器中的某个文件,服务器会发出一个http响应

从输入一个网址到浏览器显示页面经历的过程

我们输入的网址只是一个域名,就是一个浏览器的别名,我们能找到某个服务器需要的是一个ip地址

1、进行DNS解析,将我们的域名转换为对应的ip地址

2、通过ip地址找到对应的服务器

3、建立TCP连接,在客户端和服务器之间建立一个连接,其中经历了三次握手

三次握手:

  1. 客户端向服务器发送一个连接请求
  2. 服务器接收到请求,并向客户端发送一个连接请求
  3. 客户端接收到连接请求

这样客户端和服务器之间就建立连接了

4、客户端向服务器发出http请求

5、服务器接收到http请求,进行处理,整合所需要的资源,将相关的资源发送给客户端

6、客户端进行资源解析、渲染,并且显示

7、TCP断开连接其中经历了四次挥手

四次挥手:

因为客户端和服务器都可以发出一个断开连接请求,所以我们称先发出请求的一方为甲方

  1. 甲方向乙方发出一个断开连接请求
  2. 乙方接收到断开连接请求
  3. 乙方向甲方发送一个断开连接请求
  4. 甲方接收到断开连接请求

为什么握手时第二步和第三步可以同时同时进行,而挥手时却不行?

答:因为握手时第二步和第三步中客户端和服务器之间并没有数据的交互,所以可以一步进行,而在挥手时当乙方接收到甲方发送的断开连接请求时,可能数据还没有传送完毕,所以不能立马断开

浏览器得到资源后是怎么渲染出来的?

首先浏览器需要打开一个选项卡,建立一个进程,进程是操作系统分配和调度资源(CPU和内存)的基本单位。就相当与一个仓库,一个进程中有多个线程,其中UI线程负责处理html和css,js线程负责处理js,js线程和ui线程是互斥的。

想让页面渲染出来就必须有渲染树

UI线程是怎么干活的:

html会建立一个DOM树;

css会建立一个css规则树;

DOM树会和css规则树混合形成一个渲染树

浏览器就可以根据渲染树将页面渲染出来

TCP/IP协议族

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

  • 应用层

应用层规定了向用户提供应用服务时通信的协议,如:

TCP/IP 协议族内预存了各类通用的应用服务协议。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中的两类以及HTTP协议。

  • 传输层

传输层对接上层应用层,提供处于网络连接中两台计算机之间的数据传输所使用的协议。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

TCP协议是全双工的,即发送数据和接收数据是同步进行的,就好像我们打电话一样,说话的同时也能听见。TCP协议在建立和断开连接时有三次握手和四次挥手,因此在传输的过程中更稳定可靠但同时就没UDP那么高效了。

UDP协议是面向无连接的,也就是说在正式传递数据之前不需要先建立连接。UDP 协议不保证有序且不丢失的传递到对端,也就是说不够稳定,但也正因如此,UDP协议比TCP更加高效和轻便。

  • 网络层

网络层规定了数据通过怎样的传输路线到达对方计算机传送给对方(IP协议等)。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的所用就是在众多的选项内选择一条传输路线。就跟携程提供的回家路线图作用一样。

  • 链路层

用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

一般的web应用的通信传输流是这样的:

img

发送端在层与层之间传输数据时,每经过一层时会被打上一个该层所属的首部信息。反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部信息去除。

https和http的区别

  • HTTP协议是运行在TCP之上的,所有传输的内容都是经过明文,HTTPS是运行在SSL/TLS之上的,SSL/TLS是运行在TCP之上的,所有传输的内容都是经过加密的
  • HTTP和HTTPS采用的是两种完全不同的连接方式,连接的端口也不一样,HTTP是80,HTTPS是443,HTTPS可以有效的防止运营商劫持,解决了防劫持的一大问题

HTTP1.0和HTTP1.1的区别

1、HTTP1.0采用的是串行连接,一个tcp连接只能对应于一个请求,当收到响应后立即断开连接,HTTP1.1采用的是长连接,只要是同一个域名发送的请求,如果客户端和服务器都不发出断开连接请求,TCP就可以保持持久连接,下一个请求就可以复用上一个请求的TCP连接,减少了每次请求握手和挥手的时间,但采用的是单线程连接,下一个请求必须在上一个请求返回一个响应后才可以执行,如果上一个请求不返回一个响应,下一个请求就不能执行,发生线头阻塞

2、HTTP1.1引入了更多的缓存控制策略,如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等

3、HTTP1.1允许范围请求,可以在请求头中加入Range头部、

4、HTTP1.1的请求和响应中都必须包含Host头部,以区分同一个物理服务器中不同虚拟主机的域名

HTTP1.1和HTTP2.0的区别

1、HTTP2.0采用多路复用

在每一个请求中都加入相应的序列标识符,浏览器可以同时发送多个请求,当服务器接收到请求后会根据序列标识符将请求报文进行重新排序,不会导致数据错乱。同时服务器也可以同时返回多个响应给浏览器,浏览器收到后会根据序列标识符重新排序至不同的请求报文,而且HTTP2.0的多个请求可以在同一连接上并行执行,即使某个连接耗时严重,也不会影响其他连接的执行

2、头部压缩

HTTP1.0的请求和响应头部带有大量的信息,并且每次请求头部都要重复发送,HTTP2.0使用encoder减少需要传输的头部的大小,通讯双方各自cache一份头部fields表,既避免了重复头部的传输,又减少了需要传输的大小

3、新的二进制格式

HTTP1.0的解析是基于文本的,基于文本的协议存在天然的缺陷,因为文本的表现形式具有多样性,想要做的全面必然要考虑非常多的方面,而二进制则只需要考虑0和1的组合,基于这种考虑HTTP2.0决定采用基于二进制的格式,方便且强大

4、服务器推送

当客户端请求一个index.html时,服务器会将与index.html相关的css/js/img等相关资源同时响应到客户端,省去了客户端重复请求和连接的步骤,极大的提升了交互的速度