大厂系列:计算机网络八股文,速速收藏(一)

1.计算机网络的各层协议及作用?

计算机网络体系可以大致分为一下三种,OSI七层模型、TCP/IP四层模型和五层模型。

- OSI七层模型:大而全,但是比较复杂、而且是先有了理论模型,没有实际应用。

- TCP/IP四层模型:是由实际应用发展总结出来的,从实质上讲,TCP/IP只有最上面三层,最下面一层没有什么具体内容,TCP/IP参考模型没有真正描述这一层的实现。

- 五层模型:五层模型只出现在计算机网络教学过程中,这是对七层模型和四层模型的一个折中,既简洁又能将概念阐述清楚。

七层网络体系结构各层的主要功能:

- 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等。

- 表示层:主要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。

- 会话层:负责在网络中的两节点之间建立、维持和终止通信,如服务器验证用户登录便是由会话层完成的。

- 运输层:有时也译为传输层,向主机进程提供通用的数据传输服务。该层主要有以下两种协议:

- TCP:提供面向连接的、可靠的数据传输服务;

- UDP:提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性。

- 网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。

- 数据链路层:数据链路层通常简称为链路层。将网络层传下来的IP数据包组装成帧,并再相邻节点的链路上传送帧。

- 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和通信手段的差异。

2. TCP和UDP的区别?

对比如下:

总结:

TCP 用于在传输层有必要实现可靠传输的情况,UDP 用于对高速传输和实时性有较高要求的通信。TCP 和 UDP 应该根据应用目的按需使用。

3. UDP 和 TCP 对应的应用场景是什么?

TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:

- FTP文件传输

- HTTP / HTTPS

UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:

- 包总量较少的通信,如 DNS 、SNMP等

- 视频、音频等多媒体通信

- 广播通信

4. 详细介绍一下 TCP 的三次握手机制?

在讲TCP三次握手和四次挥手之前,先说一下TCP标志位,方便后续的理解。

简单来说,TCP标志位的值代表了当前请求的目的。

标志位一共有6种,分别是:

1. SYN(synchronous): 发送/同步标志,用来建立连接,和下面的第二个标志位ACK搭配使用。连接开始时,SYN=1,ACK=0,代表连接开始但是未获得响应。当连接被响应的时候,标志位会发生变化,其中ACK会置为1,代表确认收到连接请求,此时的标志位变成了 SYN=1,ACK=1。

2. ACK(acknowledgement):确认标志,表示确认收到请求。

3. PSH(push) :表示推送操作,就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理;

4. FIN(finish):结束标志,用于结束一个TCP会话;

5. RST(reset):重置复位标志,用于复位对应的TCP连接。

6. URG(urgent):紧急标志,用于保证TCP连接不被中断,并且督促中间层设备尽快处理。

此外,还有两个序号:

1. Sequence number :顺序号,发送数据包中的第一个字节的序列号,一般为小写的seq。

2. Acknowledge number:确认号,响应前面的seq,值为seq+1,可以理解为期望下次发出的序列号为seq+1;

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的顺序号和确认号并交换 TCP信息

- 第一次握手:客户端Client发送位码为SYN=1,随机产生seq=x的数据包到服务器,服务器Server由SYN=1知道,客户端Client要求建立联机;

- 第二次握手:服务器Server收到请求后要确认联机信息,向客户端Client发送ack=(客户端Client请求连接时的seq)+1,SYN=1,ACK=1,产生seq=y的包,代表接收到连接请求并且向客户端再次确认;

- 第三次握手:客户端Client收到后检查ack是否正确,即第一次发送的seq+1,以及位码ACK是否为1,代表收到了服务器端发过来的确认信息。之后客户端Client会再向服务器发送ack=(服务器Server的seq+1),ACK=1,服务器Server收到后确认ack 值与ACK=1,连接建立成功。

5. 为什么需要三次握手,而不是两次?

主要有三个原因:

1. 防止已过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费。

在双方两次握手即可建立连接的情况下,假设客户端发送 A 报文段请求建立连接,由于网络原因造成 A 暂时无法到达服务器,服务器接收不到请求报文段就不会返回确认报文段。

客户端在长时间得不到应答的情况下重新发送请求报文段 B,这次 B 顺利到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,客户端在收到 确认报文后也进入 ESTABLISHED 状态,双方建立连接并传输数据,之后正常断开连接。

此时姗姗来迟的 A 报文段才到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,但是已经进入 CLOSED 状态的客户端无法再接受确认报文段,更无法进入 ESTABLISHED 状态,这将导致服务器长时间单方面等待,造成资源浪费。

2. 三次握手才能让双方均确认自己和对方的发送和接收能力都正常。

第一次握手:客户端只是发送处请求报文段,什么都无法确认,而服务器可以确认自己的接收能力和对方的发送能力正常;

第二次握手:客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常;

第三次握手:服务器可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常;

可见三次握手才能让双方都确认自己和对方的发送和接收能力全部正常,这样就可以愉快地进行通信了。

3. 告知对方自己的初始序号值,并确认收到对方的初始序号值。

TCP 实现了可靠的数据传输,原因之一就是 TCP 报文段中维护了序号字段和确认序号字段,通过这两个字段双方都可以知道在自己发出的数据中,哪些是已经被对方确认接收的。这两个字段的值会在初始序号值得基础递增,如果是两次握手,只有发起方的初始序号可以得到确认,而另一方的初始序号则得不到确认。

6. 为什么要三次握手,而不是四次?

因为三次握手已经可以确认双方的发送接收能力正常,双方都知道彼此已经准备好,而且也可以完成对双方初始序号值得确认,也就无需再第四次握手了。

- 第一次握手:服务端确认“自己收、客户端发”报文功能正常。

- 第二次握手:客户端确认“自己发、自己收、服务端收、客户端发”报文功能正常,客户端认为连接已建立。

- 第三次握手:服务端确认“自己发、客户端收”报文功能正常,此时双方均建立连接,可以正常通信。

7. 什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种,它利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。

原理:

- 在三次握手过程中,服务器发送 [SYN/ACK] 包(第二个包)之后、收到客户端的 [ACK] 包(第三个包)之前的 TCP 连接称为半连接(half-open connect),此时服务器处于 SYN_RECV(等待客户端响应)状态。如果接收到客户端的 [ACK],则 TCP 连接成功,如果未接受到,则会不断重发请求直至成功。

- SYN 攻击的攻击者在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 [SYN] 包,服务器回复 [SYN/ACK] 包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时。

- 这些伪造的 [SYN] 包将长时间占用未连接队列,影响了正常的 SYN,导致目标系统运行缓慢、网络堵塞甚至系统瘫痪。

检测:当在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。

防范:

- 通过防火墙、路由器等过滤网关防护。

- 通过加固 TCP/IP 协议栈防范,如增加最大半连接数,缩短超时时间。

- SYN cookies技术。SYN Cookies 是对 TCP 服务器端的三次握手做一些修改,专门用来防范 SYN 洪泛攻击的一种手段。

8. 三次握手连接阶段,最后一次ACK包丢失,会发生什么?

服务端:

- 第三次的ACK在网络中丢失,那么服务端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便客户端重新发送ACK包。

- 如果重发指定次数之后,仍然未收到 客户端的ACK应答,那么一段时间后,服务端自动关闭这个连接。

客户端:

客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端将以RST包(Reset,标示复位,用于异常的关闭连接)响应。此时,客户端知道第三次握手失败。

9. 详细介绍一下 TCP 的四次挥手过程?

- 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认。

- 序列号 seq = u,即客户端上次发送的报文的最后一个字节的序号 + 1

- 确认号 ack = k, 即服务端上次发送的报文的最后一个字节的序号 + 1

- 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u + 1。

- 这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。

- 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 A 的确认。

- 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号 + 1。

- 确认号 ack = u + 1,与第二次挥手相同,因为这段时间客户端没有发送数据

- 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = u + 1,确认号为 ack = w + 1。

- 此时,客户端就进入了 TIME-WAIT 状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。

10. 为什么连接的时候是三次握手,关闭的时候却是四次握手?

服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回 ACK 报文段.

接下来可能会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,请求关闭连接。服务器的ACK和FIN一般都会分开发送,从而导致多了一次,因此一共需要四次挥手。

全部评论

相关推荐

12-24 20:52
武汉大学 Java
点赞 评论 收藏
分享
11/20 火山引擎一面如何选择学习前端的学习前端过程中的感受学习过程中一些自己解决得比较有难度,比较有成就感的事页签为什么不用第三方库,和你自己做的区别是什么不同页签之间的 url 相同吗如何区分不同页签的(动态路由参数)说一下你对 websocket 的了解Websocket 如何拿到历史消息说一下文件在服务端被 ai 解析的大致流程,涉及到了哪些技术平时有用一些 ai 工具吗介绍一下双 token 无感刷新的原理请求出错时如何处理为什么不用单 token,直接延长 token 有效期不行吗为什么不全部存在 cookie 里Http 状态码有哪些500 系列一般代表什么如何处理跨域Cors 能设置哪些字段,能设置什么维度的跨域,除了域名还能设置什么什么是组合式 api,有什么好处虚拟 dom 是什么为什么一些框架的最新版在尝试去掉虚拟 dom实现一个 event 类Js 编码二叉树的实现与遍历Js 闭包应用手写11/27 火山引擎二面自我介绍接触前端时间,怎么学习的介绍一下项目,包含业务场景介绍一下技术难点介绍一下基于 websocket 的库的选择你提到了自己封装了 websocket 类,和这些库的区别是什么描述一下这个类主要的功能和 apiStomp 和 websocket 的区别是什么从网络协议七层模型上看的话,stmop 位于哪一层Tcp 和 udp 的区别Stomp 支持二进制数据传输吗还了解别的类似 stmop 的协议吗知识库用到了 rag 吗介绍第二个项目有用到微前端吗你提到了多页签功能,页签之间的隔离怎么做的权限控制的力度是怎么样的,做到了什么层级登陆怎么做的,基于 sso 还是 oauth介绍一下你了解的 oauth 的底层原理登陆态是如何保存的Jwt 的优势是什么Keep-alive 的底层原理是什么讲讲泛型判断一个变量的类型有多少种方法Promise 有多少种状态Promise all 和 race 的区别Race 的第一个失败了怎么办,会执行第二个吗,返回结果是什么前端的网络安全了解 csp 吗说一下对前端工程化的理解前端有哪些性能优化的手段了解 webpack 的 model federation 吗最小子数组和(不要求时间复杂度)实现一个 event 类12/02 字节火山三面自我介绍介绍部门业务,商业化逻辑自己的规划是什么样的介绍学生干部经历,比赛经历如何激励同学们参加学生活动的比赛中团队做了什么,自己做了什么事你觉得你们的比赛课题有实践前途吗复盘的话后续有哪些可以优化的点讨论比赛项目前端当中,做的那些事对个人成长帮助比较大说一下产品形态和技术方案这个项目是你从 0 到 1 去做的吗你刚开始的时候是如何设计代码框架的为了保证项目的扩展性,做了哪些抽象详细介绍业务拆分逻辑,一直往下拆分的话会到什么程度一个比较完整的技术方案需要包含哪些内容如何确保工程稳定性,怎么选择一个好的技术栈做业务的时候涉及到了哪些,技术栈当中有没有需要提前确定的部分什么时候开始学习的前端有什么快速学习的方法吗工作过程中,你喜欢和不喜欢和拥有什么特质的人合作针对不喜欢的人如何共处你会去做 final call 吗,强行做决定可能有哪些问题反问秋招最后的面试了,拖了好久的面经一直懒得写,但看起来有不少同学应该用得上,还是写出来了,字节的三面确实会更注重考察候选者的个人潜质和 leadership,和之前的其他的技术三面感觉很不一样
点赞 评论 收藏
分享
12-27 20:11
已编辑
门头沟学院 Java
1. 介绍实习项目,介绍技术栈,介绍自己实习工作内容2. 说一下ArrayList 和 HashMap 的扩容机制3. 线程池有哪些参数?4. 实习上怎么用的CountDownLatch? 为什么要分批? 分批性能/效率提高了多少?5. 说一下MySQL Explain里常用哪些字段6. 说说慢查询优化过程7. 项目上使用Redis怎么配置过期时间? 缓存失效的问题有没有考虑?8. 说说redis数据结构使用场景9. springboot用了哪些注解10. RabbitMQ 怎么保证可靠性?怎么防止消息丢失?11. 说说令牌实现幂等性为什么要使用到lua?12. Gitlet是怎么处理分支冲突的?13. Gitlet文件怎么存储?14. 处理分支,两个分支如果有相同的文件,两个文件只有一行内容不同,也是拷贝成一个新文件吗?15. 了解哪些Linux命令16. 说说JVM的内存结构?17. 说说JVM的垃圾回收机制?18. volatile关键字的作用和原理是什么?19. 介绍一下锁20. 介绍一下AQS21. 开发使用声明式事务还是编程式事务? 怎么使用的?22. 事务失效情况?23. 项目中使用的jvm的回收器是什么?24. 双亲委派模型的流程?25. 四种类加载器分别加载哪些内容?26. 介绍一下内存泄露以及原因27. mysql索引的底层原理28. 事务的隔离级别29. 事务的传播机制30. 说说spring ioc31. spring cloud用过哪些组件?nacos怎么配置?
点赞 评论 收藏
分享
评论
5
28
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务