计算机网络面试题

1.谈谈OSI 七层模型,TCP/IP4层模型,以及每一层使用的协议,以及协议的作用?

OSI 被称为全球开发系统互联,核心思想就是让通信的两端都能了解对方的语言,也就是要求大家都使用同一种协议格式来发送数据,希望通信变得系统模块化,每个模块提供标准的接口。
应用层:为用户提供各种接口协议,比如HTTP、HTTPS、FTP等。
表示层:数据格式转化,数据加密,当表示层获得应用层的数据后,为了能够让一个系统能够识别,就要进行数据的转化或者转码。
会话层:建立、管理以及维护会话,也就是维护表示层之间的通信。
传输层: 传输层负责把数据封装成包,并标好序号,以便于对端接受数据。这一层有UDP和TCP协议。
网络层: IP和ICMP协议就在这一层,主要功能就是路由选路,将网路地址转化为物理地址,并决定如果从发送方路由到接收方。
数据链路层:提供介质访问,链路管理,ARP协议就在这里,通过mac地址寻找机器。
物理层:利用各种硬件设备传输比特流。
TCP/IP 分为4层:
应用层:这一层给用于提供了很多协议接口,比如HTTP/HTTPS/FTP等。
传输层:提供端到端的通信,不关心数据的中转过程,这一层有TCP/UDP协议。
网络层:数据包的选路和转发,有IP和ICMP协议
数据链路层:实现数据在物理介质上的传输,这一层有ARP、RARP协议。
它俩的区别:
OSI 更像一种标准,一种标准的参考模型。提出OSI的时间比TCP/IP要早,TCP/IP是有实践慢慢的形成而来,所以相对来说比较实用,慢慢的可能会淘汰OSI,他们的最大的却别就是层数不同,TCP/IP没有表示层和会话层,正是因为他们使用的相对较少,所以TCP/IP显的就比较简略实用一些。但是TCP/IP也有缺点,层次划分的不够仔细,有的人认为TCP/IP应该分为5层,将数据链路层和物理层区分开来,不只是有数据链路层,还应该有物理层。

2.画出TCP的三次握手,4次挥手的模型,以及每个阶段的状态。

在这里插入图片描述

3.TIME_WAIT什么时候会出现?出现很多次TIME_WAIT怎么办?

在主动发送断开请求后,对方做出响应后会产生TIME_WAIT状态。
服务器过多的TIME_WAIT状态,很有可能是受到了SYN攻击,或者是编码不规范,服务器端主动断开了连接。
解决办法有:修改内核参数,使TIME_WAIT状态下额SOCKET可重用,修改TIME_WAIT时间,快速回收TIME_WAIT状态下的SOCKET。

4.TIME_WAIT有什么作用?

TIME_WAIT保证了可靠的关闭TCP连接,使迟到的报文段丢失不被使用。
TIME_WAIT是主动关闭方在发起断开连接请求以后收到了对端的确认结束报文后的状态。他的存在就是防止对端没有收到主动方最后的确认信息,如果没有收到,对端会重新发送一个数据报,此时TIME_WAIT就是为了接收这个数据报。如果在TIME_WAIT(2MSL,一个MSL大概是2分钟)时间内,没有收到这个数据报,就说明对端已经收到最后的确认报文。
TIME_WAIT还有一个功能就是表明这个连接端口被占用,不能在这个端口上建立新的连接,防止没有断开之前被其他的连接使用,导致接收原来的数据。

5.TCP协议中的,拥塞控制,流量控制,以及超时重传。

这三种机制是TCP可靠传输的保证。
流量控制:网络通信的双方往往忽略的网络拥塞状态直接发送数据,一旦某个时刻,双方同时发送数据就会网络堵塞导致丢包问题,这个时候就需要滑动窗口这种机制来进行流量控制,但是滑动窗口太小就会导致了传输效率降低,因为频繁的发送和接收确认报文。但是滑动窗口太大,就像没有窗口一样,同样会导致拥塞。
超时重传:网络通信的时候,难免会因为网络延迟导致丢包的问题。TCP为了解决这个问题,在每个报文都增加了定时器,在初次发送一个报文的适合计时器开始计时,如果存在超过时间且没有收到确认报文的时候,那么久会触发超时重传(一般为5次,第一次为0.2s ),计时器重值,计时器时间增加前一次的一倍。

拥塞控制:

拥塞控制有4步:慢启动,拥塞避免,快重传,快恢复

  • 慢启动和拥塞避免:
    我们首先要知道一个概念,TCP传输数据的时候,一次能传输多少都是有发送窗口来控制的,要合理的选择发送窗口的大小,如果太大就会导致阻塞,如果太小就会倒找延迟。所有就出现了接收窗口和拥塞窗口,而发送窗口的大小取他们两者中较小值。为了进一步提高网络带宽利用率,此时就出现了慢启动算法,因为TCP在刚开始接收数据的时候根本不知道网络的实际情况,就要使用一种平滑的方式扩大拥塞窗口,让拥塞窗口慢慢变大,实际上慢启动方式是让拥塞窗口大小呈指数增长,如果不加以限制,很快就会造成网络拥塞。
    这个时候就出现了避免拥塞,当拥塞窗口大小到达一个阈值时,就让他以线性的方式增长,当出现了拥塞现象,新的阈值边为拥塞窗口大小的一半,拥塞窗口置为1。
    在这里插入图片描述
  • 快重传和快恢复:
    当发生拥塞的时候肯定会出现发送端连续收到多个确认报文的情况,这个时候说明数据已经无序了,TCP规定如果连续接收到3个确认报文就发送未收到数据报,就不必等重传计时器的时间的到来,这就是快重传。快恢复就是让阈值直接等于原来拥塞时的拥塞窗口大小的一半,不必再次计算。
6.访问一次页面的全过程?

访问目标地址有两种方式,首先是直接使用目标IP地址访问,还有一种是通过域名访问。
使用域名访问就要使用域名解析协议,通过DNS获得目标IP地址,获得目标IP地址以后,经历TCP三次握手保证双方可靠的连接,成功建立连接以后发送HTTP请求,服务器响应HTTP请求,浏览器得到想要的资源,解析网页,通过页面进行渲染展现给用户。
各层使用的协议有:HTTP协议,DNS域名解析解析协议,TCP协议,IP协议,ARP协议。

7.发起TCP连接时,IP不存在,哪一层会反馈错误?

第一种是在DNS域名解析的适合找不到响应的IP目的地址,这时时应用层反馈错误。
第二种是在局域网中当直接给定的IP地址,ARP列表里找不到它,这时数据链路层会反馈错误。
最后一种在广域网中,当我们给的IP在网络中无效,路由器就无法路由,网络层就反馈错误信息。

8.UDP与TCP的区别?

他们最大的却别就在于TCP是基于连接的,UDP是无连接的。TCP面向数据流,UDP面向的是数据报。TCP相对于UDP来说是可靠安全的的,UDP存在丢包的可能性,TCP的数据时有序的,UDP数据有可能是无序的。因为UDP没有拥塞控制,自由度比较高,所以传输效率就会很高。

  • 它们的适用场景也存在差异?
    在应用场景里,UDP更加适用于对数据的安全性要求不高的的应用,或者对有网络传输速率要求和延迟要求较高的应用。而TCP更加适用于对数据的安全性要求较高的应用。
  • QQ使用的那种传输协议?
    QQ这类的即时通信应用使用的较多的UDP协议,它们对网络延时的要求较高,但是为了提高数据的安全性,我认为可能对UDP进行了封装(在应用层增加了UDP应答包),这也是UDP的优势一方面的体现,他提供了较为自由的输出方式,我们根据自己的优化需要在使用UDP的时候在应用层进行封装。
  • UDP的优势在哪?
    现如今我们的网络质量越来越好,随着网速的提升,一定程度上降低了UDP数据的丢包率,如果使用在应用层能实现重传,就能保证传输的可靠性。
    TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,见了频繁的握手过程,由于TCP内置的系统协议栈,极难对其进行改进。
9.TCP定时器

重传定时器:为了保证数据成功的到达,TCP在发送数据报的时候这个计时器开始计时,如果存在超过时间内发送方未收到确认报文就会重新发送数据报,计时器归零。(系统默认重传5次,每次2s)
坚持定时器:当客户端收到服务器端的一个零窗口报文时,就会启动这个定时器,定时器到时以后就会发送一个探测报文查看窗口是否有位子空出来,有则客户端继续发送数据,没有则重置定时器。重复上述操作。
保活定时器:当TCP连接出现长时间没有通信的情况时,服务器每收到一个数据报就会重置一个定时器,然后开始计时,如果计时器到时还没有收到下一个报文就终止这个连接。
时间等待定时器:就是TIME_WAIT下的时间定时器器。

10.http/https,长连接,短连接,cgi和fastcgi的区别?cookie和session的区别?https的加密算法?

HTTP超文本传输协议,是基于TCP/IP协议的通讯协议,它是无连接状态的,常用的方法有POST和GET。
POST和GET都是基于HTTP请求的,POST和GET的主要区别在于,POST的传参量比较大,且参数存储在正文里,因此相比GET的请求信息会显示在地址栏里,POST更加安全一些。但是GET的信息是可以被缓存的,POST就不可以。
当一个请求中包含了参数就会调用服务器的应用程序,这个时候就会用到CGI,CGI是一通信协议,他是web服务器和服务器其他应用程序的通讯协议。具体的说就是,当客户端的请求包含了参数,肯定会调用服务的应用程序来处理参数然后返回结果。那么当服务器接收到的一个请求里如果包含了参数,它就可能需要开一个线程来处理,这时候就会使用CGI的方式将参数传给线程。(传递的方式一般为环境变量)
FastCGI是CGI的改良版,通常情况下,每一个带参请求,CGI都会fork一个子进程来处理,但是当请求多的时候显然效率就比较低。 这个时候就出现了FastCGI,它实际上是服务器开辟的一个进程池。它有一个master进程,接着它会fork()很多子进程,当有请求时就会分配给worker,这样就提高了效率。

  • cookie和session的区别?
    首先我们知道http是无连接无状态的,所以服务器就自己记录用户的状态,那么用来记录用户状态的就是东西就叫session。而cookie是客户端缓存用户信息的一种手段。但是我们知道服务端很有可能是一个服务器集群,那么当产生一个session以后,第二次同一个用户在发送请求时很有可能会被负载均衡到其他服务器上,这个时候就无法在session里找到这个用户的信息,这里我们就需要session信息同步了。
    session信息同步的两种方式:在cookie中记录session的ID,下回请求时则会直接通过session id找到对应的后端服务器,但是这样不是很安全。所以还有一种比较好的方式就是:使用memcache(因为它里面有分布式算法),在后端维护了一个session池,它把所有的session都放在里面,大家都可以使用。
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值