计网面试题

1. OSI 的七层模型分别是?各自的功能是什么?

简要概述

  • 物理层:底层数据传输,如网线;网卡标准

    ​ 负责在物理网络中传输数据帧

  • 数据链路层:定义数据的基本格式,如何传输,如何标识,如网卡MAC地址

    ​ 负责数据的封帧和差错检测,以及MAC地址

  • 网络层:定义IP地址,定义路由功能;如不同设备的数据转发

    ​ 负责数据的路由、转发、分片

  • 传输层:端到端传输数据的基本功能;如TCP、UDP

    ​ 负责端到端的数据传输

  • 会话层:控制应用程序之间会话能力;如不同软件数据分发给不同软件

    ​ 负责简历、管理和终止表示层实体之间的通信会话

  • 表示层:数据格式标识,基本压缩加密功能

    ​ 负责把数据转换成兼容另一个系统能识别的格式

  • 应用层:各种应用软件,包括web应用

    ​ 负责给应用程序提供统一的接口

简背:应、表、会、传、网、数、物

说明

  • 在四层,既传输层数据被称作 段
  • 三层网络层数据被称为 包
  • 二层数据链路层时数据被称为 帧
  • 一层物理层数据被称为 比特流

总结

  • 网络七层模型是一个标准,而非实现
  • 网络四层模型是一个实现的应用模型
  • 网络四层模型由七层模型简化合并而来

2. 为什么需要三次握手?两次不行?

为什么两次不行

  • 第一次握手成功证明——客户端有发送能力,服务端有接受能力
  • 第二次握手成功证明——服务端有接受,发送能力,客户端有接受,发送能力。但是客户端知道服务端有接受和发送能力,但是服务端只知道客户端有发送能力,不确定客户端是否具备接收能力
  • 第三次握手成功证明——客户端,服务端的接受和发送能力都正常(双方都知道对方有接受和发送能力)

三次握手(客户端处于closed,服务端处于listen)

  • 第一次握手:客户端发送一个SYN报文,并指明客户端ISN©序列,客户端处于SYN-Send状态(SYN邮寄状态)
  • 第二次握手:服务端收到SYN后,会以自己的SYN报文作为应答,并也指名自己的ISN(s)序列,同时把客户端的ISN+1作为ACK的值,表示自己已经收道,此时服务端的状态为SYN-RCVD(SYN收到)
  • 第三次握手:客户端收到SYN报文,会发送一个ACK报文,内容为服务端的ISN+1。此时客户端状态为established状态
  • 服务器收到后,也处于established状态,双发建立起了键接

三次握手的作用

  • 确认双方都具备发送和接收能力
  • 指定自己的初始化序列号,为后面的可靠传送做准备

ISN是固定的吗

  • 不是,是动态生成的。如果是固定的,那么攻击者很容易猜出后续的确认号(黑客伪造相同序列号TCP报文被对方接收)
  • (防止历史报文被下一个相同四元组的连接接收)
  • 三次握手的一个重要功能是客户端和服务端交换ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据

什么是半连接队列

  • 服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD状态,此时双方还没有完全建立链接,服务器就会把此种状态下请求连接放在一个队列里,我们把这种队列称为半连借队列。
  • 全连接队列就是,已经完成三次握手的。

SYN-ACK 重传的问题

  • 首先发送方没有在规定时间收到确认帧发送方会认为冲突。然后从min(重传次数,10)中取得最小值,重传从0开始。最大值为15。然后2的最小值次幂。

三次握手过程中可以携带数据吗

  • 在第三次的时候可以带
  • 因为在第三次之前,客户端已经知道服务端具备接收和发送功能是正常的。
  • 但如果在第一次就携带数据的话,且被收到攻击,那么会让服务端花费很多时间和内存处理报文和携带的数据。使得服务器更容受到攻击

3. 为什么需要四次挥手?三次不行?

双方都处于established状态(假如客户端先要关闭)

  • 第一次挥手:客户端发送一个FIN报文,当然里面也有INS。客户端状态为FIN_WAIT1
  • 第二次挥手:服务端接收到FIN,发送ACK(客户端的INS+1)。表明收到。服务端状态为CLOSE_WAIT
  • 第三次挥手:服务端想断开了,发送一个FIN和自己的INS。服务端状态为LAST_ACK
  • 第四次挥手:客户端收到FIN后,发送ACK(服务端的INS+1)。客户端状态为TIME_WAIT。过一段时间后,(这段时间为报文传输一个来回的时间),客户端进入CLOSED状态
  • 服务端收到ACK后,进入CLOSED状态

在第四次挥手中,为什么客户端要等一段时间

  • 因为要确保服务端接收到ACK报文,如果没接收到报文的话,服务端会重复第三次挥手,重新发一份FIN报文给客户端,如果在等待的这段时间内,客户端没收到报文,那就默认服务端已经收到ACK报文。如果有收到,那证明,ACK报文丢失,得重新发送。
  • 这个等待时间是,报文传输一个来回的时间,(ACK传过去的时间 + FIN 重新发送过来的时间)

为什么TIME-WAIT状态必须等待2MSL时间

  • MSL(Maximum Segment Lifetime)报文最大生存时间
  • 保证最后一个ACK报文能够送达。
  • 在2MSL的时间内,收不到重新请求报文的指令,则默认收到报文,且可进入closed状态
  • 如果不等待2MSL就进入closed,刚刚好最后一个ACK报文丢失,对方没收到,并重新请求报文,而你却进入了closed。使得对方无法进入closed

三次为什么不行

  • 要给服务端一些时间,让服务端把正在做的事情做完。所以多了一次挥手

4. TCP与UDP有哪些区别?各自应用场景?

  • 区别
    • TCP是可靠传输,UDP是不可靠传输
    • TCP面向连接, UDP无连接
    • TCP传输数据有序,UDP不保证数据的有序性
    • TCP不保存数据边界,UDP保留数据边界
    • TCP传输速度相对于UDP较慢
    • TCP有流量控制和拥塞控制,UDP没有
    • TCP是重量级协议,UDP是轻量级协议
    • TCP首部较长20字节,UDP首部较短8字节
  • 应用场景
    • TCP——效率要求相对低,单对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。eg:文件传输、邮件接收、远程登录
      • HTTP、HTTPS——从web杜文强传输超文本到本地浏览器的传送协议
      • FTP——文件传输协议。使用 21 端口 (开启了FTP服务==启动了文件传输服务
      • Telnet——远程登录协议,基于DOS模式下的通信服务。支持 23 端口
      • SMTP——简单邮件传输协议,使用 25 端口
      • POP3——与SMTP对应,用于接收邮件。使用 110 端口
    • UDP——效率要求相对高,对准确性要求相对低。eg:QQ聊天、网络语言电话、广播通信
      • DNS、DHCP、TFTP、SNMP(简单网络管理协议)
      • DNS——域名解析服务,将域名转换成ip地址。 53端口
      • SNMP——简单网络管理协议。用来管理网络设备。 161端口
      • TFTP——简单文件传输协议 69端口

TCP协议的主要特点

  • TCP是面向连接的运输层协议;所谓面向连接就是双方传输数据之前,必须先建立一条通信,例如三次握手就是建立,四次挥手就是销毁通信的一个其中过程
  • 每一条TCP连接只能有两个断点(即两个套接字),只能是点对点的
  • TCP提供可靠的传输服务,传输的数据无差错、不丢失、不重复、按顺序到达
  • TCP提供全双工通道。允许通信双方的应用进程在任何时候都可以发送数据,因为两端都设有发送缓存和接收缓存
  • 面向字节流。虽然应用程序与TCP交互是一次一个大小不等的数据块,但TCP把这些数据看成一连串无结构的字节流,它不保证接收方收到的数据块和发送方的数据块具有对应大小关系,例如,发送放应用程序交给发送方的TCP10个数据块,但就受访可能就只用了4个数据块就讲收到的字节流交付给应用程序,但字节流完全一样
  • 首部为20个字节

TCP的可靠性

  • 传输通信无差错,保证传输数据正确
  • 不管发送以多快的速度发送数据,接收方总是来得及处理收到的数据
    • 三次握手,四次挥手,保证通信可靠
    • TCP采用了ARQ协议,(超时自动重传)来保证数据传输的正确性,使用滑动窗口协议来保证接收方能够及时处理所接到的数据,进行流量控制
  • TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞

UDP协议特点

  • UDP是无连接的传输层协议
  • UDP使用尽最大努力交付,不保证可靠交付
  • UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留报文的边界
  • UDP没有拥塞控制, 因此即使网络出现拥塞也不会降低发送速率
  • UDP支持一对一 ,一对多,多对多的交互通信
  • UDP的首部开销小,只有8字节

5. HTTP1.0,1.1,2.0 的版本区别

  • http1.0 规定浏览器与服务器只保持短短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。服务器不跟踪每个客户也不记录过去的请求
    • http1.0也可以强制开启长连接,例如接受connection:Keep-alive这个字段,但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决方法
  • http1.1在1.0 基础上加上了持久连接。就是默认不关闭TCP连接
    • http1.1 还引入了管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求
    • 痛点——服务端的任务得按顺序执行,效率还有提升空间
  • http2.0 基于SPDY协议
    • 采用了多路复用,即在一个连接里,客户端和浏览器都可以同时发送多个请求和回应,而且不用按照顺序一一对应,能这样做有一个前提,就是http2.0 进行了二进制分帧(大白话——两个好几G的大任务同时发送过来,二进制分帧就是:把接受到的任务能完成的,就先完成然后发回去,然后再去做其他的。这个其他的任务,可以是不同大任务中的小任务)
    • 其他方面的优化
      • header压缩——就是缩短老板和员工之间的对话
      • 服务端推送——把你的兴趣爱好在你打开浏览器之前,先安排上

6. POST和GET有哪些区别?各自应用场景?

使用场景

  • get用于资源获取
  • post用于传输实体主体

参数

  • get和post的请求都能使用额外的参数,但是get的参数是以查询字符串出现在url中。一般中文会被转译成ASCLL码,因为url只支持ASCLL码,空格会被转换成%20
  • 而post参数存储在实体主体中。(不能以为他的安全性更高,用fiddler或其他抓包工具可直接查看)支持标准字符集

安全性

  • 这里可理解为,不被破坏,就是安全
  • 只提供可读属性的get、head、options方法,权限只是可读。使用这三类方法,服务器状态不会被改变
  • post、put、delete方法,会想服务器提供表单,上传成功后,数据可能将被服务器存入数据库,在这时,服务器状态被改变了,也就不安全了

幂等性

  • 幂等的http方法,表示同时被请求被执行的一次或多次的效果是一样的,服务器状态也是一样的。也就是,安全方法都是幂等的,不安全方法不是幂等的

可缓存

  • 必须满足以下条件
    1. 请求报文的http方法本身是可缓存的,包括get、head,但是put、delete不可缓存,post在多数情况下不可缓存
    2. 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501
    3. 响应的报文的cache-control(缓存控制)首部字段没有指定不进行缓存

XMLHttpRequest

  • XMLHttpRequest是一个API,它为客户端提供了在客户端和服务器之间传输数据的功能,它提供了一个通过url来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest在Ajax中被大量使用
    • 在使用XMLHttpRequest的post方法时,浏览器会先发送header再发送data。但并不是所有浏览器都会这样做,例如火狐就不会
    • get方法中,header和data会一起发送

7. HTTP 哪些常用的状态码及使用场景?

状态码分类

  • 1xx:表示目前是协议的中间状态,还需要后续请求
  • 2xx:表示请求成功
  • 3xx:表示重定向状态,需要重新请求
  • 4xx:表示请求报文错误
  • 5xx:表示服务端错误

常用状态码

  • 101——切换请求协议,从http切换到websocket
  • 200——请求成功,有响应体
  • 301——永久重定向,会缓存
  • 302——临时重定向,不会缓存
  • 304——协商缓存命中
  • 403——服务器禁止访问
  • 404——资源为找到
  • 400——请求错误
  • 500——服务端错误
  • 503——服务器繁忙

8. HTTP状态码301和302的区别,都有哪些用途?

301重定向概念

  • 表示页面永久性转移,表示资源或页面永久性地转移到另一个位置。
  • 301重定向是一种非常重要的“自动转向”技术,网址重定向最为可行的一种方式

什么时候需要做301重定向

  • 网页开发过程中,时常遇到网站目录结构的调整,将页面转移到一个新的地址
  • 网页扩展名的改变,如果用户访问旧网址,得到404,可能会导致客户流失
  • 需要多个域名跳转到同一个域名。(不同域名,访问后得到同样的网页)

301重定向的优点

  • 有利于网站首选域的确定
  • 对于同一资源页面多条路径的301重定向有利于url权重的集中
    • 例如,不同域名,访问的是同一个域名,这样子网站的搜索排名被分散都不同的域名中,不利于排名。设置了重定向后,可集中访问来源,提升排名

302又是什么?

  • 页面暂时性转移
  • 常被用作网址劫持,容易导致网址降权,严重时网站会被封掉,不推荐使用

区别

  • 暂时的,和永久的
  • 302搜索引擎会抓取新的 内容保存旧网址,并认为新的网址只是暂时的

9. 在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

  • 在http中响应体的Connection字段指定为Keep-alive

    connetion:keep-alive

10. HTTP 如何实现长连接?在什么时候会超时?

  • http一般会有httpd守护进程,里面可以设置Keep-alive timeout。当TCP链接闲置超过这个时间就会关闭,也可以在http的header里面设置超时时间
  • TCP的Keep-alive包含三个参数,支持系统内核net.ipv4里面设置;当TCP链接之后,闲置tcp_keepalive_time,则会发送侦测包,如果没有收到对方的ACK,那么会每隔tcp_keepalive_time再发送一次,直到发送了tcp_keepalive_probes,就会丢弃该链接
    • tcp_keepalive_intvl = 15
    • tcp_keepalive_probes = 5
    • tcp_keepalive_time = 1800

实际上,http没有长短链接,只有TCP有,TCP长链接可复用一个TCP链接来发起多次http请求,这样可以减少资源消耗,如果一次请求html,可能还需要请求后续的JS/CSS/图片等

11. TCP 如何保证有效传输及拥塞控制原理

保证数据包有效传输

  • TCP是面向连接的、可靠的、传输层通信协议
    • 可靠性:有状态、可控制
      • 有状态——TCP会确认发送了哪些报文,接收方收到了哪些报文,哪些没收到,保证数据包按序到达,不会有差错
      • 可控制——出现丢包或者网络状况不佳,则会跳转自己的行为,减少发送的速度或重发

保证可靠传输

  • 数据包校验
    • 目的是检测数据在传输过程中的任何变化,若校验包有出错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据
  • 对失序数据包重新排序
    • TCP报文段作为ip数据包来传输,而ip数据报的到达可能会失序(有一些丢包的重发),TCP会重新排序后,再交给应用层
  • 丢弃重复数据
  • 应答机制
    • 收到对方的数据时,会等待几分之一秒后,发送确认收到。
    • 等待的时间作用是:合并多个ACK,并让反馈数据带上ACK
  • 超时重发
    • 发出信息后,启动定时器,这个时间内没收到回复,则重新发送
  • 流量控制
    • TCP的每一端都有一个固定大小的缓冲空间。
    • 每次传送的数据都不能多于对方缓存剩余空间的数据,防止缓冲区溢出
    • 流量控制协议是可变大小的滑动窗口协议

拥塞控制原理

  • 如果网络环境特别差,会容易丢包。可使用下面三种方法
    • 慢启动阀值 + 拥塞避免
    • 快速重传
    • 快速恢复

慢启动阀值 + 拥塞避免

  • 对于拥塞控制来说,TCP主要维护两个核心状态
    • 拥塞窗口(cwnd)
    • 慢启动阀值(ssthresh)
  • 在发送端使用拥塞窗口来控制发送窗口的大小
  • 一般是采用比较保守的慢启动算法来慢慢适应这个网络
  • 在开始传输的一段时间,发送端和接收端先建立连接。确定各自收窗口的大小
  • 然后初始化双方的拥塞窗口,接着每经过一轮RTT(收发时延),拥塞窗口翻倍,直到达到慢启动阀值
  • 然后开始进行拥塞避免,拥塞避免具体的做法就是之前每一轮RTT,拥塞窗口翻倍,现在每一轮就加一个。

快速重传

  • 在TCP传输过程中,如果发送了丢包,接收端就会发送之前重复的ACK
  • 比如,第5个包丢了,6,7到达,那么接收端会为5,6,7都发送第4个包的ACK。
  • 这个时候,发送端收到了3个重复的ACK,就会意识到丢包了
  • 会马上进行重传,而不用等到RTO(超时重传时间)
  • 选择性重传:报文首部可选性中加入SACK属性,通过left edge和right edge标志那些包到了,然后重传没到的包

快速恢复

  • 如果发送端收到了3个重复的ACK,发现丢包,觉得选择网络状况已经进入了拥塞状态,那么就会进入快速恢复阶段
    • 会奖拥塞阀值降低为拥塞窗口的一半
    • 然后拥塞窗口大小变为拥塞阀值
    • 接着拥塞窗口再进行线性增加,以适应网络状况

12. IP地址有哪些分类?

  • A类地址(1~126):网络号占前8位,以0开头,主机号占后24位。
  • B类地址(128~191):网络号占前16位,以10开头,主机号占后16位。
  • C类地址(192~223):网络号占前24位,以110开头,主机号占后8位。
  • D类地址(224~239):以1110开头,保留位多播地址。
  • E类地址(240~255):以1111开头,保留位今后使用

ip = 网络好 + 主机号

ABC都是单播地址(一对一通信)

13. GET请求中URL编码的意义

  • 避免歧义

  • eg

    • name1=value1&name2=value2 这是两对键值对
  • 如果value1的值为 va&lu=e1

    • 那么。会被翻译为name1=va&lu=e1
    • 这样子,从一对键值对变成了两队键值对
    • URL编码后结果:“name1=va%26lu%3De1”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符

14. 什么是SQL 注入?举个例子?

  • 就是通过SQL命令插入到web表单提交或输入域名页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  • SQL注入的总体思路
    • 寻找SQL注入的位置
    • 判断服务器类型和数据库类型
    • 针对不同的服务器和数据库特点进行SQL注入攻击
  • SQL注入实例
    • 下面这句是后台认程序中的SQL语句
    • String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;
    • 你在登录界面中
    • 用户名: ‘or 1 = 1 –
      密 码:
    • 然后就登录进去了
    • 因为在后台中,该SQL语句长这样
    • SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’
    • username = ‘’ or 1 = 1 这句返回一定是true
    • 而 – 是SQL注释的意思,会导致password = ‘’ 变的没意义
  • 应对方法
    • 参数绑定
      • 最好的预防手段。
      • ORM框架和JDBC等都实现了SQL预编译和参数绑定功能
      • 攻击者的恶意SQL会被当做SQL的参数传入,而不是SQL命令
    • 正则表达式
      • 过滤传入的参数

15. 谈一谈 XSS 攻击,举个例子?

  • XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式

XSS攻击的危害

  • 盗取各类用户账号,如机器登录账号、用户网银账号、各类管理员账号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其网站发起攻击

原因解析

  • 主要原因:过于信任客户端提交的数据
  • 解决方法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步操作
  • 进一步分析细节:客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及JavaScript代码,那么这些数据将会成为应用代码中的一部分了,那么攻击者就可以肆无忌惮地展开攻击,因此我们绝不可以信任任何客户端提交的数据

XSS攻击分类

  • 反射性XSS攻击(非持久性XSS攻击)

    • 漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)
    • 例如,正常发送消息
      • http://www.test.com/message.php?send=Hello,World!
    • 接受者将会收到信息,并提示显示hello world ,但是,不正常发送信息
      • http://www.test.com/message.php?send=
    • 并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码

  • 修复漏洞方针

    • 漏洞产生的根本原因:太相信用户提交的数据,对用户所提交的数据过滤不足导致的,因此解决方案也应从这个方面入手,具体包括
      • 将重要的cookie标记为http only,这样的话,JavaScript中的document.cookie语句就不能获取到cookie了(如果在cookie中设置了http only属性,那么将通过js脚本将无法读取到cookie信息,这样能有效繁殖XSS攻击);
      • 表单数据规定值的类型,例如年龄应为只能为int、name只能为字母数字组合
      • 对数据进行html encode处理
      • 过滤或移除特殊的html标签,例如< script >, < iframe > , < for <, > for>,
      • 过滤JavaScript事件的标签。例如onlick= , onfocus
      • 注意:有一些应用中是允许html标签出现的,甚至是JavaScript代码出现,因此我们在过滤数据的时候,需要仔细分析哪些数据是有特殊要求,然后再区别处理。

16. 讲一下网络五层模型,每一层的职责?

物理层

  • 一台计算机与另一台计算机要进行通信
  • 那么这两台计算机之间必须要有连接, 这样我们才能把数据通过高低电频0,1传输过去
  • 可以用光纤、电缆、双绞线

数据链路层

为了识别物理层传输过来的0,1信号,需要让计算机读懂,所以出现了以太网协议

  • 以太网协议
    • 以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称为帧,每一个帧由标头(head)和数据(data)两部分组成
      • 标头:主要是一些说明数据,例如发送者,接收者等信息,并且标头的字节是固定的,并固定为18个字节
    • 帧的大小一般为64—1518个字节。如果需要传送的数据很大,那就要分成多个帧来进行传送

把一台计算机的数据通过物理层和链路层发送给另一台计算机,究竟是谁发送的,计算机之间是如何区分的,这时候MAC地址出现了

  • MAC地址
    • 连入网络的每一个计算机都会有一个网卡接口,每一个网卡都会有一个唯一的地址,这个地址就叫做MAC地址,计算机之间的数据传送,就是通过MAC地址来唯一寻找、传送的。
    • MAC地址由48个二进制位所构成,在网卡生产时就被唯一标识了。
      • 通过比较MAC地址的时候,计算机收到MAC地址时,会从中得知,发送者想干嘛

计算机A连着B,C,D三台计算机,计算机A知道计算机B的MAC地址,但是不知道B是连着哪条线,那么A如何找到B呢。这时候就出现了广播

  • 广播
    • 仅接上话,在同一个子网中,A可以向广播发送一个数据包,这个数据包中有接收者的MAC地址。
    • 这时候有连接A的计算机都会收到这个数据包,他们会拿出数据包中的MAC地址与自己的对比,如果不是自己的MAC地址,就丢弃。

网络层

在链路层中,我们说到子网,实际上我们所处的网络,是有无数个子网构成的,在进行广播的时候,也只有在同一个子网的计算机才能够收到广播(假如不是同一子网才能收到数据包,那世界那么多计算机,会崩溃)

那么我们如何区分哪些MAC地址是属于同一个子网的?如果不是同一子网,那么我们会将数据包给网关,让网关进行转发,为了解决MAC地址归属,就出现了IP协议

  • ip协议
    • ip协议对应的地址,我们称为ip地址
    • ipv4由32位二进制组成,范围为0.0.0.0~255.255.255.255
    • 每一台联网的计算机都有一个ip地址,ip地址由两部分组成:网络部分+主机部分。网络部分和主机部分所占用的二进制位数是不固定的
      • 如果两台机器的网络部分是一样的,那么可以说明两台计算机处于同一个子网中
    • 如果仅单判断ip地址,那么是无法判断他们是否处于同一子网中的。
    • 这时候,就需要一个子网掩码。子网掩码和ip地址的位数是一样的。不过他们的网络部分全部为1,主机部分全部为0。
      • 有了子网掩码,我们就知道网络部分的位数,通过网络部分的位数来比较ip地址中相对应的位数,从而判断出两个ip地址是否处于同一个子网中

通过ip协议,可得知两台计算机是否处于同一子网中。如果A连接着BCD,A想给B发送数据,但是A不知道B的MAC地址,怎么办。这时候就有了ARP协议

  • ARP协议
    • 通过广播给子网中的每台电脑发送数据包(这个数据包中会包含接收方的ip地址)。对方接收到这个数据包之后,会取出ip地址进行自身比对,如果相同,则把自己的MAC地址发送给对方,否则就丢弃这个数据包。这样子,A就知道B的MAC地址

我们访问一个网址的时候,我们可以输入ip地址来访问,但是大多数人是记不住ip地址的,所以需要一个域名来帮忙记住网址。这时候就有DNS服务器

  • DNS服务器
    • 当我们访问百度时,输入百度的域名
    • 有一个叫DNS服务器的东西会帮我妈解析这个域名,
    • 然后返回这个域名的ip地址给我们

因此,网络层的功能就是让我们能在茫茫人海中,找到另一台计算机在哪,是否处于同一子网

传输层

我们能找到另一台计算机,但是不知道将数据发给计算机中的谁,这个时候就需要:端口

  • 端口
    • 传输层中,就是建立端口到端口的通信,而网络层是主机到主机的通信
    • 也就是说,只要有了ip和端口,我们才能进行准确通信。(有时候访问一些ip地址不需要写端口,是因为他们默认了,例如mysql:3306,http:80)
    • 端口的信息也很合理的会出现在数据包里面
  • 常见协议:TCP UDP

应用层

  • 将收到的数据,进行格式转换,让用户能看懂

17. 简单说下 HTTPS 和 HTTP 的区别

  • http——运行在TCP上,文明传输,客户端与服务端都无法验证对方的身份
  • HTTPS——在http的基础上加了SSL(secure socket layer ——安全套接层),运行与SSL上,而SSL运行与TCP,是添加了加密和认证机制的http。
  • 区别:
    • 连接方式不同:http:TCP(简单且无状态) https:TCP+TLS(加密传输、身份认证、安全)
    • 端口不同:http:80 https:443
    • 资源消耗:HTTPS通信因为加密处理会消耗更多的CPU和内存资源
    • 开销:HTTPS需要购买证书
    • http的往返时间为1RTT,https的往返时间为3RTT(因为http只需要建立一次TCP连接,而https需要3RTT)

HTTPS的加密机制是一种共享秘钥加密和公开秘钥加密并用的混合加密机制

18. 对称加密与非对称加密与对称+非对称与数字证书的区别

  • 对称加密
    • 客户端与服务器使用同一个秘钥
    • 缺点——如果将秘钥安全地发送给对方
  • 非对称加密
    • 每个服务器都有一把公开的公钥
    • 客户通过公开的公钥进行加密,然后将密文发送给服务器
    • 服务器用自己的私钥进行非对称解密,从而获取客户信息
    • 缺点——非对称的加密过程太慢
  • 对称加密 + 非对称加密
    • 客户用公开的公钥向服务器索要服务器的私钥
    • 服务器知道后, 将私钥发送给客户
    • 客户与服务器使用私钥加密聊天
    • 缺点——客户不知道得到的私钥是否为自己访问的服务器的私钥,也就是说,在客户向服务器索要私钥的过程中,私钥可能会被截取,并替换。
  • 数字证书
    • 客户向服务器索要证书(加密聊天请求)
    • 服务器将自己的个人信息和服务器的私钥使用hash算法生成信息摘要
    • 服务器将生成的信息摘要给认证中心,使用CA的私钥加密,生成数字签名
    • 接着将数字签名和服务器个人信息和服务器的公钥发送给客户
    • 数字证书到达客户端的浏览器“证书管理中心”查看有无该证书的公钥
    • 使用公钥将数字签名进行解密,获得信息摘要
    • 把服务器的个人信息和服务器的公钥进行hash算法生成信息摘要
    • 将两份信息摘要进行比对,可得知是否是目标服务器发送过来的公钥了
  • 数字签名
    • 由来——避免数据在传输过程中被替换
    • 制作——服务器把信息摘要进行加密,就变成数字签名
    • 客户端通过上面加密的方法进行解密,如果数据一样,则数据为真

19. 简单说下每一层对应的网络协议有哪些?

  • 应用层
    • 超文本传输协议:HTTP
    • 文本传输协议:FTP
    • 简单邮件传输协议:SMTP
    • 域名系统:DNS
    • 安全外壳协议:SSH
    • 动态主机配置协议:DHCP
    • 远程登录协议:TELNET
  • 传输层
    • 传输控制协议:TCP
    • 用户数据报文协议:UDP
  • 网络层
    • 网际协议:IP
    • 地址转换协议:ARP
    • 反向地址转换协议:RARP
    • Internet控制报文协议:ICMP
    • Internet组管理协议:IGMP
    • 路由信息协议:RIP
    • 分布式链路状态协议:OSPF
    • 边界网关协议:BGP
  • 数据链路层
    • 自动重传请求协议:ARQ
    • 停止等待协议:CSMA/CD
    • 点对点协议:PPP
  • 物理层
    • 中继器
    • 集线器
    • 网线
    • HUB

20. ARP 协议的工作原理?

主要任务,使用ip地址,找出MAC地址(物理地址)

ARP协议是网络层和数据链路层的重要枢纽

  • 每台主机都会在自己的ARP缓冲区中建立一个ARP列表,用来表示ip地址与MAC地址的对应关系。
  • 当源主机要将一个数据包发送到目标主机时,会首先检查自己ARP列表中是否存在该ip地址对应的MAC地址。
    • 如果有,就直接将数据包发送到这个MAC地址
    • 如果没有,就向本地网段发起一个ARP请求的广播包,查询有无对应的MAC地址
  • 这个广播请求的数据包中有源主机的ip地址,MAC地址,以为目标主机的ip地址。
  • 收到广播的数据包的主机,会先检查ip地址是否与自己的一致
    • 如果不同,就丢弃该数据包,不理会
    • 如果相同,该主机会先将源主机的MAC地址和ip地址添加到自己的ARP列表,如果已经有该ip的数据了,则覆盖,然后给源主机发送一个ARP响应数据包(告诉对方自己就是要它找的人)。源主机收到后,便将收到的MAC地址和ip地址添加到自己的ARP列表中,并开始数据传输。
    • 到最后都没找到,则ARP查询失败

21. IPV4 地址不够如何解决

  • NET协议
    • 经常听到外网和内网
    • 外网ip数量有限,内网ip就是将外网ip作为网关,并给外网ip管辖的电脑根据自己的规则分配ip,被分配的ip称为内网ip。例如:外网ip为:192.168.1.1。可以分配给自己管辖的电脑内网ip192.168.1.2、192.168.1.3、192.168.1.4。。。。
    • 现在假如内网ip192.168.1.2想要访问百度,那么内网192.168.1.2会将请求提交给网关192.168.1.1,让他去访问,得到结果后,再将结果返回给内网ip192.168.1.2。
    • 如果自己管辖的电脑同时访问,那么网关192.168.1.1如何区分下属的请求呢
    • 简单:网关192.168.1.1把内网ip192.168.1.2+端口号60,映射成网关ip192.168.1.1+端口号80就可以了
    • 同理:网关192.168.1.1把内网ip192.168.1.3+端口号60,映射成网关ip192.168.1.1+端口号90就可以了
    • 以此类推,这种映射方法叫做网络地址转换NAT
    • 注意:
      • 外网ip,也就是全球ip,每个ip都是唯一的。
      • 位于同一局域网内的私有ip,也就是内网ip,他们也是唯一的
      • 但是在两个不用局域网内的ip可能会相同
      • 局域网内主机之间的通信,是不需要进行地址转换的。
      • 如果需要访问外网,才需要进行地址转换
      • 这种地址转换也可以称为一种代理。网关相当于一个代理,把局域网内的主机的一些信息给隐藏起来。百度并不知道是哪台计算机主机访问了他,只知道是网关访问了它。
  • ipv6

22. IP地址和MAC地址有什么区别?各自的用处?

  • ip只是主要是用来网络寻址的(就是大概定位你在哪里)
  • MAC地址是身份的唯一象征,通过MAC来唯一确认你是不是你,但是MAC不具备寻址的功能

23. TCP 最大连接数限制

  • 如何标识一个TCP连接
    • 系统用一个四元组来唯一标识一个TCP连接{local ip, local port, remote ip, remote port}
  • client最大TCP连接数
    • client每次发起TCP连接请求时,除非绑定端口,通常会让系统选取出一个空闲的本地端口(local port),改端口是独占的,不能和其他TCP连接共享。
    • TCP端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能试用,所以最大连接数为65535,这些连接可以连到不同的server ip
  • server最大TCP连接数
    • server通常固定在某个本地端口上监听,等待client的链接请求。不考虑地址重用的情况下,即使server端有多个ip,本地监听端口也是独占的,因此最大TCP连接为客户端ip数x客户端port数,对ipv4,不考虑ip地址分类等因素,最大TCP连接数为2 的48次方
  • 实际的TCP连接数
    • 上面两个的连接数都是理想化的情况下。实际上收到了机器资源、操作系统等限制
    • TCP连接是需要占内存的,且每个TCP都会在socket文件中描述。
    • socket文件占用内存参数
    • rmen_max , wmen_max , tcp_rmen , tcp_wmen , tcp_men , grep skbuff/proc/slabinfo

24.ICMP 有哪些应用?

  • ping
    • 用来测试两台主机之间的连通性
    • 原理:通过向目标主机发送ICMP Echo请求报文,目的主机收到之后会发送Echo回答报文。ping会根据时间和成功响应的次数估算出数据包往返时间以及丢包率
  • Traceroute
    • 用来跟踪一个分组从源点到终点的路径
    • 原理:发送的ip数据报封装的是无法交付的UDP用户数据报,并由目的主机发送终点不可达错误报文
      • 源主机向目标主机发送一连串的ip数据报。第一个数据报P1的生存时间TTL设置为1,当P1到达路径上的第一个路由器R1时,R1收下它并把TTL减1,此时TTL等于0,R1就把P1丢弃,并向源主机发送一个ICMP时间超过差错报告报文
      • 源主机接着发送第二个数据报P2,并把TTL设置为2。P2到达R1,R1收下后吧TTL减1再发送给R2,R2收下后也把TTL减1,由于此时TTL等于0,R2就丢弃P2,并向源主机发送一个ICMP时间超时差错报文
      • 不断执行这样的步骤,知道最后一个数据报刚刚到达目的主句,主机不转发数据报,也不把TTL值减1。但是因为数据报封装的是无法交付的UDP,因此目的主机要向源主机发送ICMP终点不可达差错报告报文
      • 之后源主机知道了到达目的主机所经过的路由器ip地址以及到达每个路由器的往返时间

25. 保活计时器的作用?

  • 除时间等待计时器外,TCP还有保活计时器(Keepalive timer)
  • 例如客户端突然就不在了,那么服务器就没必要永无止境地等待客户端发送信息过来了。
    • 服务器每收到一次客户的数据,就重新设置保活计时器(通常为两个小时)
    • 若两个小时内,没收到客户的访问,
    • 那么服务器将会发送一个探测报文,以75秒发送一次
    • 若连续发送10次,客户端无响应
    • 则认为客户端出现故障,并断开连接

与第10题的不太一样哦

26. 简单说下 SYN FLOOD 是什么

  • SYNFlood又称SYN洪水攻击,也是拒绝服务攻击的一种。
  • 攻击者利用TCP协议的安全缺陷,不断发送一些列的SYN请求到目标系统,消耗服务器的资源,从而导致目标服务器不响应合法流量的请求
  • 复习一下正常的网络请求:
    • 域名解析
    • TCP握手建立连接
    • 客户端发起请求
    • 服务器响应请求
    • 客户端解析并且渲染页面
    • 至此一次请求结束
  • SYN洪水攻击正是发生在TCP握手阶段,TCP握手简单步骤为:客户端发送SYN请求数据包。服务器恢复ACK确认包,客户端再次恢复ACK确认包。至此握手结束。
  • SYN洪水攻击原理
    • 为了创建拒绝服务,供给制利用的是TCP协议的安全缺陷。在接受到初始SYN数据包之后,服务器用一个或多个SYN/ACK数据包进行响应,并等待握手中的最后一步,让服务器等待便是攻击的入口
    • SYN攻击会对目标服务器发送大量的SYN数据包,服务器会响应一个请求然后返回ACK确认包,并且等待客户端的最终响应
    • 因为攻击者通常使用虚拟ip,所以也就意味着服务器永远不可能接收到最终的确认包,这种情况下当服务器未接收到ACK数据包的时候,服务器一般会重发,并等待一段时间后,丢弃这个未完成的连接
    • 这段时间的长度我们称为SYNtimeout,一般来说这个时间是分钟的数量级(0.5~2分钟)一个用户出现异常导致服务器的一个线程等待一分钟并不是大问题,但是如果有一个恶意的攻击者大量模拟这种情况(伪造ip),那么服务端将为了维护一个非常大的半连接列表而消耗非常多的资源。从而造成服务器的崩溃,即使服务器再强大,服务器也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求
    • 此时,客户得不到服务器的正常响应。这种情况就叫做SYN洪水攻击
  • 在网络中,当服务器断开连接但连接另一端客户端没有断开连接时,连接被认为是半开的。在这种类型的DDOS攻击中,目标服务器不断离开打开的连接,等待每个连接超时,然后端口再次可用。所以这种攻击也可以被认为是“半开攻击”。

27. 谈谈你对停止等待协议的理解?

  • 作用——停止协议是为了实现可靠传输
  • 原理——每发完一个分组就停止发送,等待对方确认,在收到确认再发下一个分组。
  • 如果接收方收到发送方发送的重复分组,就丢弃该分组,并发送已收到
  • 触发的情况——无差错情况、出现差错情况(超时重传)、确认丢失、确认迟到

28. 谈谈你对 ARQ 协议的理解?

  • 自动重传请求ARQ协议
    • 停止协议中超时重传是指只要超过一段时间任然没有收到确认,就重传前面发送过的分组(认为刚才发送的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种重传方式常称为自动重传请求ARQ
  • 连续ARQ协议
    • 连续ARQ协议可提高通信利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组已经正确收到了。

29. 谈谈你对滑动窗口和流量控制的了解?

  • TCP利用滑动窗口实现流量控制的机制。滑动窗口是一种流量控制技术。
  • 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。
  • 由于大家都不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发送不了数据,所以就出现了滑动窗口机制来解决问题
  • TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接受数据。
  • 发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
  • 当滑动窗口为0时,发送方一般不能再发送数据报
  • 两种情况除外
    • 发送紧急数据——允许用户终止在远端机上的运行进程。
    • 发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小
  • 流量控制是为了控制发送方的速率,例如上面的滑动窗口就是其中一种
  • 保证接收方来得及接收。也杜绝了TCP缓冲区的溢出

30. URI和 URL之间的区别

  • URL——统一资源定位符(平时上网输入的网址),它标识一个互联网资源,并指定对其进行操作或获取改资源的方法。例如https://baidu.com表示可以通过https协议从相应位置获得。
  • URI——统一资源标识符(URL是URI的一个子集),两者都定义了资源,而URL还定位了如何能访问到资源。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
  • 简单来说,只要能唯一标识资源的就是URI,在URI的基础上给出其资源的访问方式就是URL

31. 谈下你对 TCP 拥塞控制的理解?使用了哪些算法?

什么是拥塞控制

  • 拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信的控制。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。

拥塞控制的作用

  • 为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不至于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。
  • 拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
  • 相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便接收端来得及接收

拥塞控制流程

  • 为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(cwnd)的状态量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化,发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个

拥塞控制算法

  • 慢开始算法
    • cwnd(拥塞窗口状态量)初始值设置为1,每经过一个RTT(传播轮次),cwnd加倍。
    • 也就是一开始不知道网络怎么样,从小到大逐渐增大拥塞窗口状态量
  • 拥塞避免算法
    • 在慢开始算法中,每经历一RTT(传播轮次),cwnd加倍,
    • 这里是每经历一个往返时间RTT就把发送方的cwnd加1
  • 快重传和快恢复算法FRR
    • 在TCP传输过程中,如果发送了丢包,接收端就会发送之前重复的ACK
    • 比如,第5个包丢了,6,7到达,那么接收端会为5,6,7都发送第4个包的ACK。
    • 这个时候,发送端收到了3个重复的ACK,就会意识到丢包了
    • 会马上进行重传,而不用等到RTO(超时重传时间)
    • 选择性重传:报文首部可选性中加入SACK属性,通过left edge和right edge标志那些包到了,然后重传没到的包
    • 如果发送端收到了3个重复的ACK,发现丢包,觉得选择网络状况已经进入了拥塞状态,那么就会进入快速恢复阶段
      • 会奖拥塞阀值降低为拥塞窗口的一半
      • 然后拥塞窗口大小变为拥塞阀值
      • 接着拥塞窗口再进行线性增加,以适应网络状况

32. 什么是粘包?

  • 一个数据包中包含了发送端发送的两个数据包的信息,这种现象称为粘包

33. TCP 黏包是怎么产生的?

  • 发送端产生粘包
    • 采用TCP协议传输数据的客户端与服务器是保持一个长连接的状态(一次连续发一次 数据不会存在粘包),双方在连接不断的情况下,可以一直传输数据。
    • 当发送的数据包过小时,TCP协议默认会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程)
    • 这个合并过程就是在发送缓冲区进行的,也就是说数据发送出来的时候,就已经是粘包的状态了。
    • 产生原因——Nagle算法
  • 接收方产生粘包
    • 数据到达接收方
    • 从网络模型的下方传递到传输层
    • 传输层的TCP昔日以处理是将其放置接收缓冲区
    • 然后由应用层俩主动获取(C语言用recv、read等函数)
    • 但如果,在缓冲区中,应用层使用读取函数没有及时将缓冲区的数据取出,而下一个数据到达。这时候读取到的数据就是一个粘包
    • 产生原因——数据存入缓冲区的速度 大于 应用层读取数据的速度

34. 怎么解决拆包和粘包?

  • 固定数据包的长度
  • 在数据包的头部加上数据包的长度
  • 使用特殊字符作为数据包的边界
  • 发送方不使用Nagle算法
  • 应用层自定义规则

35. forward 和 redirect 的区别?

  • 直接转发forward
    • 客户端和浏览器只发送一次请求,servlet、html、jsp或其他信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的
  • 间接转发redirect
    • 实际是两次http请求,服务端在响应第一次请求的时候,让浏览器再向另外一个url发出请求,从而达到转发的目的

36. HTTP 方法有哪些?

  • get——获取资源,当前网络中绝大部分使用的都是get
  • head——获取报文首部,和get方法类似,但是不返回报文实体主体部分
  • post——传输实体主体
  • put——上传文件,由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法
  • patch——对资源进行部分修改。put也可以用于修改资源,但是只能完全替代原始资源,patch允许对部分修改
  • options——查询指定的url支持的方法
  • connect——要求在与代理服务器通信时建立隧道。使用ssl(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输
  • trace——追踪路径。服务器会将通信路劲返回给客户端。发送请求时,在max-forwards首部字段中填入数值,每经过一个服务器就会减1,当数值为0时就停止传输。通常不会使用trace,并且它容易收到xst(跨站追踪)
  • delete——删除文件,与put功能相反,并且不带验证机制

37. 在浏览器中输入 URL 地址到显示主页的过程?

  • DNS解析
    • 浏览器查询DNS,获取域名对应的ip地址,具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的host文件和向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个ip地址映射,完成域名映射(此解析不具有权威性)。如果本地域名服务器并未缓存改网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
  • TCP连接
    • 浏览器获得域名对应的ip地址后,浏览器向服务器请求建立链接,发起三次握手
  • 发送http请求
    • TCP链接建立起来后,浏览器向服务器发送http请求
  • 服务器处理请求并放回http报文
    • 服务器接收到这个请求后,并根据路劲参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器
  • 浏览器解析渲染页面
    • 浏览器解析并渲染视图,若遇到js文件、css文件及图片等静态资源的引用,则重复上诉步骤并向服务器请求资源;浏览器根据其请求的资源、数据渲染页面,最终向用户呈现一个完整的页面
  • 连接结束
    • 四次挥手

38. DNS 的解析过程?

  • 本地解析
    • 得到url之后,计算机会先在本地进行解析
      • 先到浏览器的DNS缓存中寻找,有则返回ip,没有则下一步
      • 接着进行一个判断
        • 该软件/浏览器是否有进行有域名的直接查询
        • 有——直接连上软件/浏览器提供商提供的DNS,并返回ip
        • 没有——查询操作系统的缓存,有则返回ip,没有则下一步
      • 查找本地host文件,比如windows中的“C/Windows/System32/drivers/etc”,有则返回ip,没有就需要到本地DNS服务器上查找
  • 本地DNS服务器(LDNS)
    • 缓存服务器
      • 公共DNS服务器——例如:114DNS(114.114.114.114)Google(8.8.8.8)
      • 本地运行商提供的服务器——例如:上海电线202.96.209.5、202.96.209.133、116.228.111.118和180.168.255.118
      • 一般80%的域名解析到这里就完成
    • 缓存服务器找不知道的话,会用到递归服务器

递归查询和迭代查询一般是从:根名称服务器(.)(全球有13组根域名服务器,注:不是13台服务器)、顶级名称服务器(.com/.net)、二级名称服务器(csdn.net/baidu.com)、权威名称服务器(blog.csdn.net/www.baidu.com)的顺序来查找

  • 主机向本地域名服务器的查询一般都是采用递归查询
    • 如果主机所查询单本地域名服务器不知道被查询的域名的ip地址,
    • 那么本地服务器就以DNS客户的身份,向域名服务器继续发出查询请求报文(即替主机继续查询)
    • 而不是让主机自己进行下一步查询
    • 因此,递归查询返回的查询结果或者是所 要查询的ip地址,或者是报错,表示无法查询到所需的ip地址
    • 大白话
      • 返回给客户端的结果是——ip地址或者报错
  • 本地域名服务器想根域名服务器的查询是迭代查询
    • 当梗域名服务器收到本地域名服务器发出的挈带查询请求报文时,要么给出所要查询的ip地址,要么告诉本地服务器,你下一步得去哪里查询。
    • 然后本地服务器进行后续的查询。
    • 根域名服务器通常是把自己知道的顶级域名服务器的ip地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。
    • 顶级域名服务器在收到本地域名服务器的查询后,要么告诉所要查询的ip地址,要么告诉本地服务器下一步去哪找。
    • 最后,本地域名得到了所要解析的ip地址或者报错,然后把结果放回给发起的查询主机。
    • 大白话
      • 返回给客户的结果是——你得去那里找你所要的ip地址或ip地址或报错

39. 谈谈你对域名缓存的了解?

  • 为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高效缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
  • 由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器处理超过合理时间的项。
  • 当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理改项的域名服务器绑定信息。
  • 当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性
  • 不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的安全数据库,维护存放自己最近使用的域名的高速缓存,并且只在缓存中找不到名字时才使用域名服务器。
  • 维护本地域名服务器数据的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花费精力就能好维护数据库的一致性。

40. 谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?

  • http1.0默认短连接
    • 短连接——客户端与服务器每进行一次http操作,就建立一次连接,任务结束就断开
    • 适用场景——像web网站的http服务一般用短链接,因为长连接对于服务端来说会消耗一定的资源,而像web网站这么频繁的成千上万甚至上忆客户端的连接会更省一些资源。适用于并发量大,但每个用户无需频繁操作情况下的操作。
  • http1.1默认长连接
    • 长连接——会在响应头中加入Connection:keep-alive。建立连接后,在keep-alive时间内,不会断开连接
    • 适用场景——多用于操作频繁,点对点通讯,而且连接数不能太多情况。因为每一次握手和挥手都需要消耗资源。如果频繁断开和建立连接,会造成资源浪费。例如:数据库,如果用短连接的话,会造成socket错误,而且频繁的socket创建也是对资源的浪费。

41. HTTPS 的工作过程?

  • 客户端发送自己支持的加密规则给服务器,代表告诉服务器要进行连接了
  • 服务器从中选出一套加密算法和hash算法以为自己的身份信息(地址等)以证书的形式发送给浏览器,证书中包含服务器信息,加密公钥,证书的办法机构
  • 客户端收到网站的证书之后要做下面的事情
    • 验证证书的合法性
    • 如果验证通过证书,浏览器会生成一串随机数,并用证书中的公钥进行加密
    • 用约定好的hash算法计算握手信息,然后用生成的秘钥进行加密,然后一起发送给服务器
  • 服务器收到客户端送来的信息,要做下面的事情
    • 用私钥解析出密码,用密码解析握手信息,验证hash值是否和浏览器发来的是否一致
    • 使用秘钥加密消息
  • 如果计算hash值一致,握手成功

42.简单说下怎么实现 DNS 劫持

  • 域名劫持——通过将原域名对应的ip地址进行替换,从而使得用户访问到错误的网站或者使得用户无法正常访问网站的一种攻击方式。
  • 域名劫持往往只能在特定的网络范围内进行,范围外的DNS服务器能够返回正常的ip地址。攻击者可以冒充原域名所属机构,通过电子邮件的方式修改组织机构的域名注册信息,或者将域名转让给其他组织,并将新的域名信息保存在所指定的DNS服务器中,从而使得用户无法通过对原域名进行解析来访问目的的网址。
  • 具体步骤
    • 获取要劫持的信息:攻击者首先会访问域名查询站点查询要劫持的域名信息
    • 控制域名相应的E-MAIL账号:在获取到域名信息后,攻击者通过暴力破解或者专门的方法破解公司注册域名时使用的E-MAIL账号所对应的密码。更高级的攻击者甚至能够直接对E-mail进行信息窃取
    • 修改注册信息:当攻击者破解了E-mail后,会利用相关的更改功能修改域名的注册信息,包括域名拥有者的信息,DNS服务器信息等
    • 使用E-mail收发确认函:在修改完注册信息后,攻击者在E-mail真正拥有者之前收到修改注册信息的相关确认信息,并恢复确认修改文件,待网络公司恢复已成功修改信件后,攻击者便完成DNS劫持。
  • 预防手段:
  • 通过ip地址访问网址,绕过DNS
  • 由于域名劫持往往只能在特定的网络范围内进行,因此一些高级用户可以通过网络设置让DNS指向正常的域名服务器,以实现对目的网址的正常访问,例如将计算机首选DNS服务器的地址固定为8.8.8.8

43. HTTPS 的优缺点?

  • 优点
    • 使用HTTPS协议可认证用户和服务器,确保发送到正确的客户机和服务器
    • HTTPS协议是由SSL+HTTP协议侯建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性
    • HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本
  • 缺点
    • HTTPS协议握手阶段比较费时,会使页面加载时间延长50%,增加10%到20%的耗电
    • HTTPS连接缓存不如http高效,会增加数据开销和功耗,甚至已有安全措施也会因此而受到影响
    • SSL证书需要钱,功能越强大的证书费用越高,个人网站,小网站没有必要一般不会用
    • SSL证书通常需要绑定ip,不能在同一ip上绑定多个域名,ipv4资源不可能支撑这个消耗
    • HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人一样可行

44. TIME_WAIT 状态会导致什么问题,怎么解决

  • 我们在考虑高并发短链接的业务场景,在高并发短连接的TCP服务器上,当服务器处理完请求后主动请求关闭连接,这样服务器上会有大量的连接处于TIME-WAIT状态,服务器维护每一个连接需要一个socket,也就是每个连接会占用一个文件描述符,而文件描述符的使用是有上限的,如果持续高并发,会导致一些正常的连接失败
  • 解决方案:
    • 服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口被占用,但TCP连接位于TIME_WAIT状态时可以重用端口。如果你的服务器程序停止就像立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSADDR选项就可以避免TIME-WAIT状态
    • 也可以采用长连接的方式减少TCP的连接与断开,在长连接的业务中往往不需要考虑TIME-WAIT状态,但其实在长连接的业务汇总并发量一般不会太高
  • 具体操作
    • /etc/sysctl.conf
    • net.ipv4.tcp_tw_reuse = 1表示开启重用。允许TIME-WAIT socket重新用于新的TCP 连接,默认为0,表示关闭
    • net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

45. DNS 为什么用 UDP

  • 其实DNS整个过程既使用TCP又使用UDP
  • 当进行区域传送(煮玉米服务器想辅助域名服务器传送变化的那部分数据)时会使用TCP,因为数据同步传送的数据量比一个请求和应答的数据量要多,而TCP允许的报文长度更长,因此为了保证数据的正确性,会使用基于可靠连接的TCP
  • 当客户端向DNS服务器查询域名(域名解析)的时候,一般返回的内容不会超过UDP报文的最大长度(512字节)。用UDP传输时,不需要经过TCP三次握手过程,从而大大提高了响应速度,但这要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。

46. Cookie 和 Session 有什么区别?

  • session由来——http协议是无状态的协议,但是服务端需要记录用户的状态,就需要某种机制来识别具体的用户。
  • session功能——识别用户,跟踪用户,判断用户当前状态
  • session存在位置——位于服务端,是唯一的标识。在服务端保存session的方法很多,内存、数据库、文件。搭建集群的时候也要考虑session的转移,在大型网站中,一般会有专门的session服务器集群,用来保存用户会话,这个时候,session信息都是放在内存的,使用一些缓存服务比如memcached之类的来放session
  • cookie由来——为了让服务端能识别每一个客户。每次http请求的时候,客户端会发送相应的cookie信息到服务端。实际上大多数的应用都是cookie来实现session的跟踪,第一次创建session的时候,服务端会在http协议中告诉客户端,需要在cookie里面记录一个session id,以后每次请求吧这个会话id发送到服务器,服务器就知道客户是谁了。
  • cookie被禁用怎么办——会使用一种URL重写来进行跟踪,每次http交互,URL后面都会附加上一个sid = XXXXXX 这样的参数,服务端据此来识别用户
  • cookie使用场景——登录过一次网站后,下次登录不需要再输入用户民和密码了。网页会把你的信息写到cookie中,访问网站时,网站页面的脚本可以读取这个信息,就可直接不用输入用户名和密码
  • session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中
  • cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现session的一种方式

47. UDP 如何实现可靠传输?

都知道UDP不可靠,那只能在UDP所在传输层的下一次应用层中来实习可靠

  • 最简单的方法是方式是在应用层模仿传输层TCP的可靠性,在不考虑拥塞处理,可以这样简单设计
    1. 添加seq/ack机制,确保数据发送到对面
    2. 添加发送和接收缓冲区,主要是用户超时重传
    3. 添加超时重传机制
  • 详细说明:发送端发送数据时,生成一个随机seq = X,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack = X的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应数据。时间到后,定时任务检查是否需要重传数据。
  • 目前开源利用udp可靠数据传输:RUDP、RTP、UDT
  • RUDP——提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等
    • 如而在包丢失和网络拥塞的情况下,RTP客户机(实时位置)面前呈现的就是一个高质量的RTP流。在不干扰协议的实时特性的同时,可靠UDP的拥塞控制知己允许TCP方式下的流控制行为。
  • RTP——为数据提供了具有实时特征的端对端传送服务
    • 如在组播或单播网络服务下的交互视频音频或模拟数据,应用程序通常在UDP上运行RTP以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是RTP可以与其他适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么RTP可以使用该组播传输数据到多个目的地。
    • RTP本身并没有提供按时发送机制或其他服务质量(QoS)保证,它依赖于底层服务去实现这一过程。RTP并不保证传送或防止无序传送,也不确定底层网络的可靠性。RTP实行有序传送,RTP中的序列号允许接收方重组发送方的序列,同时序列号也能用于决定适当的包位置。
  • UDT——基于UDP的数据传输协议
    • 一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。
    • UDT建与UDP之上,并引入新的 拥塞控制和数据可靠性控制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其他应用领域,例如:点到点技术(P2P),防火墙穿透,多媒体数据传输等

48. Keep-Alive 和非 Keep-Alive 有什么区别?

  • 短连接与长连接
  • 有Keep-Alive的会等待时间过了之后,才关闭连接,而没有的则完成一次任务后就关闭连接
  • Keep-Alive的缺点:长连接,会导致资源被占用,效率降低。如果对Keep-Alive的参数配置不当,那会有更大的损失
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络工程师面试题可以包括以下几个方面的内容: 1. 网络地址和子网划分:有类网络和无类网络的区别是什么?有类网络IP地址视为三部分:网络字段、地址末尾的主机部分和网络和主机部分之间的子网部分。而无类网络网络部分和子网部分合并为一个单独部分,称为子网或前缀,地址末端也是主机部分。无类网络IP地址掩码是变长的。划分子网是指在网络内部进行地址分配,从主机号部分借用位来形成子网,涉及到子网时需要使用子网掩码来计算网络号。 2. OSI模型:OSI参考模型由下往上依次包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。各层的PDU单位分别是:物理层的PDU单位是位、数据链路层的PDU单位是帧、网络层的PDU单位是包、传输层的PDU单位是段。 3. 网络安全:网络工程师需要具备网络安全的知识,包括网络攻击与防范、防火墙、入侵检测系统、***连接和通信。 5. 网络协议:网络工程师需要了解常见的网络协议,如TCP/IP协议族、IP地址分配与子网掩码、路由协议(如OSPF、BGP)、网络服务协议(如DNS、DHCP)等。 6. 网络设备配置与故障排除:网络工程师应该熟悉网络设备的配置与管理,包括路由器、交换机、防火墙等设备。同时,他们还需要具备故障排除的能力,能够分析和解决网络故障。 综上所述,网络工程师面试题涵盖了网络地址和子网划分、OSI模型、网络安全、路由与交换、网络协议以及网络设备配置与故障排除等方面的知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [网络工程师面试题60例分析](https://blog.csdn.net/m0_57602298/article/details/129184404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值