如今计算机网络基本可以说是中、大厂面试必问的内容,但是现在好多文章的答案并不够全面深刻,有的则过于详细,不利于面试以下是借鉴资料和他人文章,总结常见计算机网络面试题,希望为大家带来帮助。
应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。
传输层:负责向两台主机进程之间的通信提供数据传输服务。传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。
数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。
对称加密是指加密和解密使用同一个密钥的方式,一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。
使用一对非对称密钥加密,即公钥和私钥,公钥可以随意发布,任何人都能获得,但私钥只有自己知道,发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以叫作非对称加密。
HTTPS协议是安全的,因为HTTPS协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但是HTTPS在内容传输使用的是对称加密,在证书验证阶段使用非对称加密。所以HTTPS加密方式是:对称加密 + 非对称加密混合。
1)浏览器发起 HTTPS 请求;
2)服务端返回 HTTPS 证书;
3)客户端验证证书是否合法,如果不合法则提示告警。
1)当证书验证合法后,在本地生成随机数;
2)通过公钥加密随机数,并把加密后的随机数传输到服务端;
3)服务端通过私钥对随机数进行解密;
4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
200 OK:表示从客户端发送给服务器的请求被正常处理并返回成功。
301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL。
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL。
400 Bad Request:表示请求报文存在语法错误。
403 Forbidden:服务器拒绝该次访问(访问权限问题)。
404 Not Found:表示服务器上无法找到请求的资源(也可以在服务器拒绝请求但不想给拒绝原因时使用)。
500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时。
503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求。
HTTP1.0默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
HTTP/1.1起默认使用长连接。要使用长连接,客户端和服务器的HTTP响应头部的Connection要设置为keep-alive,才能支持长连接。
HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。
默认情况下,HTTP请求是按顺序发的,下一个请求只有在当前请求收到响应之后才会被发出,有点像停止等待协议。而在收到下一个请求之前,可能需要很长时间。流水线就是在一个HTTP长连接下连续发出请求,不用等待响应返回,减少延迟。
输入网址:输入要访问的网址,即URL。
缓存解析:浏览器获取URL后,先去缓存中查找资源,从浏览器缓存-系统缓存-路由器缓存中查看; 如果有就从缓存中显示界面,不再发送请求; 如果没有,则发送HTTP请求。
域名解析:发现缓存中没有资源,发送HTTP请求; 在发送HTTP请求之前,需要进行DNS解析(域名解析); DNS解析:域名到IP地址的转换过程,域名的解析工作由DNS服务器完成,解析后可以获取域名相应的IP地址。
TCP连接:三次握手在域名解析后,浏览器向服务器发起了HTTP请求,TCP连接;因为TCP协议时面向连接的,所以在传输数据前必须建立连接,即三次握手;TCP连接建立后,浏览器开始向服务器发送HTTP请求报文。
收到请求:服务器收到浏览器发送的请求信息,返回响应。
页面渲染:浏览器收到服务器发送的响应,显示页面内容。
区别:
XSS攻击原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。
例如:
<script>alert("close me!")</script>
XSS攻击类似于SQL注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在XSS攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
浏览器搜索自己浏览器的DNS缓存,若没有,则搜索本地操作系统中的DNS缓存和hosts文件。若没有,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则依次向根域名服务器、顶级域名服务器、权限域名服务器发起查询请求,最终返回IP地址给本地域名服务器。本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来,操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来,浏览器得到域名对应的IP地址。
拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。
拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(CWND)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。TCP的拥塞控制采用了四种算法,即:慢开始、拥塞避免、快重传和快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如:主动队列管理AQM),以减少网络拥塞的发生。
慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。CWND初始值为1,每经过一个传播轮次,CWND加倍。
拥塞避免: 拥塞避免算法的思路是让拥塞窗口CWND缓慢增大,即每经过一个往返时间RTT就把发送方的CWND加1。
快重传与快恢复: 在TCP/IP中,快速重传和快恢复(FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。
没有FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和快恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据;
对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新排序,然后才交给应用层;
丢弃重复数据:对于重复数据,能够丢弃重复数据;
应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
超时重发:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
DHCP(动态主机配置协议)是一个局域网的网络协议。
指的是由服务器控制一段IP地址范围,给用户提供了即插即用的联网方式,用户不需要再手动配置IP地址等信息
该协议自动为用户分配TCP/IP参数信息,如:IP地址,子网掩码,网关等信息。
SQL注入就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样;
比如说我们通过账号密码进行登录,首先需要进行查询判断:
"select * from t_user where name = "张三" and password = "123456"
如果我们把or 1 = 1作为拼接在密码末尾传入进来,执行查询的时候sql会变成
"select * from t_user where name = "张三" and password = "123456" or 1 = 1
密码永远都是成立的,所以,前面无论密码正确与否都会成功登录
我们使用预编译语句就可以避免这个问题,例如:JDBC中的PrepareStatement或MyBatis中#{}
将SQL预编译,传参数的时候,不会改变SQL语句结构,就可以避免注入。
URL,统一资源定位符,URL 其实就是我们平时上网时输入的网址,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。例如
http://coderx.cc/blog/28 这个 URL,标识一个特定资源并表示该资源的某种形式是可以通过HTTP协议从相应位置获得。
URI,统一资源标识符,URL是URI的一个子集,两者都定义了资源是什么,而 URL还定义了如何能访问到该资源。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。简单地说,只要能唯一标识资源的就是 URI,在URI的基础上给出其资源的访问方式的就是 URL。
通俗理解:
URI表示的是一个抽象的地址,URL表示的是一个详细的地址。
抽象的地址:湖北省荆州市(这是一个抽象的地址,相当于URI)
详细的地址:湖北省荆州市荆州区学苑路长江大学(这是一个详细的地址,相当于URL)
为什么URL是URI的子集,长江大学(URL)属于湖北省荆州市(URI)
那么http://coderx.cc 是一个URI(URI只指明了服务器的地址,没有具体到文件是什么类型)
那么http://coderx.cc/blog/28就是一个URL(他具体到了blog文章的位置)
阻塞和非阻塞:调用者在事件没有发生的时候,一直等待事件发生,不能处理其他任务是阻塞。调用者在事件没有发生的时候,可以去处理别的事务这是非阻塞。
同步和异步:调用者循环查看事件有没有发生,这种情况是同步。调用者不用自己去查看事件有没有发生,而是等待注册在时间上的回调函数自己通知自己,这是异步。
关于IP地址、子网掩码、网络地址,你看这篇就够了!
关于局域网、路由器、常用的网络协议,你看这篇就够了!
转自私人博客:CoderX_Blog