计算机网络面试总结

计算机网络自用面试总结,题目来源各个论坛与面经,答案来源我自己的总结和相关书籍。

1.TCP三次握手

  • 第一次握手:客户端发送 SYN = 1,seq = X 给服务端,表示希望与服务端建立连接
  • 第二次握手:服务端发送 SYN = 1 , ACK = 1 , ack = X + 1 , seq = Y 给客户端,表示已收到请求,希望与客户端建立连接
  • 第三次握手:客户端发送 ACK = 1 ,ack = Y + 1 , seq = X +1
    给服务端,表示已收到确认,客户端进入连接状态
  • 至此三次握手结束,服务端进入连接状态

2.第三次握手失败会怎么样?

第三次握手失败,服务端未收到第三次握手信号后,会进入一个30s~2mints 的超时等待阶段,在等待时间结束后,服务端会关闭连接,并向客户端发送 RTS = 1 重置连接(此处可扩展提及SYN洪泛攻击)

3.SYN洪泛攻击?

第三次握手失败后服务端会进行超时等待,因意外让服务端的一个线程等待并不会有很大影响,但当服务端需要处理大量的握手失败情况时,会浪费很多CPU资源和时间,SYN洪泛攻击就是利用这一点,通过发送大量不进行三次握手SYN请求连接报文,攻击服务端,这就是SYN洪泛攻击

4.TCP为什么不只进行两次握手

在复杂的网络空间中,可能会出现客户端第一次握手报文延迟到达的情况,如果只有两次握手,服务端在收到这个连接信号向客户端发送第二次握手报文后直接建立连接,但这时客户端可能已经不再需要建立连接或者已经完成报文交互,那他就不会建立连接发送报文,服务端就会白白等待一段时间浪费资源。

5.TCP四次挥手

  • 第一次挥手:客户端发送 FIN = 1 ,seq = X 给服务端,表示数据已经发送完毕,可以断开连接
  • 第二次挥手:服务端发送 ACK = 1 , ack = X + 1 ,seq = Y
    给客户端,表示收到了第一次握手报文,如果这时服务端不需要再向客户端发送数据,会立即发送第三次挥手报文,如果还有报文未发送完,会在发送完后进行第三次挥手
  • 第三次挥手:服务端发送 FIN = 1 , seq = Z, ack = X + 1,表示服务端数据已经发送完成,可以断开连接
  • 第四次挥手:客户端发送 ACK = 1 , seq = X + 1 ack = Z + 1,表示服务端可以断开连接了,并在等待2 MSL 后断开客户端的连接

6.TCP为什么不是三次挥手?

如果第三次挥手失败,客户端未收到第三次挥手报文,而此时服务端已经断开连接,客户端将会继续等待不会再有的第三次挥手报文,这会浪费客户端的资源,第四次挥手确保客户端已经断开连接

7.为什么要等到2MSL的时间

  • MSL是TCP报文的最长存活时间,2MSL 为第四次挥手报文的存活时间加上服务端重发的第三次挥手报文的存活时间,等待2MSL后可以确保服务端已经收到第四次挥手报文断开连接,如果不等待2MSL的时间,可能出现客户端已经断开连接,而服务端未收到第四次挥手信号还在持续等待,并重发第三次挥手报文,这会浪费服务端的资源
  • 同时,等待2MSL的时间也可以保证本次TCP连接中发送的报文段完全失效,防止其影响到之后的连接

7.TCP沾包

  • 在TCP的窗口大小太小或者是存在最大报文段长度限制时,如果应用层想要发送一个太大的数据包,这个数据包会被拆成几段TCP报文发送出去,这就是TCP的拆包
  • 发送端等到缓冲区满了之后再发送信号,或者是接收端读取数据延迟都可能会出现几个数据包被一起读取的情况,接收端无法间区分它们间的关系,这就是TCP的沾包
  • 拆包沾包解决方法:在每个数据包中定义一个包头部分,用于标注数据包的长度,可以将该包头部分单独先发送,也可以跟其他数据一起发送,接收端通过该包头读取长度信息,就可以将沾包分割了。

8.TCP的滑动窗口

  • TCP通过滑动窗口协议,来实现发送端缓冲,TCP是面向流的数据传输,在滑动窗口协议中,以一个字节为发送单位分组,窗口通常包含多个分组,滑动窗口的大小由三次握手时,接收端报文中指定的接收端窗口大小来确定
  • 接收端采用累积确认的方式,在收到一段有序分组后,对按序到达的最后一个分组向发送端发送确认报文,表示到这个分组为止的所有分组都已经收到,确认报文可以跟随需要发送的其他报文一起发出,也可以根据快重传方式,在接收到三次重复分组后立即向发送端发出确认报文
  • 发送端根据确认报文中已收到的分组数,将窗口后移,滑动窗口方法让发送端可以连续发送分组,不需要一个一个的等待接收端的确认报文,提高了发送效率,也实现了TCP的流量控制,根据接收端的接受能力发送报文
  • 在根据接收端报文调整滑动窗口大小时,如果需要缩小窗口的大小,TCP协议并不赞成直接将滑动窗口后半部分缩小,因为缩小部分的分组可能已经发送,这会造成一些错误,最好在收到确认报文后,以缩小代替滑动来调整窗口大小,如果需要扩大窗口的大小,则直接扩大即可
  • 在窗口大小为0的时候,发送端会类似超时重传机制每隔一段时间向接收端发送零窗口试探报文,寻找继续发送的时机
  • nagle算法:因为TCP的首部较大,无扩展时有20字节的大小,当滑动窗口较小时,每次发送的报文字节数,首部消耗过大,这时通过nagle算法,在接收到接收端的确认报文或缓冲区中数据大小大于最大报文段长度时才发送数据

9.TCP拥塞控制

  • 慢开始:在最初建立TCP连接时,不确定目前的网络拥塞情况,采用慢开始方式,发送数据时,先将拥塞窗口的大小设置为1~2 最大报文长度,在之后每次收到确认报文,都将拥塞窗口增加一个最大报文长度
  • 拥塞避免:因为慢开始虽然开始时发送数据较少,但网络状况良好的话增长速度很快,如果不加以限制,容易造成网络拥塞,拥塞避免方法会在慢开始的基础上,增加一个增长阈值,在每轮次发送数据大小大于等于该阈值时,不会在每次收到确认报文时增加拥塞窗口的大小,而是每轮次增加一个最大报文长度的大小,让窗口大小线性增长
  • 如果出现长时间未收到确认报文的情况,TCP会认为出现网络拥塞,TCP连接会将拥塞避免的增长阈值设置为当前拥塞窗口大小的一半,并重新开始一次慢开始阶段,将拥塞窗口大小恢复到1~2最大报文长度
  • 快重传:有时有序报文段中的部分报文丢失,会导致发送端长时间收不到确认报文,而判定出现网络拥塞进行慢开始或者快恢复,这会影响传输效率,快重传要求接收端不要在发送数据时才捎带确认报文,而是立即发送确认报文,在接收到无序分组段的重复分组时,也要立即发送重复确认报文,在收到三次接收端传来的重复分组确认报文时,发送端立即进行重传,并执行快恢复
  • 快恢复:在接收到三次重复确认报文后,TCP连接会将拥塞避免的增长阈值设置为当前拥塞窗口大小的一半,但不会从重新一次慢开始,而是将拥塞窗口大小设置为增长阈值的大小,让拥塞窗口大小线性增长

10.UDP与TCP的区别

  • UDP面向无连接,发送数据前不需要建立连接,当然也不需要断开连接,TCP面向连接,发送数据前经历三次握手建立连接,发送数据结束后经历四次挥手断开连接
  • UDP传输数据不可靠,超时不重传,丢包不重发,TCP传输数据可靠,保证无差错,不丢失,不重复,按序到达
  • UDP无拥塞控制,在网络拥塞时不会降低源主机的发送速率,TCP有拥塞控制,虽然会降低源主机的发送速率,但可以减小网络拥塞的发生率
  • UDP面向报文,将应用层想要发送的数据包加上UDP首部直接交给IP层,TCP面向流,将应用层的数据包视为无数据结构字节流传输
  • UDP支持1对1,多对1,1对多,多对多通信,TCP只支持1对1通信
  • UDP首部花销小为8字节,TCP首部花销大无扩展时为20字节

11.UDP和TCP的应用场景

  • UDP用于速率大于可靠性的场景,例如在直播和视频等,丢包不会有很大影响,但对实时性要求很高,UDP还常用于DNS域名解析协议、TFTP简单文件传输协议、SNMP简单网络管理协议
  • TCP用于可靠性要求较高的场景,例如在文件下载和远程登录等,TCP还常用于HTTP超文本传输协议、TFP文件传输协议、SMTP邮件传输协议、Telnet远程登录协议

12.OSI五层协议体系

  • 应用层:包括HTTP、SMTP、DNS、FTP等协议,通过应用进程间的交互完成特定网络应用
  • 传输层:包括TCP协议与UDP协议,为两台主机中进程间的通信提供通用的数据传输服务
  • 网络层:IP协议,为分组交换网上的不同主机提供通信服务
  • 数据链路层:在物理介质上提供可靠的传输,可以提供流量控制,检错纠错等功能
  • 物理传输层:物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。

13.在浏览器输入一个url后会发生什么?

因为分组交换网上的主机的唯一标识是IP地址不是域名,所以首先要根据域名用DNS协议查询IP地址,从浏览器缓存,到本地host文件缓存,到本地DNS服务器,如果还没有查到,则根据url,逐层向其他DNS服务器查询域名对应的IP地址,在得到IP地址后,经过三次握手过程与服务端建立TCP连接,如果使用的是HTTP协议则可以直接发送请求,如果使用的是HTTPS协议,还需要取得服务端的证书,确保证书的有效性后,根据证书中的公开密钥,对共享密钥进行加密,并发送给服务端,服务端根据私有秘钥解密后得到共享密钥,之后客户端与服务端就可以使用共享密要进行安全的通信了,根据客户端发送的HTTP请求,服务端进行响应,并在客户端这边网页显示

14.HTTPS是什么?

  • HTTPS其实就是HTTP加SSL协议加密,我们知道HTTP本身是没有经过加密的,任何人直接抓到了数据包,就可以很轻松的获取通信的内容,在远程登录或者网上银行这类安全性非常重要的场景,我们就需要HTTPS来进行应用层通信
  • SSL协议是一套基于证书与混合密钥的加密协议,客户端可以通过由值得信任的证书机构颁发给服务端的证书,来确保服务端的公开密钥是可信的,混合密钥在13题中有详细介绍,懒得写了

15.get与post的区别

  • get的内容直接包含在URL中,post的内容在请求体内,所以post方法比get方法更加安全,在一些诸如登录的场景中会使用到post方法,但基于HTTP本身的性质,这个安全性是相对的,在被抓取到数据包后还是可以轻松的获得请求体内容
  • get获取的内容会被浏览器主动缓存,而post不会,因此回退时,get可以直接读取缓存回到之前的浏览器界面,post需要重新发送请求,post的浏览器缓存可手动设置
  • 因为get请求在URL中,所以他有长度限制,这个限制通常是由浏览器规定的,URL本身无长度限制,而post方法没有长度限制
  • get方法的URL可以存为书签,post不可以
  • get方法的请求参数会被浏览器保存,post不会
  • get方法只能使用URL编码,而post可以使用多种编码方式
  • get方法只能使用阿斯克码,post方法可以使用多种数据类型
  • get方法应用来获取数据的请求,post方法用于可能修改服务器数据的请求
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值