纯干货总结面试中常见的问题,按网络分层结构进行分类,适合面试前快速浏览,从各大大佬的文章中摘抄出来结合自己的理解,持续更新~ 🔗
1. 概括性问题
1.1 网络分层结构
最常见的是这三种分层结构,一般后两种考察更多,区别尽在5层模型将最底层又分为了数据链路层和物理层。
TCP/IP五层模型:应用层、传输层、网络层、数据链路层、物理层。
- 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。
- 传输层:负责向两台主机进程之间的通信提供数据传输服务。传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
- 网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。
- 数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
- 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。 参考:
- 计网5层体系结构简介
1.2 浏览器输入URL返回页面的过程
加载过程:
- 浏览器根据 DNS 服务器得到域名的 IP 地址
- 向这个 IP 的机器发送 HTTP 请求
- 服务器收到、处理并返回 HTTP 请求
- 浏览器得到返回内容
渲染过程:
- 根据 HTML 结构生成 DOM 树
- 根据 CSS 生成 CSSOM
- 将 DOM 和 CSSOM 整合形成 RenderTree
- 根据 RenderTree 开始渲染和展示
- 遇到
<script>时,会执行并阻塞渲染
2. 应用层HTTP/HTTPS
- 域名系统(DNS)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(百度百科)
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)
- HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全层,对数据包进行加密,然后将加密后的数据包传送给 TCP,相应的 TCP 必须将数据包解密,才能传给上面的 HTTP。
2.1 HTTP协议的特点
- HTTP允许传输任意类型的数据文本,图片,视频等。传输的类型由Content-Type加以标记。
- 无状态。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。
- 支持客户端/服务器模式。
- 可靠传输。基于TCP/IP提供可靠的传输服务。
2.2 HTTP缺点
- 无状态,双刃剑,在长连接的场景下就会大量传输重复信息。
- 明文传输,协议中的头部报文使用文本形式而不是二进制数据,会泄漏敏感信息。
- 队头阻塞,在长连接情况下,某个请求时间过长,阻塞后面所有的任务。
2.3 HTTP报文格式
HTTP请求由请求行、请求头部、空行和请求体四个部分组成。
- 请求行:包括请求方法,访问的资源URL,使用的HTTP版本。GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
- 请求头:格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有cookie、host、connection、accept-language、accept-encoding、user-agent。
- 请求体:用户的请求数据如用户名,密码等。
HTTP响应也由四个部分组成,分别是: 状态行、响应头、空行和响应体。
- 状态行:协议版本,状态码及状态描述。
- 响应头:响应头字段主要有connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires。
- 响应体:服务器返回给客户端的内容。
2.4 HTTPS与HTTP的区别
- HTTP是超文本传输协议,信息是明文传输;HTTPS则是具有安全性的ssl加密传输协议。
- HTTP和HTTPS用的端口不一样,HTTP端口是80,HTTPS是443。
- HTTPS协议需要到CA机构申请证书,一般需要一定的费用。
- HTTP运行在TCP协议之上;HTTPS运行在SSL协议之上,SSL运行在TCP协议之上。
2.5 HTTP状态码
RFC 规定 HTTP 的状态码为三位数,被分为五类:
- 1xx: 表示目前是协议处理的中间状态,还需要后续操作。
- 2xx: 表示成功状态。200 OK,204无内容,206部分内容
- 3xx: 重定向状态,资源位置发生变动,需要重新请求。301永久重定向,302临时,304资源未修改,使用缓存
- 4xx: 请求报文有误。400语法错误,401未认证,403不允许访问,404未找到,
- 5xx: 服务器端发生错误。500服务器出错,501不支持,503服务器繁忙
2.6 Post和Get的区别
- Get请求能缓存,Post不能
- Post比Get更安全,因为Get请求包含在URL里,会被浏览器保存在历史记录,而Post不会。
- Post可以通过响应体来传输更多的数据,而Get请求传输的数据受URL的长度限制
3. 传输层TCP/UDP
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。 TCP/UDP是运输层主要使用的协议。
- 传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。
- 用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
3.1 三次握手和四次挥手
参考链接:面试官问我TCP三次握手和四次挥手,我真的是
理解TCP序列号和确认号
序列号:在TCP头部包含32位序列号用来跟踪发送的数据量,在建立连接时随机生成。 保证TCP传输的报文都是有序的,通过序列号拼接。
确认号:接收端通过确认号来通知发送端数据成功接收,值代表的含义是期待下一个报文的序列号,也表示上一个序列号及前面所有的内容都收到了。
- SYN=1,希望创建连接
- ACK=1,确认号字段有效
- FIN=1,希望断开连接
- RST=1,TCP连接出现异常,需要断开
三次握手 建立连接
所谓的三次握手,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包,来实现连接服务器指定端口,建立TCP连接,并同步双方的序列号,确认号和TCP窗口大小信息。
第一次握手:客户端发送报文将SYN=1,期待连接,生成随机序列号x发送。SYN=1,Seq=x,进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到请求,初始化自己的序列号y,确认号为x+1(表示收到x及以前所有序列号的报文,期望下次收到x+1的包)ACK=1,SYN=1,Seq=y,ack=x+1,进入SYN_RECV状态。
第三次握手:接收到服务器返回到SYN+ACK包,向服务器发送确认包。ACK=1,ack=y+1立即进入连接建立状态,服务器收到这个包后也会进入连接建立状态。
四次挥手 关闭连接
假设A是主动关闭方,B是被动关闭方。
第一次挥手:A的应用进程先向其TCP发出连接释放报文段FIN=1,seq=u,并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT_1(终止等待1)状态,等待B的确认。
第二次挥手:B收到连接释放报文段后即发出确认报文段ACK=1,ack=u+1,seq=v,B进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。A收到B的确认后,进入FIN_WAIT_2(终止等待2)状态,等待B发出的连接释放报文段。
第三次挥手:B发送完数据,就会发出连接释放报文段FIN=1,ACK=1,seq=w,ack=u+1,B进入LAST_ACK(最后确认)状态,等待A的确认。
第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段ACK=1,seq=u+1,ack=w+1,A进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接。
为什么不是两次连接?
如果首先客户端发送了 SYN 报文,但是滞留在网络中,TCP 以为丢包了,然后重传,两次握手建立了连接。等到客户端关闭连接了。但是之后这个包如果到达了服务端,那么服务端接收到了,然后发送相应的数据表,就建立了连接,但是此时客户端已经关闭连接了,所以带来了资源的浪费。
为什么要等待两个MSL?
保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。
防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。
为什么要四次挥手?
如果是三次的话,那么服务端的 ACK 和 FIN 合成一个挥手,那么长时间的延迟可能让 TCP 一位 FIN 没有达到服务器端,然后让客户的不断的重发 FIN
3.2 TCP有哪些特点?
- TCP是面向连接的运输层协议。
- 每一条TCP连接只能有两个端点,一对一。
- TCP提供可靠交付的服务。
- TCP提供全双工通信。
- 面向字节流。
3.3 TCP与UDP的区别
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务;UDP不保证可靠交付。
- TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。
- TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
- 每一条TCP连接只能是一对一的;UDP支持一对一、一对多、多对一和多对多的通信方式。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
3.4 TCP如何实现可靠性
1.信道可靠:利用三次握手四次挥手保证连接正确
2.数据正确:分区编号,校验和,超时重传
3.传输控制:浏览控制、拥塞控制
简单来说:
- TCP会精准记录那些数据发送了,那些数据被对方接收了,那些没有被接收,而且保证数据包按序到达,不允许半点差错,这就是有状态
- 当意识到丢包了或者网络环境不佳,TCP 会根据具体情况调整自己的行为,控制自己的发送速度或者重发,这是可控制的
4. 网络层-IP协议
网络层实现数据包的路由和转发。通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的。网络层的任务就是选择这些中间节点,以确定两台主机之间的通信。
网络层最核心的协议是IP协议(Interet Protocol,因特网协议)。IP协议根据数据包的 目的IP地址来决定如何投递它。如果数据包不能直接发送给目标主机,那么加协议就为它 寻找一个合适的下一跳(next hop)路由器,并将数据包交付给该路由器来转发。多次重复 这一过程,数据包最终到达目标主机,或者由于发送失败而被丢弃。
IP协议是 TCP/IP 协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。不靠谱是指IP协议不能保证IP数据报准确地到达接收端,只是尽力而为。而是通过更上层的TCP实现可靠传输。
5. Web网络安全
Web安全主要由两方面引起,不安全的脚本和不安全的请求。最常见的两种攻击XSS攻击(跨站脚本攻击)和CSRF(跨站请求伪造)
什么是XSS攻击?
XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。
其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。
XSS 攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。
攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,有时也会包含 HTML 和 Flash。有很多种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。
XSS攻击可以分为3类:存储型(持久型)、反射型(非持久型)、基于DOM。
什么是CSRF攻击
CSRF英文全称是Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。
和xss不同的是,CSRF攻击不需要将恶意代码注入用户的页面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击。
6. 参考链接汇总
牛客-2023校招计网八股汇总
掘金小册-Web 前端面试指南与高频考题解析
掘金-字节跳动最爱考的前端面试题:计算机网络基础
(建议精读)HTTP灵魂之问,巩固你的 HTTP 知识体系
XSS和CSRF攻击详解