这篇文章列举了计算机网络常见的面试题目,希望对于考研面试或者工作面试的朋友有帮助。(看完大约会花费您20分钟)
网络模型与相关协议
OSI七层模型:物理层,数据链路层,网络层,运输层,会话层,表示层, 应用层。
TCP/IP5层模型:物理层,数据链路层,网络层,运输层,应用层。
TCP/IP4层模型:网络接口层,网络层(IP),运输层(TCP/UDP),应用层(HTTP)。
常见应用层协议:DNS,HTTP, SMTP, POP3(接受文件),FTP,Telent远程终端协议。
传输层:TCP,UDP。
网络层:ICMP,IGMP,IP。
在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。
ARP是IP地址解析为MAC地址 RARP 将MAC地址解析为IP地址。
TCP和UDP
区别
TCP提供可靠的、面向连接的运输服务。在传输数据之前必须三次握手建立连接,数据传输结束之后,4次挥手释放连接,而且在数据传递时,又有确认应答、超时重传、滑动窗口、拥塞控制等机制保证传送数据的可靠性。TCP经常用于对网络通信质量有很高要求的地方,如文件传输,邮件发送,远程登录等场景。SMTP、TELNET、HTTP、FTP。
UDP在传送数据之前不需要建立连接,目的主机收到UDP报文后,不需要给出确认。UDP不提供可靠交付,一般用于即时通信,如语音、视频、直播等。RIP(路由选择协议),DNS。
什么是基于字节流和数据报?
首先了解粘包问题,TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。原因可能是发送方也可能是接收方造成的。
TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的。而UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。
TCP三次握手:
1、客户端向服务器发送TCP连接请求数据包,其中同步标志为SYN=1,ACK=0,初始序列号为x;( syn_sent,等待回复)
2、服务器收到请求后,发回连接确认包。SYN=1,ACK=1,ack=x+1,初始序列号为y;( syn_rcvd,收到请求,等待回复)
3、客户端收到确认报文后,还需发送确认数据包。ACK=1,ack=y+1,序列号为x+1;( ESTABLISHED,完成三次握手)
三次握手是为了建立可靠的通信信道,双方都确认自己和对方的发送和接受都是正常的。SYN=1表示这是个连接请求或连接接受报文,不携带数据。不能变成两次,已失效的连接请求报文段突然又传送到了服务端,服务端误以为是正常的连接请求,直接发送连接确认报文,导致TCP建立,浪费资源,因而产生错误。
TCP连接状态
TCP四次挥手:
由于TCP连接是全双工的,因此每个方向都必须单独关闭。当一方数据发送任务完成之后,可以发送FIN来终止这个方向的连接。而另一方可以继续发送数据。
1、客户端发送请求释放连接报文,FIN=1,seq=u;客户端进入FIN-WAIT-1状态;
2、服务器收到请求,发送确认报文。ACK=1,seq=v,ack=u+1;服务器进入CLOSE-WAIT状态。客户端收到后进入终止等待2FIN-WAIT-2;
3、服务器发送完数据之后,向客户端发送请求释放连接报文,FIN=1,ACK=1,seq=w,ack=u+1;进入LAST-ACK状态
4、客户端收到请求后,发送确认报文,ACK=1,seq=u+1,ack=w+1。客户端进入TIME-WAIT状态,等待2MSL后进如CLOSED状态,服务器收到确认后进如CLOSED状态。
为什么关闭的时候是四次挥手,因为TCP连接时全双工的,每个方向都要发送关闭请求,而另一方向都要确认。
TIME_WAIT状态为什么要等待2MSL:因为第四次的确认报文可能丢失,这个状态是用来重发可能丢失的ACK报文。
为什么会有CLOSE_WAIT:因为服务器可能有数据未发送完毕,这段时间是继续发送数据的。
如果建立连接之后出现故障:TCP有个保活计时器,通常设置为2小时,两小时内没有收到客户端发送的数据,服务器发送探测报文,每75s发送一次,10次之后探测报文没有反应,认为出现故障,关闭连接。
SYN攻击原理
SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,
服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,
这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
第一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。
第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。
可是上述的两种方法只能对付比较原始的SYN Flood攻击,缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用SOCK_RAW随机改写IP报文中的源地址,以上的方法将毫无用武之地。
SYN Cookie的作用是缓解服务器资源压力。启用之前,服务器在接到SYN数据包后,立即分配存储空间,并随机化一个数字作为SYN号发送SYN+ACK数据包。然后保存连接的状态信息等待客户端确认。
启用SYNCookie之后,服务器不再分配存储空间,而且通过基于时间种子的随机数算法设置一个SYN号,替代完全随机的SYN号。发送完SYN+ACK确认报文之后,清空资源不保存任何状态信息。直到服务器接到客户端的最终ACK包,通过Cookie检验算法鉴定是否与发出去的SYN+ACK报文序列号匹配,匹配则通过完成握手,失败则丢弃。
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
视频传输是基于TCP还是UDP?(头条面试碰到的)
这里总结一下:
- 网页上的视频是基于HTTP/HTTPS,传输层是TCP。
- 视频聊天基于UDP。
- 有的使用p2p的,传输层应该也是TCP。
- 传输视频还有其他很多应用层协议。
由于在网页上看视频,可以忍受几秒的缓冲看到更为清楚的视频,所以用TCP问题不大;视频聊天需要注重及时,所以用UDP更合适。
拥塞控制和流量控制
滑动窗口
TCP通过滑动窗口的概念来进行流量控制,抑制发送端发送数据的速率,以便接收端来得及接收。
窗口:对应一段发送者可以发送的字节序列。这个序列是可以改变的。接收端发给发送端自己的接受能力。然后发送端根据已确认接受的序列号和接受能力滑动窗口,一下子全部发送,等待接收端确认。
两者区别
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
流量控制是点对点通信量的控制,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。
(设置拥塞控制窗口cwnd, 在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。)
拥塞控制过程
慢开始: 设置拥塞控制窗口cwnd = 1,没收到一个ACK,cwnd++;每过1RTT,cwnd = cwnd * 2;呈指数增长。
拥塞避免:当拥塞窗口 cwnd 达到一个阈值时(cwnd >= ssthresh),窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。每当过了一个RTT,cwnd = cwnd + 1;
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(没有收到确认ACK);拥塞窗口设置为1,阈值为拥塞时发送窗口的一半,执行慢开始算法。
快重传:当发送方连续收到三个重复确认时,就立即重传对方尚未收到的报文段。并执行快恢复算法
快恢复:将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
HTTP1.0、1.1、2.0之间的区别
HTTP1.1与1.0之间的区别
1、HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。而1.0不支持长连接。客户端和服务器每进行一次HTTP操作,就建立一次连接。
2、缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
3、Host头处理:1.0请求的url并没有传递主机名(服务器与IP地址绑定),1.1请求和响应都支持Host头域(虚拟主机共享IP地址)
4、1.1新增24个错误状态响应码。409:请求的资源和资源的当前状态冲突,410:服务器资源永久性删除。
5、带宽优化以及网络连接的使用:1.1允许只请求资源的某个部分。
HTTP2.0和HTTP1.X相比的新特性
1、新的二进制格式:1.x的解析是基于文本的,而2.0的协议解析是采用二进制格式。
2、多路复用,即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request。
3、header压缩。
4、服务端推送。
HTTP与HTTPS
1、HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
2、HTTP协议运行在TCP之上,传输的内容都是明文。HTTPS运行在SSL/TLS(运行在TCP之上)之上,内容加密。
3、连接端口不一样,http是80,https是443.
4、http连接简单,没有状态,https是ssl加密的传输,身份认证的网络协议,更安全。
加密
HTTPS在传统的HTTP和TCP之间加了一层用于加密解密的SSL/TLS层;采用对称加密和非对称加密结合的方式来保护浏览器和服务端之间的通信安全。对称加密:加密和解密都是同一个密钥。非对称加密:密钥成对出现,分为公钥和私钥,公钥和私钥之间不能互相推导,公钥加密需要私钥解密,私钥加密需要公钥解密。
浏览器使用Https的URL访问服务器,建立SSL链接;
1、发送非对称加密的公钥A给浏览器
2、客户端(SSL/TLS)解析证书(无效会弹出警告)
3、生成随机值(这个相当于传送数据的密钥),作为对称加密的密钥B。
4、浏览器使用服务器返回的公钥A,对自己生成的对称加密密钥B进行加密,得到密钥C。
5、浏览器将密钥C发送给服务器
6、务器使用自己的私钥D对接受的密钥C进行解密,得到对称加密密钥B。
7、将信息和密钥B混合在一起进行对称加密
8、将加密的内容发送给客户端
9、客户端用密钥B解密信息
对称加密: 客户端和服务端采用相同的密钥经行加密
encrypt(明文,秘钥) = 密文
decrypt(密文,秘钥) = 明文
非对称加密:客户端通过公钥加密。服务端通过私钥解密
encrypt(明文,公钥) = 密文
decrypt(密文,私钥) = 明文
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
常见问题
浏览器输入url并回车的过程以及相关协议
1、根据域名查询域名的IP地址,DNS解析。
2、TCP连接
3、发送HTTP请求
4、服务器处理请求并返回HTTP报文
5、浏览器解析渲染页面
6、连接结束。
使用的协议:DNS(获取域名的IP的地址);
TCP(与服务器建立TCP连接);
IP(建立TCP协议时,需发送数据,在网络层用到IP协议);
OPSF(IP数据包在路由之间传送,路由选择使用OPSF协议);
ARP(路由器与服务器通信时,将IP地址转化为MAC地址,使用ARP协议)
HTTP(TCP建立之后,使用HTTP协议访问网页);
DNS寻址:先查找浏览器缓存,如果没命中,查询系统缓存,即hosts文件。如果没命中,查询路由器缓存。如果没命中,请求本地域名服务器解析域名,没有命中就进入根服务器进行查询。没有命中就返回顶级域名服务器IP给本地DNS服务器。本地DNS服务器请求顶级域名服务器解析,没有命中就返回主域名服务器给本地DNS服务器。本地DNS服务器请求主域名服务器解析域名,将结果返回给本地域名服务器。本地域名服务器缓存结果并反馈给客户端。
HTTP请求有哪些,get和post的差别
- get:请求特定资源
- post:向指定资源提交数据进行处理请求。
- Put:向指定资源上传最新内容。
- Delete:请求删除资源。
Get是从指定资源请求数据,而Post是向指定资源提交要被处理的数据。Get请求刷新无害,而post刷新,数据会被重复提交。
Get请求的数据会附加到URL中,多个参数用&连接,URL编码采用ASCII编码。而POST请求会把请求的数据放到body中。因此get请求的数据会暴露在地址栏中,而post不会。又浏览器和服务器对url的长度有限制,所以get传输数据的大小受到url的限制。
Get请求的资源会被浏览器缓存。post比get慢,因为post在发送数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。而get请求直接发送请求头和数据。
状态码
1xx:指示信息–表示请求已接收,继续处理
100 --客户端必须继续发出请求 。
101-客户端要求服务器转换HTTP协议版本。
2xx:成功–表示请求已被成功接收、理解、接受
200—OK 。
204–请求收到,但返回信息为空 。
206–服务器已经完成了部分用户的GET请求。
3xx:重定向–信息不完整需要进一步补充
300 — 请求资源在多处可得到。
301—永久重定向,隐式重定向。
302 临时重定向,显示重定向。
304—请求的资源没有改变,可以使用缓存。
4xx:客户端错误–请求有语法错误或请求无法实现
401—未授权。
403—禁止访问。
404 –找不到。
409:对当前资源状态,请求不能完成。
5xx:服务器端错误–服务器未能实现合法的请求
500内部服务器错误
501未实现
502网关错误
503服务不可用
504 网关超时。
301,302:
301表示旧资源永久性移除了(这个资源不可访问),搜索引擎在抓取新内容的同时也将旧的网址装换为重定向之后的网址。
302表示旧资源还在,临时性重定向,搜索引擎抓取新内容而保存就地址。
转发和重定向的区别
转发(forward)是服务器行为,重定向是客户端行为。
1.转发是服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。效率高,可用于用户登录之后将角色转发到相应的模块。
2. 重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器到新的网址重新请求资源。地址栏url会发生改变,而且不能共享数据。效率低,可用于用户注销之后,跳转到其他网站。
Session和Cookie的区别:
Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端, 然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
客户端发送一个http请求到服务器端
服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
客户端发送一个http请求到服务器端,其中包含Cookie头部
服务器端发送一个http响应到客户端
Session保存在服务器上。 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。服务器一般把Session放在内存中。 每个用户都会有一个独立的Session。Session在用户第一次访问服务器的时候自动创建, 创建Session的同时,服务器会为该Session生成唯一的session id,session id会以cookie的方式发送个客户端。客户端下次访问时,带上这个session id,就可以跟踪会话了。如果浏览器不支持cookie,可以用url重写的方式,将sessionId写入url传给服务器。
最后
博客只写了一些常见问题,非常推荐大家看看《图解HTTP这本书》,页数不多,基本内容都概括,然后有时间看看《自定向下》,不推荐《计算机网络》(谢希仁),虽然本科教材是这个,但实在是难以看下去。
推荐一些不错的博客:
常见的一些面试题目
感谢您能看到最后,我是爱你的BenDingPets
转载:https://blog.csdn.net/ssg_cnblog/article/details/106185285