lunix555 / Cpp-interview-tips

主要是一些C++常用知识总结
1 stars 0 forks source link

计算机网络篇 #2

Open lunix555 opened 2 years ago

lunix555 commented 2 years ago

1、TCP如何保证可靠性

1、第一是通过序列化、确认应答机制和超时重传机制。发送端向接收端发送数据,当接收端收到数据时,需要向发送方发送一个确认应答,表示已收到该数据,并且确认序号会说明下一次需要接收的数据的起始序号。如果发送端一直没有收到确认应答,则表示发送的数据丢失或者确认应答丢失,此时发送方会等待一定时间对数据进行重传 2、第二是滑动窗口机制,主要进行数据流量管理,平衡两端之间的数据吞吐量,解决因接收缓冲区溢出而导致的丢包问题 3、第三是拥塞控制,通过进行网络探测,以一种慢启动,快增长的传输方式,根据网络状态调整发送速度的机制,解决因网络不好导致的丢包问题

2、http和https的区别

HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据是经过加密后的数据,HTTPS具有更高的安全性 HTTP协议端口是80,HTTPS协议端口是443 HTTPS协议需要通信前服务端需要申请证书,浏览器端安装对应的根证书,而HTTP不需要申请证书

3、TCP和UDP的区别及使用场景

区别:

TCP是面向连接的传输层协议,传输数据前必须建立好连接;而UDP是无连接的传输层协议,不需要两端建立连接就可以传输数据 TCP是点对点服务,即一条TCP连接只能有两个端点;UDP支持一对一,一对多,多对一,多对多的交互通信 TCP可以保证数据的可靠行,UDP是尽最大努力交付,不保证可靠性 TCP首部开销大,20个字节,UDP首部仅有8个字节 使用场景:TCP传输数据可靠但是速度较慢,而UDP传输速度快但不可靠,若数据通信完整性比实时性重要则选用TCP,反之选UDP

4、post和get的区别

get的请求数据是通过url传递的,而post是将数据放在正文中传递的 get请求在url中传递的数据是有长度限制的,而post没有 post比get更安全,因为get参数是直接暴露在url中的 get请求会产生一个TCP数据包,而post会产生两个TCP数据包(原因是get请求会将头部和数据一起发送,服务端会进行响应;而post会先进行头部传输,得到一次响应后再发送数据,服务端会再进行响应,所以会产生两TCP数据包) get请求只能进行url编码,而post支持多种编码方式

5、OSI七层模型和TCP/IP五层模型

七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 物理层:负责光电信号的传输 以太网协议 数据链路层:负责相邻设备之间的数据帧传输和网卡硬件地址的描述 以太网协议 网络层:负责地址管理和路由选择 IP协议 传输层:负责服务端和客户端应用程序之间的数据传输 udp、tcp 会话层:负责建立和断开通信连接 表示层:负责设备的数据格式与网络标准数据格式之间的转换 应用层:负责应用程序之间的沟通,约定通信数据的格式 HTTP、FTP、DNS、DHCP

五层:物理层、数据链路层、网络层、传输层、应用层 物理层:负责光电信号的传输 以太网协议 数据链路层:负责相邻设备之间的数据帧传输和网卡硬件地址的描述 以太网协议 网络层:负责地址管理和路由选择 IP协议、ICMP协议 传输层:负责服务端和客户端应用程序之间的数据传输 udp、tcp 应用层:负责应用程序之间的沟通,约定通信数据的格式 HTTP、FTP、DNS、DHCP

6、解释HTTP状态码及说出常见HTTP状态码

以1开头表示服务器收到请求,需要继续执行操作;以2开头的状态码表示请求已成功被接受;以3开头的表示重定向,需要进一步的操作才能完成请求;以4开头的表示是客户端的请求错误;以5开头的表示服务器错误,服务器在处理请求的过程中发生了错误; 200:表示客户端请求成功 301:表示永久重定向,表示请求的资源已被永久的移动到新URI 302:表示临时重定向,请求的资源临时从不同的URI中获取 400:表示客户端请求的语法错误,服务器无法理解 404:表示服务器无法根据客户端的请求找到资源(网页) 500:表示服务器的内部错误,无法完成请求 502:表示作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 504:表示充当网关或代理的服务器,未及时从远端服务器获取请求

lunix555 commented 2 years ago

7、三次握手及四次挥手

TCP全称为Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。 20210503135922146

优雅回答三次握手

三次握手:服务端新建套接字,绑定地址信息后开始监听,进入LISTEN状态。客户端新建套接字绑定地址信息后调用connect,发送连接请求SYN,并进入SYN_SENT状态,等待服务器的确认。服务端一旦监听到连接请求,就会将连接放入内核等待队列中,并向客户端发送SYN和确认报文段ACK,进入SYN_RECD状态。客户端收到SYN+ACK报文后向服务端发送确认报文段ACK,并进入ESTABLISHED状态,开始读写数据。服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了 image

为什么握手是三次,而不是两次或者四次?

答:两次不安全,四次没必要。tcp通信需要确保双方都具有数据收发的能力,得到ACK响应则认为对方具有数据收发的能力,因此双方都要发送SYN确保对方具有通信的能力。第一次握手是客户端发送SYN,服务端接收,服务端得出客户端的发送能力和服务端的接收能力都正常;第二次握手是服务端发送SYN+ACK,客户端接收,客户端得出客户端发送接收能力正常,服务端发送接收能力也都正常,但是此时服务器并不能确认客户端的接收能力是否正常;第三次握手客户端发送ACK,服务器接收,服务端才能得出客户端发送接收能力正常,服务端自己发送接收能力也都正常。

三次握手可以携带数据吗?

答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。假设第一次可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手中的SYN报文放入大量数据,重复发送大量SYN报文,此时服务器会花费大量内存空间来缓冲这些报文,服务器就更容易被攻击了

tcp三次握手失败,服务端会如何处理?

答:握手失败的原因有两种,第一种是服务端没有收到SYN,则什么都不做;第二种是服务端回复了SYN+ACK后,长时间没有收到ACK响应,则超时后就会发送RST重置连接报文,释放资源

ISN代表什么?意义何在?ISN是固定不变的吗?ISN为何要动态随机

答:ISN全称是Initial Sequence Number,是TCP发送方的字节数据编号的原点,告诉对方我要开始发送数据的初始化序列号。ISN如果是固定的,攻击者很容易猜出后序的确认号,为了安全起见,避免被第三方猜到从而发送伪造的RST报文,因此ISN是动态生成的

什么是半连接队列

答:服务器第一次收到客户端的SYN之后,就会处于SYN_RECD状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起来连接的就会放在全连接队列中,如果队列满了就有可能出现丢包现象

优雅回答四次挥手

四次挥手:客户端主动调用close时,向服务端发送结束报文段FIN报,同时进入FIN_WAIT1状态;服务器会收到结束报文段FIN报,服务器返回确认报文段ACK并进入CLOSE_WAIT状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段;服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待最后一个ACK的带来;客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出送确认报文段ACK;服务器收到了对结束报文段确认的ACK,进入CLOSED状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态 image

为什么握手是三次,而挥手时需要四次呢?

答:其实在TCP握手的时候,接收端将SYN包和ACK确认包合并到一个包中发送的,所以减少了一次包的发送。对于四次挥手,由于TCP是全双工通信,主动关闭方发送FIN请求不代表完全断开连接,只能表示主动关闭方不再发送数据了。而接收方可能还要发送数据,就不能立即关闭服务器端到客户端的数据通道,所以就不能将服务端的FIN包和对客户端的ACK包合并发送,只能先确认ACK,等服务器无需发送数据时在发送FIN包,所以四次挥手时需要四次数据包的交互

TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?

答:如果主动关闭方进入CLOSED状态后,被动关闭方发送FIN包后没有得到ACK确认,超时后就会重传一个FIN包。如果客户端没有TIME_WAIT状态而直接进入CLOSED状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害,第一种是这个刚启动的新的客户端绑定地址成功时,就会收到了一个重传的FIN包,对新连接就会造成影响。第二种是如果该新客户端向相同的服务端发送SYN连接请求,但是此时服务端处于LAST_ACK状态,要求收到的是ACK而不是SYN,因此就会发送RST重新建立请求。

为什么TIME_WAIT状态需要经过2MSL才能进入CLOASE状态?

答:MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包

一台主机上出现大量的TIME_WAIT是什么原因?应该如何处理?

答:TIME_WAIT是主动关闭方出现的,一台主机出现大量的TIME_WAIT证明这台主机上发起大量的主动关闭连接。常见于一些爬虫服务器。这时候我们应该调整TIME_WAIT的等待时间,或者开启套接字地址重用选项

一台主机上出现大量的CLOSE_WAIT是什么原因?应该如何处理?

答:CLOSE_WAIT是被动关闭方收到FIN请求进行回复之后的状态,等待上层程序进一步处理,若出现大量CLOSE_WAIT,有可能是被动关闭方主机程序中忘了最后一步断开连接后调用close释放资源。这是一个 BUG.,只需要加上对应的 close 即可解决问题

tcp连接管理中的保活机制

答:tcp通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端会向客户端发送一个保活探测数据报,要求客户端进行回复。若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。这些数据都可以在套接字中修改,接口:Setsockopt

lunix555 commented 2 years ago

8、cookie和session的区别

1、cookie和session都是会话技术,cookie是运行在客户端上的,而session是运行在服务器上的 2、cookie有大小的限制及浏览器存cookie的大小也是有限制的。而session是没有大小限制的,而是和服务器的内存大小有关的 3、cookie存在客户端,存在安全隐患,当别人通过拦截或者从本地文件中找到你的cookie后可以获取你cookie的信息。而session是保存在服务器上的,相对安全些,但是session过多也会增加服务器额压力

9、浏览器输入url回车后,都发生了什么?

浏览器向DNS服务器发送输入进来的url,DNS服务器收到后会返回url对应的IP地址。浏览器就根据IP地址与目标服务器建立TCP连接,然后获取请求页面的html代码,在浏览器的显示窗口内对HTML进行解析渲染,当窗口关闭时,浏览器终止与服务器的连接。

10、滑动窗口实现原理

滑动窗口是实现流量控制,解决丢包问题的一种机制。发送方和接收方都有一个滑动窗口。滑动窗口的大小是由接收方处理数据的能力决定的,表示的是发送的最大数据量。发送方的发送窗口只有收到接收方的ack确认响应之后才会移动发送窗口的左边界。当接收方对前面所有的数据都确认回复后才会移动接收窗口的左边界,如果前面数据未收到而后面的数据先到,此时窗口也不会移动,并不会对已经到达的数据进行回复,确保对端会对这些数据进行重传

11、拥塞控制讲一讲

拥塞控制主要解决因网络不好而导致大量丢包的问题。拥塞控制主要有4个算法,分别是慢启动、拥塞避免、拥塞发生和快速恢复。在慢启动算法中,每当发送方收到一个ack确认响应,拥塞窗口的大小就会+1。也就是拥塞窗口在慢启动算法下呈指数增加。有一个叫慢启动门限变量(默认64k),当拥塞窗口大小大于该变量时,会使用拥塞避免算法。使拥塞窗口的大小增长速度缓慢些,呈线性增长。当网络状态不好时,会对数据包进行重传,如果是超时重传,慢启动门限变量会变为当前拥塞窗口的一半,且拥塞窗口大小重置为1,重新使用慢启动算法。如果是快速重传,拥塞窗口的大小会变为原来大小的一半,慢启动门限变量变为拥塞窗口大小,然后进入快速恢复算法,此时的拥塞窗口大小就为当前拥塞窗口大小+3,并进入拥塞避免算法。 image

lunix555 commented 2 years ago

12、HTTPS协议加密流程

https加密流程是将ca认证和混合加密合在一起用的,服务器先生成一个公钥和私钥,然后到权威机构请求颁发一个证书;通信双方建立连接后,服务器会将证书发送给客户端,客户端收到证书会对证书进行解析,根据解析出来的信息进行身份验证;身份验证通过后,使用公钥进行加密,也就是产生一个随机数和自己所支持的对称加密算法列表发送给服务器;服务器收到数据使用私钥进行解密,给客户端回复一个随机数和自己所支持的对称加密算法列表;双方通过自己的随机数与对方发送过来的随机数配合对称加密算法列表进行计算得到一个对称密钥;往后通信都使用对称密钥进行通信

13、说说HTTP的新特性

在http0.9版本中,只支持了html数据传输,而且只有get请求方式,也没有规定标准格式;在1.0版本中规定了http协议的标准格式,也增加了许多请求方式,支持短连接;而在1.1版本是在1.0版本的基础上添加了更多的请求方法和头部信息,并且支持了长连接管线化传输。在2.0版本中采用的是二进制流进行传输,支持多路复用,并允许服务端主动推送数据

14、cookie个session的工作流程

服务端会为每个登录的用户创建一个sesseion对象和一个session ID,其中session保存了客户的重要信息,然后再利用cookie来保存session ID,发送给客户端。客户端每次要访问服务器时只需要传递带有session ID的cookie,服务端就根据已保存的session ID来确认客户端的身份。

lunix555 commented 2 years ago

15、http请求方法有哪些?get和post的区别

OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。 GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form PUT 向指定资源位置上传其最新内容 DELETE 请求服务器删除Request-URL所标识的资源 TRACE 回显服务器收到的请求,主要用于测试或诊断 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 (1)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 (2)根据HTTP规范,POST表示可能修改变服务器上的资源的请求

lunix555 commented 2 years ago

16、http中浏览器一个URL的流程,这个过程中浏览器做些什么,URL包括哪三个部分?

浏览器向DNS服务器查找输入URL对应的IP地址。 DNS服务器返回网站的IP地址。 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码。 浏览器在显示窗口内渲染HTML。 窗口关闭时,浏览器终止与服务器的连接。 URL包括:①协议(或称为服务方式);②存有该资源的主机IP地址(有时也包括端口号);③主机资源的具体地址,如目录和文件名等。

17、http四个会话过程?

建立tcp连接 发出请求文档 发出响应文档 释放tcp连接

网页解析的过程

18、一个机器能使用的端口号上限是多少?为什么?可以改变吗?如果想要用的端口超过这个限制怎么办?==

端口号最多是65535个,端口号2个字节,16位,所以最大表示65535.不能改变

对称加密和非对称加密 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

19.TCP/IP分片粘包过程

正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲buffer,然后由缓冲buffer最后刷到数据链路层的,那么就有可能把数据包2的一部分数据结合数据包1的全部被一起发送出去了,这样在服务器端就有可能出现这样的情况,导致读取的数据包包含了数据包2的一部分数据,这就产生粘包,当然也有可能把数据包1和数据包2全部读取出来。 分包情况:意思就是把数据包2或者数据包1都有可能被分开一部分发送出去,接着发另外的部分,在服务器端有可能一次读取操作只读到一个完整数据包的一部分。 在数据包发送的情况下,有可能后面的数据包分开成2个或者多个,但是最前面的部分包,黏住在前面的一个完整或者部分包的后面,也就是粘包和分包同时产生了。

20、有没有抓过TCP包,描述一下

21、一个IP配置多个域名,靠什么识别?

主机头

路由器的工作原理和作用,交换机的工作原理和作用

对路由协议的了解与介绍。内部网关协议IGP包括RIP,OSPF和外网网关协议EGP和BGP

路由协议使用的算法

服务器攻击(DDos攻击)

1、SYN Flood攻击

SYN Flood攻击是当前网络上最为常见的DDoS攻击,它利用了TCP协议实现上的一个缺陷。通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。

2、UDP Flood攻击

UDP Flood是日渐猖厥的流量型DDoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。由于UDP协议是一种无连接的服务,在UDP Flood攻击中,攻击者可发送大量伪造源IP地址的小UDP包。

3、ICMP Flood攻击

ICMP Flood攻击属于流量型的攻击方式,是利用大的流量给服务器带来较大的负载,影响服务器的正常服务。由于目前很多防火墙直接过滤ICMP报文。因此ICMP Flood出现的频度较低。

4、Connection Flood攻击

Connection Flood是典型的利用小流量冲击大带宽网络服务的攻击方式,这种攻击的原理是利用真实的IP地址向服务器发起大量的连接。并且建立连接之后很长时间不释放,占用服务器的资源,造成服务器上残余连接(WAIT状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发起的链接。

5、HTTP Get攻击

这种攻击主要是针对存在ASP、JSP、PHP、CGI等脚本程序,特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用。这种攻击的特点是可以绕过普通的防火墙防护,可通过Proxy代理实施攻击,缺点是攻击静态页面的网站效果不佳,会暴露攻击者的lP地址。

6、UDP DNS Query Flood攻击

UDP DNS Query Flood攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络世界上根本不存在的域名。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。

lunix555 commented 2 years ago

HTTP协议

简单介绍,协议细节和包含了什么

请求报文 请求行 请求方法 URL 版本协议 请求头部 请求数据

响应报文

状态行 版本协议 状态码 状态码描述 响应头部 connection 响应正文