计算机网络高频面试题之应用层

一、计算机网络体系结构

模型结构

1. 计算机网络结构为什么要分层呢?

  • 简化网络设计
  • 分层之后每一层都能够独立设计和维护升级,与其他层级相互独立

2.五层协议模型

  • 应用层:应用层是最接近用户的一层,通过各种协议和服务,帮助用户直接使用网络。负责不同应用进程之间的通信;
  • 传输层:保证数据在传输过程中的可靠、高效性;
  • 网络层:负责数据在传输过程中的路由和转发;
  • 数据链路层:确保相邻网络节点之间的通信可靠高效;(所谓相邻网络节点就是指直接相连的设备或者是在同一局域网内部的网络设备);有一点需要注意:传输层和数据链路层都是保证数据的可靠高效传输,只不过他们的范围不同,传输层是保证端到端之间的传输,而数据链路层是局域网内部的数据传输
  • 物理层:物理层保证原始比特流在物理介质中的传输,通常包含编码、调制等等;

3.数据在各层中的传输
假如说数据从一台主机的应用发送到另一台主机的应用,数据的发送过程:
发送端将应用层报文发送给传输层,传输层在附加一定的传输层信息作为首部后,在交给网络层,网络层同样添加首部信息,控制数据的路由和转发;然后交给数据链路层,在数据链路层被封装成帧,在物理层通过物理介质发送给接收方。接收方对数据的处理是相反的过程。

二、应用层

前言:首先要明白应用层所做的事情就是提供了一个用户与网络之间的桥梁,使得用户可以直接使用网络。
而应用层最重要的一个东西叫做应用程序,目前的应用程序都是C/S架构,即应用程序包括三个部分:客户端、服务器以及应用层通信协议;所谓客户端实际上就是用户和应用程序之间的接口,可以帮助用户使用应用程序,其次服务器可以处理客户端发送的请求,访问数据库中的资源,并返回响应,即客户端需要的资源返回给客户端。最后是通信协议,应用层通信协议规定了客户端和服务器之间的数据传输规则和格式。

  • 需要注意的是实际上C/S架构又可以细分为C/S架构和B/S架构,这两种架构根据客户端类型进行划分:本地客户端和浏览器
  • 所以有一种说法就是应用层协议就是负责不同应用进程之间的通信,即网络应用中的服务器和客户端之间的通信

接下来就是常见的应用层协议:

1. DNS(域名系统)
在与互联网中的某台主机进行通信时必须要输入对方的IP地址,但是由于IP地址为32位的二进制主机地址难以记忆,即使是点分十进制也不太容易记住,所以考虑使用主机的域名;而DNS协议就是将域名转换为IP地址的一种协议;
下面要讨论的就是DNS解析域名的过程:

  • 主机向本地DNS服务器查询IP地址一般采用递归查询,本地首先会查看本地host文件中是否有域名对应IP地址的缓存,如果没有,那么主机就会向本地DNS服务器发起查询请求,如果本地DNS服务器中没有对应的IP地址,本地DNS服务器会代替主机成为DNS客户,然后向根域名服务器发送查询请求,根域名服务器会指向该域名存在于哪一个顶级域名服务器中,然后本地域名服务器会向顶级域名服务器发送查询请求,顶级域名服务器会指向具体的权限域名服务器,这个权限域名服务器中就会告诉本地域名服务器,所查询的主机的地址;
    下面是域名系统的结构:
    在这里插入图片描述
    此外还需要注意的是DNS既使用udp协议又使用tcp协议:一般情况下默认使用UDP协议,在数据传输长度大于512字节时,就会使用TCP协议进行传输。

2.HTTP协议(超文本传输协议)
定义:HTTP协议规定了浏览器向服务器获取资源以及服务器如何向浏览器返回资源的方法;HTTP协议是服务器与浏览器之间通信的基础;

HTTP协议的工作流程:

  1. 首先用户在浏览器中输入url,浏览器利用DNS协议进行域名解析,获得服务器的IP地址;
  2. 然后浏览器就会与服务器之间建立TCP连接(三次握手过程);
  3. 浏览器会向服务器发送HTTP请求,请求所需要的资源;
  4. 服务器接收到请求并处理请求,并返回浏览器方所需要的资源;
  5. 浏览器接收到资源之后,会解析HTML、CSS、JavaScript内容,并进行页面渲染;
  6. 页面渲染完成以后用户可以在页面上上传表单等操作
  7. 最后断开连接;

HTTP协议的特点:
1.从上面的工作流程可以看出,HTTP协议使用了面向连接的TCP协议作为传输层协议,保证了数据的可靠传输;
2.HTTP是面向无连接的,无需建立HTTP连接;
3.HTTP是无状态的,即同一用户多次访问相同资源,得到的响应是相同的;
4.HTTP的连接管理:HTTP/1.0是默认短连接的,也就是说,浏览器每次发送一个新的HTTP请求时就会重新建立一次TCP连接;HTTP/1.1解决了这个问题,在HTTP/1.1中默认是长连接的,也就是说在浏览器发送请求之后的一段时间内,仍然保持这个TCP连接,后续的HTTP请求仍然可以使用这个TCP连接,除此之外,HTTP/1.1协议的长连接有两种工作方式,非流水线方式和流水线方式,非流水线方式就是浏览器收到响应之后才能发送下一个请求,而流水线方式可以连续发送HTTP请求,请求到达服务器之后,服务器也可以连续返回响应数据;

HTTP的报文结构
HTTP的报文有两种,请求报文和响应报文;
(1)请求报文:
下面是一个完整的HTTP请求报文的实例:

GET https://leetcode.cn/problemset/all/ HTTP/1.1.  
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-    
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: leetcode.cn
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx

param1=1&param2=2

第一部分:请求行,请求方法请求URIHTTP版本
第二部分,请求首部:
第三部分:内容实体,在GET请求中,通常不会包含请求体。

(2)响应报文
响应报文也同样分成三个部分:
第一部分是状态行,包含HTTP协议版本(HTTP/1.1),状态码(200),状态码描述(例如‘OK’,‘Not Found’,等等)
第二部分是响应头部,常见的响应头部字段包括:
第三部分也是内容实体,主要是实际的HTML内容;
下面也是一个响应报文实例:

HTTP/1.1 200 OK //状态行
Date: Sun, 26 Jun 2023 10:20:30 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 3056
Server: Apache/2.4.41 (Ubuntu)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
Cache-Control: max-age=3600
Last-Modified: Fri, 24 Jun 2023 10:20:30 GMT   //响应头

<!DOCTYPE html>
<html>
<head>
    <title>Example Domain</title>
</head>
<body>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents.</p>
</body>
</html>//响应实体:HTML内容

(3)HTTP报文中常用的请求方法、状态码、报文头部字段
常用的请求方法
在这里插入图片描述
常用的状态码
在这里插入图片描述
这里只需要记住几个特定的状态码:
200:成功返回响应
301:永久重定向,客户端第一次访问此 url 时,告知客户端以后直接访问新的 url,该状态保存在浏览器缓存中。
302;临时重定向,客户端每次访问此 url 时,告知客户端重定向到新的 url ,后续访问依然访问当前的 url。
400:发送的请求错误,请求格式错误,或者没有服务器要求的数据。
401:没有权限访问,当前用户没有权限访问此资源。
403: 请求被服务器禁止。
404:请求的 url 不存在,一般是 url 出错。
500: 服务器处理请求出现错误。
501:服务器超出能力之外的方法,例如:请求的方法服务器不支持。
504:来自网关或者代理服务器,请求资源服务器时超时。

常用的报文头部:
HTTP有四种类型的头部,主要是通用首部,请求首部、响应首部,实体首部;
四种常用首部如下所示:通用首部,即响应报文和请求报文都可以使用这三个首部
请求头
响应头
请求方法GET和POST有什么区别?
首先GET请求是浏览器向服务器获取资源,而POST是浏览器向服务器上传资源;
GET请求的安全性较差,并且长度受限,而POST安全性高,长度不受限制
GET是幂等的,但是POST不是;

HTTP中的缓存策略有哪些?
强缓存和协商缓存;
强缓存:在HTTP/1.1中,依赖于响应头中的cash_control字段,其中max_age定义了当前资源的最大保留时间(以秒为单位),如果没有超过该时间范围,浏览器可以直接使用该资源,如果超过,就要进行协商缓存;

需要注意:在HTTP/1.0中是否使用强缓存依赖于Expires字段,这个字段记录了缓存的截止日期,但在HTTP/1.1中已被Cache-Control: max-age所取代。然而,为了向后兼容,仍可以使用Expires。

协商缓存:如果强缓存失效的话,浏览器会向服务器发送请求,这个请求中包含了字段If-Modified-Since字段,这个字段是上一次服务器返回的响应中Last-Modified字段的值,这个值所代表的是服务器中该资源的上一次更新的日期;服务器接收到这个请求之后,如果资源没有发生变化,就会返回响应,状态码为304 Not Modified,响应报文中不包含内容实体;如果资源更新,返回响应,状态码为200 “OK”,响应实体中包含最新的资源,响应头中包含last-Modified字段,值为最近一次更新的日期;

需要注意的是请求头中的If-None-Match和响应头中的Etag与上述两个字段的工作原理基本一致,只不过使用Etag和If-None-Match适用于高度精确的缓存控制以及需要频繁更新的资源,即使是字节级别的变化也会导致Etag发生变化;

HTTP协议各版本比较
HTTP/1.0和HTTP/1.1:
HTTP/1.1中引入了Cash-Control字段,代替原来的Expires字段,除此之外还引入Etag/If-None-Match字段,提供更加精确的缓存控制;
HTTP/1.1中将默认短连接改为默认长连接,允许在同一TCP连接中发送多个HTTP请求;

HTTP/2.0和HTTP/1.1:
HTTP/2.0首先将原来的文本协议改为二进制协议,提高了读写效率;
引入HPACK头部压缩格式,减少了传输的数据量;
此外,还允许在同一条TCP连接上并行交错的发送多个HTTP请求;

HTTPS协议工作原理:
HTTPS协议是HTTP协议的扩展版本,通过使用SSL/TLS协议对数据进行加密,保证数据的完整性和安全性;

  • 首先客户端会请求与服务器之间建立TCP连接;
  • TCP连接建立以后,需要进行SSL/TLS握手过程,这个过程是HTTPS的核心工作原理:
    客户端首先会发送ClientHello消息,包含客户端支持的SSL/TLS协议版本、加密算法、压缩方法以及一个随机数;服务器接收到信息之后,放回一个ServerHello消息,包含服务器所支持的SSL/TLS协议版本、加密算法、压缩方法以及一个随机数;然后,服务器有一对公私钥,将自己的公钥发送给客户端和服务器都信任的CA机构,CA机构使用自己的私钥对服务器的公钥进行加密,生成CA数字证书,服务器将CA数字证书发送给客户端,客户端接收到CA数字证书后,首先验证证书是否合法,如果合法就会使用CA机构的公钥解密CA数字证书,从而获得服务器的公钥,然后客户端又生成一个随机数作为预主密钥,使用服务器的公钥进行加密后发送给服务器;最后服务器和客户端使用预主密钥和最初客户端以及服务器生成的随机数共同生成了一个主密钥。最后客户端与服务器互发Finished消息,完成SSL/TLS握手过程;
  • 最后通信双方按照主密钥进行加密通信;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值