Contents

计算机网络知识总结

计算机网络

github地址

HTTP,HTTPS,DNS协议

OSI七层模型

介绍一下OSI七层模型和TCP五层模型?

​ OSI七层模型从上到下依次为:

  • 应用层:为应用程序提供网络服务;
  • 表示层:数据格式转换、数据压缩和数据加密;
  • 会话层:建立、断开和维护通信链接;
  • 传输层:为上层协议提供端到端的可靠传输;
  • 网络层:寻址和路由;
  • 数据链路层:定义通过通信媒介互连的设备之间传输的规范;
  • 物理层:利用物理传输介质为数据链路层提供物理连接。

​ TCP五层模型相比OSI七层模型,将OSI的应用层、表示层和会话层合为一层:应用层,其他不变。

​ TCP/IP五层协议包括:应用层,传输层,网络层,数据链路层,物理层

TCP,UDP,IP协议分别属于什么层?

​ TCP,UDP协议属于传输层

​ IP协议属于网络层

HTTP版本1.0,1.1,2.0

http/1.0和http/1.1有什么区别?

​ HTTP1.1默认开启长连接。在一个TCP连接上可以传送多个HTTP请求和响应。使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。

​ 支持管道(pipeline)网络传输。只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

​ http/1.1的缺点是服务端无法主动push

http短连接和长连接有什么区别?

​ HTTP中的长连接短连接指HTTP底层TCP的连接。

​ 短连接: 客户端与服务器进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。

​ 长连接:如果HTTP头部带有参数keep-alive,即开启长连接,网页完成打开后,底层用于传输数据的TCP连接不会直接关闭,会根据服务器设置的保持时间保持连接,保持时间过后连接关闭。

http/2.0相比较与http/1.1有什么特性?

  • 多路复用。允许同时发起多重的“请求-响应”消息
  • 头部压缩。对消息头采用 Hpack 算法进行压缩传输,能够节省消息头占用的网络流量
  • 服务端推送。服务器端能够更快的把资源推送到客户端

HTTP报文结构,请求方法,状态码

http请求方法有哪些?

  • GET: 从服务器获取资源
  • POST: 在服务器新建资源
  • PUT: 在服务器更新资源
  • DELETE: 在服务器删除资源
  • HEAD: 获取资源的元数据
  • OPTIONAL: 查询对指定的资源支持的方法

get和post方法有什么区别?

​ Get:指定资源请求数据,刷新无害,Get请求的数据会附加到URL中,传输数据的大小受到url的限制。

​ Post:向指定资源提交要被处理的数据。刷新会使数据会被重复提交。post在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。

http状态码200,403等等表示什么意思?

  • 1XX:接收的信息正在处理
  • 2XX:请求正常处理完毕
  • 3XX:重定向
  • 4XX:客户端错误
  • 5XX:服务端错误
    • 200:OK 请求被正常处理
    • 204:No Content 请求被受理但没有资源可以返回
    • 301:永久性重定向
    • 302:临时重定向
    • 304:Not Modified 所请求的资源未修改,服务器返回此状态码,不返回任何资源
    • 400:Bad Request 客户端请求报文语法有误,服务器无法识别
    • 401:Unauthorized 请求需要认证
    • 403:Forbidden 请求的对应资源禁止被访问
    • 404:Not Found 服务器无法找到对应资源
    • 500:Internal Server Error 服务器内部错误
    • 502:Bad Gateway 网关或者代理服务器请求时,从远程服务器接收到一个无效的响应
    • 503:Service Unavailable 服务器正忙

HTTP和HTTPS

HTTP和HTTPS的区别?

http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份。 https具有安全性的ssl加密传输协议,加密采用对称加密, https协议需要到ca申请证书,一般免费证书很少,需要交费。

请简述TLS技术的工作原理?

SSL全称为Secure Sockets Layer即安全套接层,其继任为TLSTransport Layer Security传输层安全协议,均用于在传输层为数据通讯提供安全支持。

可以将HTTPS协议简单理解为HTTP协议+TLS/SSL

DNS服务与安全

请简述域名系统DNS的工作流程?

  1. 客户端发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给本地dns服务器
  2. 本地服务器没有找到客户端查询的信息,就会将此请求发送到根域名dns服务器
  3. 根域名服务器解析客户端请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户端的dns服务器
  4. 客户端的dns服务器根据返回的信息接着访问下一级的dns服务器
  5. 这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
  6. 客户端的本地的dns服务器会将查询结果返回给我们的客户端
  7. 客户端根据得到的ip信息访问目标主机,完成解析过程

请简述cookie和session?

HTTP 协议本身是无状态的,为了使其能处理更加复杂的逻辑,HTTP/1.1 引入 Cookie 来保存状态信息。

Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等等。

session用于标记特定客户端信息,存在在服务器的一个文件里。 一般客户端带Cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息。

你了解DNS攻击吗?是什么原理?

DNS攻击主要包括DNS劫持,DNS欺骗以及DDoS攻击

DNS劫持:通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的DNS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,以至于访问该域名时,进入了黑客所指向的内容。

DNS欺骗:DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了。

DDoS攻击:DDoS是一种网络攻击手法,DNS服务器本质上也是程序,黑客通常利用程序中的漏洞使目标服务器的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。

TCP,UDP,IP协议

传输层协议

请简述TCP和UDP的区别?

  • TCP作为面向流的协议,提供可靠的、面向连接的传输服务,并且提供点对点通信
  • UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播

TCP连接及释放

请简述三次握手的过程?为什么两次不行?

  1. 第一次握手:客户端将标志位SYN置为1,随机产生一个序列号seq=x,并将该数据包发送给服务端,客户端 进入syn_sent状态,等待服务端确认。
  2. 第二次握手:服务端收到数据包后将标志位SYN和 ACK都置为1,随机产生一个序列号seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。
  3. 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输 数据了

假如TCP建立连接是两次握手的话,那么只要服务器有回应就建立连接;如果客户端因为网络问题发送了两次或者多次请求连接的信息,那么就会建立很多次不可靠的连接;另外如果服务器在返回给客户端的ACK数据包因为网络问题导致丢失,而客户端没有收到该ACK数据包而拒绝接收服务器接下来发送的数据,于是服务器一直在发送,客户端一直在拒绝,形成死锁,浪费服务器资源。

TCP三次握手时的第一次的seq序号是怎样产生的字节提前批

第一次的序号是随机序号,但也不是完全随机,它是使用一个ISN算法得到的。

seq = C + H (源IP地址,目的IP地址,源端口,目的端口)。其中,C是一个计时器,每隔一段时间值就会变大,H是消息摘要算法,输入是一个四元组(源IP地址,目的IP地址,源端口,目的端口)。

请简述四次挥手的过程?为什么三次不行?

  1. 第一次挥手:客户端将标志位FIN置为1,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。
  2. 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
  3. 第三次挥手:服务端标志位FIN置为1,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。
  4. 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

如果是三次挥手,即把服务端向客户端发送报文的第二次挥手和第三次挥手合为一次,会造成服务端发送了回执后立刻又发送断开请求,造成服务端有数据没有全部发送至客户端,因此必须将第二次挥手和第三次挥手分开;五次挥手则完全没必要,多此一举。

TIME_WAIT为什么是2MSL,而不是1MSL或者3MSL?

TIME_WAIT是指四次挥手中客户端接收了服务端的FIN报文并发送ACK报文给服务器后,仍然需要等待2MSL时间的过程。MSL即报文最大生存时间。

设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。如果客户端发送的ACK发生丢失,服务器会再次发送FIN报文给客户端,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

TCP的可靠连接和粘包

请简述TCP协议的滑动窗口?

TCP的滑动窗口用来控制接收方和发送方的发送速率,避免拥塞的发生。滑动窗口其实就是接收端的缓冲区大小,接收方通在每个ACK数据包中附带自己当前的接受窗口(滑动窗口)的大小,当接收方确认了连续的数据序列之后,发送方的滑动窗口向后滑动,发送下一个数据序列,从而控制发送方的发送速度。

请简述TCP协议的拥塞控制及算法?

拥塞控制是为了防止过多的数据注入到网络中,这样可能使网络中的路由器或链路负载过重,拥塞控制也是控制发送者的流量,拥塞控制有四种算法,慢启动、拥塞避免,快速重传和快速恢复

(1)慢启动。慢启动算法的思路是当主机开始发送数据时,先以比较小的拥塞窗口进行发送,然后以指数级翻倍,也就是说,由小到大逐渐增加拥塞窗口的大小。为了防止拥塞窗口cwnd增长过大引起网络拥塞,还要另外设置一个慢启动阈值ssthresh状态变量,当拥塞窗口的大小超过慢启动阈值的时候( cwnd > ssthresh 时),停止使用慢开始算法而改用拥塞避免算法

(2)拥塞避免。拥塞避免算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。

(3)快速重传。如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。

(4)快速恢复。当超过设定的时间没有收到某个报文段的ack时,表示网络拥塞,慢启动阈值ssth变为原来一半,拥塞窗口cwnd=1,进入慢启动阶段

拥塞控制和流量控制的区别

拥塞控制是防止过多的数据注入到网络中,导致网络发生拥塞;而流量控制是防止发送方一下子发送过多的数据到接收方,导致接收方缓存放不下。两种算法都是对发送方的行为进行控制的。

你了解ARQ协议吗?

ARQ协议,即自动重传请求(Automatic Repeat-reQuest),意思是如果发送方在发送后一段时间之内没有收到确认回执,它通常会重新发送。

请介绍一下TCP的粘包现象以及如何避免

TCP是面向流协议,发送的单位是字节流,因此会将多个小尺寸数据被封装在一个TCP报文中发出去的可能性。 可以简单的理解成发送端调用了两次send,接收端一个recv就把信息都读出来了。

导致TCP粘包的原因主要有两方面:

  • 发送端等待缓冲区满才进行发送,造成粘包
  • 接收方来不及接收缓冲区内的数据,造成粘包

避免粘包的措施:

  • 通过编程,强制使TCP进行数据传送,不必等到缓冲区满
  • 优化接收方接收数据的过程,使其来得及接收数据包,包括提高接收进程优先级等
  • 固定发送信息长度,或在两个信息之间加入分隔符。

请简述SYNflood攻击的原理

SYN Flood是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量。通过重复发送初始连接请求(SYN)数据包,攻击者能够压倒目标服务器机器上的所有可用端口,导致目标设备根本不响应合法流量。

原理是利用TCP连接三次握手的漏洞,使用欺骗性的IP地址,向目标服务器发送大量的SYN数据包

防范

  • 第一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数。
  • 第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,并记录地址信息,以后从这个IP地址来的包会被一概丢弃。

浏览器中输入一个网址后,具体发生了什么

  1. 首先是域名解析,客户端使用DNS协议将URL解析为对应的IP地址;
  2. 然后建立TCP连接,客户端与服务器通过三次握手建立TCP连接;
  3. 接着是http连接,客户端向服务器发送http连接请求; (http连接无需额外连接,直接通过已经建立的TCP连接发送)
  4. 服务器对客户端发来的http请求进行处理,并返回响应;
  5. 客户端接收到http响应,将结果渲染展示给用户。

参考资料

超全面的后端开发C/C++面经整理分享

计算机网络八股文背诵版

计算机网络面试题(含答案)