99%网工都会遇到的10道经典面试问题,敢挑战下吗?

网络 通信技术
计算机网络基础很重要,但如何与实际的应用相结合,才是最重要的。下面是99%网工都会遇到的10道经典面试问题,敢挑战下吗?

1. 介绍TCP连接的三次握手?追问:为什么TCP需要握手三次?

三次握手:

  • 第一步:A向B发送一个SYN报文表示希望建立连接
  • 第二步:B收到A发过来的数据包后,通过SYN得知这是一个建立连接的请求,于是发送ACK确认,由于TCP的全双工模式,故B向A还应该发送一个SYN报文,表示希望和A建立连接
  • 第三步:A收到B发送来的SYN报文后,A向B发送ACK表示A收到了B的SYN。

[[351781]]

追问:

  • 保证双方都具有接受和发送报文的能力
  • 防止请求超时导致脏连接

因为报文生存时间可能会超过TCP请求超时时间,假如两次握手就可以建立连接,A的报文由于一些问题滞留在网络中,当报文超时但被释放连接后,此超时连接传输到B,B以为是A创建连接的新请求,然后确认连接。但是A知道这是超时连接的,所以直接丢弃了B的确认数据,导致只是B单方面建立了连接。并一直等待A发送数据,B的资源也就浪费了。

2. 介绍TCP断开的四次挥手?追问:为什么TCP的挥手需要四次

四次挥手:

  • 第一步:A向B发送FIN和ACK报文表示希望断开连接
  • 第二步:B收到A发送的请求后会发送ACK表示确认断开。
  • 第三步:此时B处于半连接状态,B会发送FIN和ACK请求断开与A之间的连接
  • 第四步:A收到B发送的断开请求会发送ACK表示确认断开

追问:

  • 确保数据能够全部传输完成
  • 四次才能保证所有的连接全部断

3. 为什么连接的时候是三次,挥手的时候是四次?

一问:

(1) 假设连接的时候是两次,那么A滞留在网络中的报文经过一段时间传输到B,B会确认此连接。B单方面建立了连接,A会丢弃B的确认数据报文。B会一直等待A发送数据,造成B资源的浪费。

官方解释:

两次:不能,为了防止已经失效的

(2) 我们知道三次,双方已经建立了连接,四次完全没有必要

二问:

确保数据能够全部传输完成

A发送FIN后,B有可能正在向A传输数据,所以不会马上关闭,当数据全部传输完成后再发送ACK表示确认断开。

4. TCP的syn攻击的过程?追问:怎么防御?

攻击原理:

B收到SYN报文后,会将相应的半连接记录添加到队列中,之后等待接收握手包,如果握手成功就会将此半连接记录从队列中删除;或者当B未收到A的确认包,会重新发送请求包,直到超时才会将此条记录从半连接队列删除。

服务器的TCP协议栈中存储的半连接记录是有限的,当服务器接收到SYN型的DOS攻击后,队列会很快充满,客户端在短时间内伪造大量的不存在的IP地址,向服务器不断发送SYN报文,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢严重者引起网络堵塞甚至系统瘫痪,服务器随后就不再接受新的网络连接,从而造成正常的客户端无法访问服务器的情况发生。

防御:

  • 增大队列SYN最大半连接数,linux中最大连接数为256
  • 减少半连接时的超时时间
  • 过滤可疑地址
  • 利用SYN cookie防御DOS攻击

SYN Cookie是用一个Cookie来响应TCPSYN请求的,在正常的TCP连接过程中,当服务器接收一个SYN数据包,就会返回一个SYN-ACK包来应答,半开放连接状态来等待最后返回的ACK包。服务器用一个数据空间来描述所有未解决的连接,然而这个数据空间的大小是有限的,所以攻击者将塞满这个空间,在SYN Cookie的执行过程中,当服务器收到一个SYN包的时候,他返回一个SYN -ACK包,这个数据包的ACK序列号是经过加密的,它由TCP连接的源地址和端口号、目标地址和端口号以及一个加密种子经过HASH计算得出的,然后服务器释放所有的状态。如果一个ACK包从客户端返回后,服务器重新计算Cookie来判断它是不是上个SYN-ACK的返回包。如果是的话,服务器就可以直接进入TCP连接状态并打开连接。这样服务器就可以避免守候半开放连接了

5. 什么是滑动窗口?追问:为什么会出现滑动窗口?

滑动窗口:

用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小。窗口指一次批量发送多少数据。

为何会出现滑动窗口:

在确认应答的策略中,每发送一次数据段都需要一个ACK确认应答,收到ACK后再发送下一个数据段,这样每次都需要确认,性能较差。采用滑动窗口的机制就会一次发送多条数据,提高传输性能

6. TCP是如何通过滑动窗口协议实现流量控制和拥塞控制的?

通过设置滑动窗口的大小,用ACK告知发送端自己缓存区的大小,从而使发送端以合适的速度发送,实现流量控制;

发送端根据网络拥塞情况确定的窗口值。发送端在真正确定发送窗口时,应该取“通知窗口”和“拥塞窗口”的最小值。

7. 描述TCP和UDP的区别?

UDP:

  • 无连接的,即发送数据之前不需要建立连接
  • 不保证可靠的交付,同时不使用拥塞控制
  • U支持一对一、一对多、多对一、多对多的交互通信
  • 首部只有8字节

TCP:

  • 面向连接的传输层协议
  • 提供可靠的交付能力
  • 仅支持一对一通信
  • 支持全双工通信(允许数据在两个方向上同时传输)
  • 首部最低有20字节

问题:如何用UDP实现可好传输?

引入序列号保证数据的顺序、确认机制保证数据能到达对端、重传机制保证超时引起的数据丢弃。

8. TCP有哪些定时器?

  • 重传定时器
  • 坚持定时器
  • 保活定时器
  • 时间等待定时器

9. 什么是CDN,CDN是如何工作的?

一问:CDN是内容分发网络

二问:CDN是在用户和服务器之间增加高速缓存层,通过接管DNS实现,将用户的请求引导到高速缓存服务器上获取源服务器的数据

10. 什么是DNS?说说DNS解析过程?

一问:DNS为域名系统,是因特网上作为域名和IP地址相互映射的分布式数据库

二问:

  • 浏览器检查缓存中有没有这个域名对应的解析过的ip地址,如果有该解析过程将会结束。
  • 检查本地的hosts文件是否有这个网址映射关系
  • 如果hosts种没有这个域名映射,查找本地DNS解析器缓存,如果有直接返回
  • 通过首选DNS服务器(本地域名服务器),以递归或循环的方式查询域名对应的IP地址并返回。(顶级域,二级域,三级域)

 

责任编辑:赵宁宁 来源: 思科CCIE俱乐部
相关推荐

2018-12-10 11:30:06

Openstack面试命令

2020-03-23 09:56:50

软件测试面试技术

2014-01-09 09:24:32

Linux渗透测试渗透测试

2014-02-27 15:42:08

Linux面试

2019-11-26 10:30:11

CSS前端面试题

2013-05-22 10:04:18

Hibernate面试问题

2023-09-14 09:00:00

ChatGPTGPT 3.5GPT 4.0

2013-07-19 10:27:00

2023-09-13 08:37:56

程序员面试catch

2016-10-18 16:30:09

面试float储格式

2015-04-22 12:19:42

JAVAJAVA面试题答案解析

2014-07-25 17:21:43

Linux Shell面试

2020-06-16 09:02:36

Linux Shell脚本

2014-05-28 09:26:57

Linux Shellshell脚本

2018-05-04 06:29:27

2009-09-08 17:45:06

CCNA考题

2014-04-08 14:52:41

Linux面试面试问题

2009-03-03 09:33:13

面试ORACLE

2020-11-11 09:19:37

前端优化面试

2013-09-30 09:08:30

面试创业
点赞
收藏

51CTO技术栈公众号