面试题 - 计算机网络

245 阅读21分钟

最近找工作整理了一些面试题,分享给大家一起来学习。如有问题,欢迎指正。

前端面试题系列文章:

image.png

OSI七层网络模型

目的解决主机之间的网络通讯

image.png

image.png

TCP协议 和 UDP协议

  • TCP协议

    提供可靠的、面向连接的、基于流的传输服务,保证数据传输的可靠性和完整性。TCP采用三次握手建立连接,四次挥手释放连接的方式进行通信。

    特点:

    1. 面向连接:在数据传输前,必须先建立连接,并且在数据传输结束后释放连接,减少无效数据传输;
    2. 可靠性:TCP有重传机制和校验机制,确保数据传输的可靠性;
    3. 传输速度较慢:TCP对数据传输的控制和检测较多,因此在速度方面相比UDP较慢;
    4. 有序性:TCP保证数据的传输顺序不变。
  • UDP协议

    无连接的、不可靠的传输层协议。UDP直接把应用层传下来的数据分成数据报,并添加上首部后,放进一个IP包中,然后通过底层网络进行传输

    特点:

    1. 无连接:不需要建立连接,数据报文发送时已经确定目的地址和端口号;
    2. 不可靠性:UDP不会确认数据是否到达,也不会重传数据丢失的数据;
    3. 传输速度快:UDP没有数据校验和流量控制等机制,因此传输速度较快;
    4. 无序性:UDP的数据报文没有顺序之分,在接收方需要对数据进行处理和组合。
  • TCP和UDP有以下区别

    1. 连接和可靠性:TCP是面向连接的传输协议,需要先建立连接再进行数据传输,并且有重传机制和校验机制,保证数据传输的可靠性;而UDP则是无连接的传输协议,不需要建立连接,传输速度快但不可靠。
    2. 数据传输方式:TCP采用基于流的方式进行数据传输,保证数据传输的有序性和完整性;UDP则是分片进行数据传输,没有顺序之分,并且不保证数据包的完整性。
    3. 应用场景:TCP适用于对数据传输要求高、稳定性要求高的场景,如文件传输、电子邮件、网页浏览等;UDP适用于需要传输速度快、对传输质量要求较低的场景,如音视频传输、在线游戏等。

三次握手 和 四次挥手

建立一个TCP连接需要三次握手,而终止一个TCP连接要经过四次挥手。

三次握手原理:

image.png

第一次握手:客户端发送一个带有 SYN(synchronize同步)标志的数据包给服务端。
第二次握手:服务端接收成功后,回传一个带有 SYN/ACK (Acknowledgment确认)标志的数据包传递确认信息,表示我收到了。
第三次握手:客户端再回传一个带有 ACK 标志的数据包,表示我知道了,握手结束

四次挥手

image.png

第一次挥手:客户端发送一个FIN(Finish结束),用来关闭客户端到服务器的数据传送,并且指定一个序列号。客户端进入FIN_WAIT_1状态。
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为客户端的序列号值 +1 ,表明已经收到客户端的报文了,此时服务器处于 CLOSE_WAIT 状态。
第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入LAST_ACK状态。
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,确认序号为收到序号+1 ,服务器进入CLOSED状态,完成四次挥手

HTTP协议

HTTP协议(超文本传输协议HyperText Transfer Protocol),简单来说就是客户端和服务端进行数据传输的一种规则。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。

HTTP报文结构
  • 请求报文 

    是由请求行(请求方法、协议版本)、请求首部(请求URI、客户端信息等)和内容实体(用户信息和资源信息等,可为空)构成。

    image.png

  • 响应报文 

    是由状态行(协议版本、状态码)、响应首部(服务器名称、资源标识等)和内容实体(服务端返回的资源信息)构成

    image.png

  • 常用请求头

    • Accept

      Accept: application/json  浏览器可以接受服务器回发的类型为 application/json。

      Accept: */*  代表浏览器可以处理所有类型(一般浏览器发给服务器都是发这个)。

    • Accept-Encoding

      Accept-Encoding: gzip, deflate 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码)。

    • Accept-Language

      Accept-Language:zh-CN,zh;q=0.9  浏览器申明自己接收的语言。

    • Authorization

      Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l,用于提供给服务器验证身份的凭据,允许其访问受保护的资源

    • Connection

      Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

      Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

    • Host

      Host:www.baidu.com 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

    • Referer

      Referer:www.baidu.com/?start=1 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

    • User-Agent

      User-Agent:Mozilla/...,告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

    • Cookie

      Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。

    • Cache-Control

      Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能在用户间共享

      Cache-Control:public 响应会被缓存,并且在多用户间共享。正常情况, 如果要求HTTP认证,响应会自动设置为 private.

      Cache-Control:must-revalidate 响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。

      Cache-Control:no-cache 响应不会被缓存,而是实时向服务器端请求资源。

      Cache-Control:max-age=10 设置缓存最大的有效时间,但是这个参数定义的是时间大小(比如:60)而不是确定的时间点。单位是[秒 seconds]。

      Cache-Control:no-store 在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。

    • If-Modified-Since

      If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT,服务器在收到带有 If-Modified-Since 字段的请求后,会将该字段值和资源更新时间做比较,若资源没有更新,则返回 304 状态码(Not Modified)

    • If-None-Match

      If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d",服务器会比对 If-None-Match 的字段值和资源的 ETag 值, 若资源没有更新,则返回 304 状态码(Not Modified)。

    • Range

      Range:bytes=0-5 指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分

    • withCredentials

      withCredentials: true,withCredentials是XMLHttpRequest的一个属性,表示跨域请求是否提供凭据信息(cookie、HTTP认证及客户端SSL证明等)

  • 常用响应头

    • Access-Control-Allow-Origin

      Access-Control-Allow-Origin: * 号代表所有网站可以跨域资源共享,如果当前字段为那么Access-Control-Allow-Credentials就不能为true

      Access-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享

    • Access-Control-Allow-Credentials

      Access-Control-Allow-Credentials: true 是否允许发送cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。如果access-control-allow-origin为*,当前字段就不能为true

    • Access-Control-Allow-Methods

      Access-Control-Allow-Methods:GET,POST,PUT,DELETE  允许哪些方法来访问

    • Cache-Control

      Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享

      Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息。

      Cache-Control:must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。

      Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息。

      Cache-Control:max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。

      Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。

    • Content-Type

      Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

    • Content-Encoding

      Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

    • Connection

      Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。

    • Content-Range

      Content-Range: bytes 0-5/7877 指定整个实体中的一部分的插入位置,它也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。

    • Date

      Date: Tue, 03 Apr 2020 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

    • Server

      Server:Tengine/1.4.6  这个是服务器和相对应的版本,只是告诉客户端服务器信息。

    • Transfer-Encoding

      Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

    • Expires

      Expires:Sun, 1 Jan 1994 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

    • Last-Modified

      Last-Modified: Dec, 26 Dec 2019 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)

    • Etag

      ETag: "637060cd8c284d8af7ad3082f209582d" 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。

请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

  • GET: 获取资源。
  • POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • HEAD: 和GET方法一样都是从服务器端获取资源,但Head请求并不会返回请求的资源,而是只返回该资源的头部信息,常用于需要得到服务器端文件的一些元数据信息,如文件大小、类型等,而不需要实际获取文件内容本身。
  • OPTIONS: 查询特定资源支持的HTTP方法,该方法的请求不会获取资源的内容,而是用于检测服务器支持哪些方法。
  • PUT: 向指定资源位置上传其最新内容,更新资源
  • DELETE: 请求服务器删除Request-URL所标识的资源
  • TRACE: 回显服务器收到的请求,主要用于测试或诊断
  • CONNECT: 中预留给能够将连接改为管道方式的代理服务器
GET和POST请求的区别
  1. GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;POST提交:把提交的数据放置在是HTTP包的包体中。因此GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

  2. 传输数据的大小:由于特定浏览器和服务器对URL长度有限制,因此GET提交时,传输数据就会受到URL长度的限制, POST由于不是通过URL传值,理论上数据不受 限。

  3. 安全性:POST的安全性要比GET的安全性高。浏览器的历史纪录会看到访问的URL信息

HTTP状态码
  • 1xx指示信息 表示请求已接收,继续处理
  • 2xx成功 表示请求已被成功接收、理解、接受 
  • 3xx重定向 要完成请求必须进行更进一步的操作
    • 304 Not Modified 协商缓存,与重定向无关,表示所请求资源未发生修改
  • 4xx客户端错误 请求有语法错误或请求无法实现
    • 400 Bad Request 客户端请求有语法错误,不能被服务器所理解
    • 401 unAuthorization 未授权,请求要求用户认证
    • 403 Forbidden 对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述
    • 404 Not Found 不存在,表示在服务器上没有找到请求的资源
    • 405 Not Allowed 请求方式错误
  • 5xx服务器端错误 服务器未能实现合法的请求
    • 500 internal sever error 表示服务器端在执行请求时发生了错误
    • 504 Gateway Time-out 请求超时
HTTP工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:

  1. 客户机与服务器建立TCP连接。
  2. 建立连接后,客户机发送http请求给服务器.
  3. 服务器接到请求后,响应信息。
  4. 客户端接收服务器所返回的信息,然后客户机与服务器断开TCP连接。
HTTP长连接和短连接

每个 TCP 连接的建立都需要三次握手,每个 TCP 连接的断开要四次挥手。

  • HTTP 短连接:

    在 HTTP/1.0 中,每次 HTTP 请求都会创建一个新的 TCP 连接,请求完成后之后这个 TCP 连接就会被关闭,这种通信模式的效率不高。

  • HTTP 长连接

    在 HTTP/1.1 中,引入了 HTTP 长连接的概念,使用长连接的 HTTP 协议,会在响应头加入 Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的 TCP 连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接,也就是说两个请求可能共用一个 TCP 连接。

HTTP特点
  1. 无状态:每个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

  2. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。 在 HTTP/1.1 中,引入了 HTTP 长连接的概念,使用长连接的 HTTP 协议,会在响应头加入 Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的 TCP 连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接,也就是说两个请求可能共用一个 TCP 连接。

  3. 支持客户/服务器模式。

  4. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETHEADPOST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  5. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

HTTP代理

HTTP是基于请求-响应模型的协议,一般由客户端发请求,服务器来进行响应,当然也有特殊情况,那就是代理服务器,  对于客户端而言,表现为服务器进行响应;而对于源服务器,表现为客户端发起请求,具有双重身份

image.png

  • 正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端;
  • 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
HTTP缺点
  1. 信使用明文(不加密),内容可能会被窃听

  2. 不验证通信方的身份,因此有可能遭遇伪装

  3. 无法证明报文的完整性,所以有可能已遭篡改

一个TCP链接什么时候会断开

在 HTTP/1.1 中,引入了 HTTP 长连接的概念,使用长连接的 HTTP 协议,会在响应头加入 Connection:keep-alive。默认情况下Connection:keep-alive 不会断开。只有在请求头申明:Connection:close,则请求完成后会断开TCP链接。

一个TCP链接中多个http请求可以一起发送吗?

HTTP/1.1 中,一个TCP链接,任意两个http请求不能互相重叠,即不能并行发送多个请求。

HTTP/2 中,由于多路复用的特性,多个http请求可以在一个TCP链接中并行发送

HTTPS

HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

对称加密,非对称加密
  • 对称加密

    指的就是加密和解密使用同一个秘钥,所以叫做对称加密。

    特点:加密速度快,但是秘钥容易被黑客截获,所以安全性不高。

    常见的有AES、DES算法。

  • 非对称加密

    加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。

    特点:安全性高,缺点是加密速度慢。

    常见的有RSA,ECC算法。

  • 混合加密

    服务端先用非对称加密的私钥key2加密对称加密的密钥key1并传给客户端,客户端用非对称加密的公钥key3解密出对称加密的密钥key1,双方都有了密钥key1,开始利用key1加密通信。

    缺点:中间人可以自己生成非对称加密公钥替换掉服务端公钥发送给客户端,而此时客户端并无法验证公钥的可信性。

CA证书

世界上有一个神秘的组织:CA机构 。就是它会给网站颁发身份证。当某个网站想要启用HTTPS协议的时候,需要向CA机构申请一份证书,这个证书就是数字证书。

数字证书 包括了证书持有者信息、网站公钥和有效期等信息。

HTTPS方式与服务器通信过程
  1. 浏览器向服务端发起请求
  2. 服务器收到浏览器请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  3. 浏览器验证数字证书
  4. 浏览器本地生成一个密钥,然后使用公钥将密钥加密,并传送给服务器。
  5. 服务器利用自己的私钥解密出密钥。
  6. 浏览器与服务端通过密钥进行加密通信。

HTTP 和 HTTPS 的区别

  1. HTTP协议传输的内容都是明文HTTPS 使用 SSL 或 TLS 来加密数据,使其比 HTTP 安全得多,要比http协议安全。
  2. HTTPS协议需要到CA(证书颁发机构)申请证书。浏览器随后使用此证书与服务器建立安全连接。一般免费证书很少,需要交费。
  3. HTTP 使用端口 80,而 HTTPS 使用端口 443