IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络面试题 -> 正文阅读

[网络协议]计算机网络面试题

不一定准确,just方便自己思考和总结

1、如果让你做一个视频聊天软件,你用TCP还是UDP?

我会选择UDP,因为UDP是无连接的,不保证可靠性,传输速度快,没有拥塞控制,网络出现拥塞也不会使源主机的发送速率降低。视频聊天软件不允许数据有太大的时延,UDP正好适合。但是丢包也影响用户体验,可以考虑将TCP和UDP的特性结合起来,如HTTP/3的QUIC协议。
让你设计一个既确保准确性速度又快的协议,怎么做

2、TCP是怎么去保证可靠传输的

理想的传输条件:传输信道不发生差错;不管发送方以多快速度发送数据,接收方总是来得及处理

  • 确认和重传;接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。三次握手阶段同步的双方的“序列号+确定号+窗口大小”信息是其基础。
  • 数据校验;
  • 数据合理分片和排序;
  • 流量控制(利用滑动窗口);当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失
  • 拥塞控制;当网络拥塞时,减少数据的发送

3、TCP三次握手

SYN同步,置1表示这是1个连接请求或连接接受的报文;seq序号,表示本报文段所发送数据的第一个字节的序号;ack确认号,期望收到对方下一个报文段的的第一个数据字节的序号。若确认号=N,则表明序号N-1为止的所有数据都已正确收到;ACK确认,ACK=1时确认号字段才有效。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pHbzhvKx-1630161834873)(assets/IMG_1.jpg)]

为什么是三次握手?两次不安全,四次没必要。TCP通信要确保双方都具有数据收发的能力。第一次客户端发送SYN,服务器接收,服务器得出客户端的发送能力和自己的接收能力正常;第二次服务器发送SYN+ACK,客户端接收,客户端得出双方的发送和接收能力都正常,但此时服务器并不能得出客户端接收能力是否正常,于是有了第三次握手:客户端发送ACK,服务器接收,得出客户端接收能力正常,自己的发送接收能力也正常。

三次握手可以携带数据吗?第一二次不可以,第三次可以。如果有人想攻击服务器。那他只需要在第一次握手中的SYN报文中放大量数据,然后重复发送大量SYN报文,这样服务器会花费大量内存空间来缓冲这些报文,服务器就很容易被攻击了。

4、TCP拥塞控制

  • 慢开始,拥塞避免,快重传,快恢复

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87n8j8KO-1630161834876)(assets/IMG_3.jpg)]

5、CDN的原理是什么

CDN 全称是Content Delivery Network,内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获得所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求

6、DNS过程

(1)DNS服务:将域名解析成IP地址;
(2)8.8.8.8就是Google提供的免费DNS服务器的IP地址;
(3)域名解析过程:

  • 主机本地域名服务器进行递归查询(递归查询就是让你帮我查东西,要么你直接告诉我答案,你不知道就替我去问别人知道后再告诉我答案)
  • 本地域名服务器以DNS客户机的身份进行迭代查询(迭代查询就是你告诉我下一步去问谁,我自己去问),向一个根域名服务器进行询问
  • 根域名服务器告知下一步该查询的顶级域名服务器的IP地址
  • 本地域名服务器向顶级域名服务器查询,又被告知下一步该查询的权限域名服务器的IP地址
  • 向权限域名服务器查询,得到结果,将结果告诉主机,自己也会进行一些缓存

7、为什么TCP连接是可靠的

因为它通过确认和重传,数据分片和排序,流量控制和拥塞控制等机制,来确保传送的数据,无差错、不丢失、不重复,且按序到达

8、HTTP请求方法

  • GET:获取资源,可以理解为读取或下载数据
  • HEAD:获取资源的元信息。可以看作是GET的“简化版”,只传响应头(和GET完全相同)
  • POST:向资源提交数据
  • PUT:类似POST,但有微妙不同:POST表示新建create,PUT则是修改update
  • DELETE:删除资源,危险性有点大
  • CONNECT:建立特殊的连接隧道,要求服务器(充当代理角色)为客户端和另一台远程服务器建立一条特殊的连接隧道
  • OPTIONS:列出可对资源实行的方法,跨域请求会用到
  • TRACE:追踪请求-响应的传输路径,不安全,通常禁用
  • coderhub项目增(post)删(delete)改(patch)查(get)

9、HTTP首部字段

  1. 通用首部字段
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MioCXlzN-1630161834878)(assets/IMG_5.jpg)]

(1)Cache-Control
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eylEYoEm-1630161834880)(assets/IMG_10.jpg)]

(2)Connection:默认为Keep-Alive(持久连接),要关闭则设为close

(3)Pragma:no-cache,历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义,一般和Cache-Control:no-cache一起发送

(4)Trailer,Transfer-Encoding:用在HTTP/1.1分块传输编码时

(5)使用Upgrade时需额外指定Connection:Upgrade

  1. 请求首部字段
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIjgJcid-1630161834882)(assets/IMG_6.jpg)]

(1)前四个字段都可以用q(0~1)来表示权重

(2)Host:必须被包含,可以设为空值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3uVXqXIJ-1630161834883)(assets/IMG_11.jpg)]

(3)形如If-xxx的请求首部字段,可称为条件请求,只有判断指定条件为真,才会执行请求。

(4)Range:bytes=5001-10000 表示请求获取从第5001字节至第10000字节的资源。服务器处理请求后返回206,无法处理该范围请求则返回200和全部资源

  1. 响应首部字段
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSrGJalY-1630161834884)(assets/IMG_7.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l78L3LP6-1630161834885)(assets/IMG_8.jpg)]

(1)Accept- Ranges:可处理范围请求时指定为bytes,反之指定为none

  1. 实体首部字段
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYFHwTEA-1630161834886)(assets/IMG_9.jpg)]

  2. 为Cookie服务的首部字段

(1)Set-Cookie,添加HttpOnly属性可使JavaScript脚本无法获取Cookie,防止XSS攻击;
(2)Cookie

10、https的加密过程以及如何防止中间人攻击

HTTP+加密(混合加密)+认证(证书)+完整性保护=HTTPS

中间人攻击:拦截并篡改内容,防止篡改大致属于完整性保护的范畴,常用的是MD5和SHA-1等散列值校验的方法。而HTTPS应用层发送数据时会附加一种叫做MAC的报文摘要,MAC能够查知报文是否遭到篡改,从而保护报文的完整性。

11、通过什么机制处理服务端接收数据乱序丢包

基于滑动窗口的确定和重传机制,重传又包括基于时间的超时重传和基于接收端反馈信息的快速重传。

12、http1时代,经常把很多资源部署在不同域名下,为什么

队头阻塞使得数据不能并行请求,把静态资源分布到不同域名下,以此突破浏览器并发数的限制,提升连接上限

13、OSI七层模型,每层大致作用及相关协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APNh2dyd-1630161834887)(assets/IMG_12.jpg)]

14、TLS握手

浏览器安全5.4

15、怎么知道数字证书的真假

浏览器安全5.4,验证证书是否合法及CA机构的合法性(证书链)

16、cookie、session区别

  • cookie数据存放在客户的浏览器上,session存放在服务器上
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
  • session会在一定时间内保存在服务器上,访问增多会比较占用服务器的性能
  • cookie有大小限制,一般不超过4K

17、session怎么保存,有多台服务器,sessionid怎么找

存放在服务器端的内存中,也可以持久化到file,数据库,memcached&redis(以键值对的方式存储数据)(快速且基于缓存的存储体系)中

多台服务器通过mysql,redis,cookie(直接将cookie中的sessionid同步到服务器中,安全性不高)等共享session

18、为什么cookie可以用来保存登录状态

浏览器第一次发送请求到服务器端,服务器端创建包含用户信息的cookie并返回,浏览器再次访问服务器会携带这个cookie,服务器就可以通过cookie中携带的数据来区分不同的用户了

19、http头部chunk

分块传输编码是HTTP中一种数据传输机制,允许HTTP由网页服务器发送给客户端应用的数据可以分为多个部分。当客户端请求一个静态页面或一张图片时,服务器可以很清楚知道内容大小,然后通过Content-Length告知客户端需要接收多少数据,但是如果是动态页面,服务器不可能预知内容大小,就可以使用Transfer-Encoding:chunked(表示将用chunked编码传输内容)这样的方式来代替Content-Length。

设置分块编码后,每个分块由长度值(十六进制)和数据组成,长度值和数据结尾都有CRLF(\r\n),最后一个分块长度值为0,对应的分块数据没有内容

5\r\n     //长度值
12345\r\n  //数据
0\r\n   //最后一个分块
\r\n

20、get发一个TCP包,post发两个,这种情况是一定的吗

要看浏览器的实现。取决于客户端的请求策略,为了避免浪费资源,例如请求的数据很大,客户端就会先发送header请求并携带Expect:100-continue来探路,如果是一个很简单的POST请求,一般也只会发送一个TCP包

21、一个http报文的的头和body之间有什么分隔

空行:CR(回车符)或LF(换行符)

22、出现304的场景,通过什么协议头来确认

协商缓存;Last-Modified&If-Modified-Since或ETag&If-None-Match

23、websocket原理,如何实现,和http报文结构有哪些不同

1、WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议

  • 全双工,客户端和服务端可以同时相互通信
  • 允许服务端主动向客户端发送数据
  • 持久性,当服务端跟客户端通信连接成功(即建立起一个管道),这个管道会一直存在,随时可以传送数据

2、前端实现:const ws=new WebSocket(‘ws://localhost:8080’)

ws.onopen=function(){} 用于指定连接成功后的回调函数,除此之外,还有onclose,onmessage,onerror等等;send()可以发送数据

3、WebSocket握手阶段采用的就是HTTP,请求报文头部Upgrade:websocket Connection:Upgrade,告诉服务器要使用WebSocket协议

24、cookie,localStorage,sessionStorage使用和区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ye4TOFE-1630161834888)(assets/IMG_13.jpg)]
HTML5中与本地存储相关的两个重要内容:Web Storage与本地数据库。其中,Web Storage存储机制是对cookie存储机制的一个改善。Web Storage又分为两种:sessionStorage和localStorage。它提供了一套更为丰富的接口,使得数据操作更为方便,如sessionStorage.setItem(key,value)以键值对的方式存储数据,getItem(key)获取数据,removeItem(key)删除数据,clear()删除所有数据

25、http请求过程中怎么知道数据已经发送完毕,怎么断开

根据Content-Length或Transfer-Encoding

四次挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihSz91Vj-1630161834889)(assets/IMG_14.jpg)]

26、为什么连接时是三次握手,挥手时却是四次挥手

因为服务器收到客户端的SYN连接请求报文后,可以直接发送SYN(同步)+ACK(应答)报文。但是关闭连接,服务器收到FIN报文时,它可能还有数据没发送完,只能先回复一个ACK报文告诉客户端已经收到了你的FIN报文,要等到自己所有的报文都发送完毕再发送FIN报文

27、为什么TIME-WAIT需要等待2MSL才能进入CLOSED

MSL指报文在网络中最大生存时间。在客户端发送对服务端FIN的确认ACK后,这个ACK包有可能到达不了,服务端如果接收不到ACK包就会重发FIN包,所以他要留出2MSL时间确保ACK确实能够到达服务端。除此之外,还能确保本连接持续时间内所产生的所有报文段都从网络中消失。

28、了解轮询和websocket吗

(1)长轮询:客户端向服务端发送Ajax请求,服务器接到请求后保持连接,直到有新消息或超时才返回响应并关闭连接,服务端处理完响应信息后再向服务器发送新的请求
(2)短轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接,可使用setInterval实现

29、跨域问题

(1)什么是跨域?

当浏览器向目标URL发Ajax请求时,只要当前URL与目标URL不同源,则产生跨域。

注意:跨域请求的想要其实是成功到达客户端了,但是被浏览器拦截了。基于多进程的浏览器架构,沙箱中的渲染进程是没办法发送网络请求的,需要通过IPC机制与网络进程通信,让网络进程发送网络请求。服务端处理数据并返回响应,网络进程解析响应头数据并将数据转发给浏览器主进程,浏览器检查到跨域,且没有CORS响应头,就让网络进程将响应体全部丢掉。这样就达到了拦截数据的目的。

(2)JSONP

(1)什么是JSONP:JSONP是JSON with padding的简写,是应用JSON的一种新方法,JSONP看起来和JSON差不多,只不过是被包含在函数调用中的JSON,就像下面这样:

callback({“name”:”hinus”})

我们可以看到,JSONP由两部分组成:回调函数和传入回调函数中的JSON数据。

(2)jsonp的原理:带src属性的标签都拥有跨域的能力,如img、iframe、script等。所以我们可以动态创建script标签发起请求,然后从后端拿到请求回来的数据进行处理,最后再把创建的script标签删掉,这就是JSONP的整套流程。在用户的角度是感觉不到动态创建script标签以及发送请求的。

(3)封装一个JSONP:

const jsonp = ({ url, params, callbackName }) => {
  const generateURL = () => {
    let dataStr = '';
    for(let key in params) {
      dataStr += `${key}=${params[key]}&`;
    }
    dataStr += `callback=${callbackName}`;
    return `${url}?${dataStr}`;
  };
  return new Promise((resolve, reject) => {
    // 初始化回调函数名称
    callbackName = callbackName || Math.random().toString.replace(',', ''); 
    // 创建 script 元素并加入到当前文档中
    let scriptEle = document.createElement('script');
    scriptEle.src = generateURL();
    document.body.appendChild(scriptEle);
    // 绑定到 window 上,为了后面调用
    window[callbackName] = (data) => {
      resolve(data);
      // script 执行完了,成为无用元素,需要清除
      document.body.removeChild(scriptEle);
    }
  });
}

调用:

jsonp({
  url: 'http://localhost:3000',
  params: { 
    a: 1,
    b: 2
  }
}).then(data => {
  // 拿到数据进行处理
  console.log(data); // 数据包
})

服务端的响应代码:

let express = require('express')
let app = express()
app.get('/', function(req, res) {
  let { a, b, callback } = req.query
  console.log(a); // 1
  console.log(b); // 2
  // 注意哦,返回给script标签,浏览器直接把这部分字符串执行
  res.end(`${callback}('数据包')`);
})
app.listen(3000)

(3)CORS

(1)对于简单请求,浏览器直接发出CORS请求,即在头信息中增加一个Origin字段(用来说明本次请求来自哪个源),服务器根据这个值,决定是否同意这次请求。

如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。

如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。其中Access-Control-Allow-Origin的值要么是请求时Origin字段的值,要么是一个*;Access-Control-Allow-Credentials表示是否允许发送Cookie,如果设置为true,则在前端也需要设置withCredentials属性为true

(2)非简单请求,会在正式通信之前,增加一次HTTP查询请求(预检请求,请求方法是OPTIONS,关键字段是Origin),只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。除了Origin,还有两个特殊字段:Access-Control-Request-Method和Access-Control-Request-Headers

服务器回应的CORS相关字段有Access-Control-Allow-Origin等等,例如一个预检请求的响应:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0

(4)Nginx

Nginx 是一种高性能的反向代理服务器,可以用来轻松解决跨域问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j2rva4RU-1630161834890)(assets/IMG_15.png)]
正向代理帮助客户端访问客户端自己访问不到的服务器,然后将结果返回给客户端。

反向代理拿到客户端的请求,将请求转发给其他的服务器,主要的场景是维持服务器集群的负载均衡,换句话说,反向代理帮其它的服务器拿到请求,然后选择一个合适的服务器,将请求转交给它。

因此,两者的区别就很明显了,正向代理服务器是帮客户端做事情,而反向代理服务器是帮其它的服务器做事情。

好了,那 Nginx 是如何来解决跨域的呢?
比如说现在客户端的域名为client.com,服务器的域名为server.com,客户端向服务器发送 Ajax 请求,当然会跨域了,那这个时候让 Nginx 登场了,通过下面这个配置:

server {
  listen  80;
  server_name  client.com;
  location /api {
    proxy_pass server.com;
  }
}

Nginx 相当于起了一个跳板机,这个跳板机的域名也是client.com,让客户端首先访问 client.com/api,这当然没有跨域,然后 Nginx 服务器作为反向代理,将请求转发给server.com,当响应返回时又将响应给到客户端,这就完成整个跨域请求的过程。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:32:49  更:2021-08-30 12:34:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:34:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码