面试知识点(2)计算机网络

2019-08-23  本文已影响0人  微糖去冰_

1.OSI,TCP/IP,五层协议的体系结构,以及各层协议

OSI****分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP****分层(4层): 网络接口层(2)、 网际层、运输层、 应用层(3)。

五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层(3)。

每一层的作用如下:

物理层:物理媒体上实现比特流透明传输(比特Bit),RJ45、CLOCK。集线器、中继器

数据链路层:将比特组装成帧和点到点的传递(帧Frame)、VLAN、MAC。交换机、网桥

网络层:负责数据包从源到宿的传递和网际互连(包Packet)IP 、ARP。路由器、交互机

传输层:提供端到端的可靠报文传递和错误恢复(段Segment)TCP、 UDP。各种协议

会话层:建立、管理和终止会话(会话协议数据单元SPDU)RPC 、NFS。

表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)、JPEG 、ASII。

应用层:允许访问OSI环境的手段(应用协议数据单元APDU)、FTP、 HTTP、 DN。

2.三次握手和四次挥手

https://uploadfiles.nowcoder.com/images/20190313/311436_1552471554293_3A87D0457A6EE404083BBF3CB192C358

三次握手

1. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

2. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3. Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

四次挥手:

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

1.数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。

2.服务器接收到FIN后,发送一个ACK给客户端,确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态。客户端收到后进入FIN_WAIT_2状态。

3.当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认

4.客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号为收到的序号+1。此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。

为什么TIME_WAIT的时间是2MSL?

TIME_WAIT的状态是为了等待连接上所有的分组的消失。单纯的想法,发送端只需要等待一个MSL就足够了。这是不够的,假设现在一个MSL的时候,接收端需要发送一个应答,这时候,我们也必须等待这个应答的消失,这个应答的消失也是需要一个MSL,所以我们需要等待2MSL。

3.TCP和UDP的区别和各自适用的场景

1.TCP****和****UDP****区别

1)连接。TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接。UDP无连接。

2)服务对象

TCP是点对点的两点间服务,即一条TCP连接只能有两个端点;

UDP支持一对一,一对多,多对一,多对多的交互通信。

3)可靠性。TCP是可靠交付;UDP是尽最大努力交付

4)拥塞控制,流量控制

TCP有拥塞控制和流量控制保证数据传输的安全性。

UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。

5)报文长度

TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的。

UDP面向报文,不合并,不拆分,保留上面传下来报文的边界。

6)首部开销。TCP首部20个字节。UDP首部8字节。

2.TCP和UDP适用场景

若通信数据完整性大于通信实时性,则应该选用TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)

4.请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程

TCP保证可靠性:

(1)序列号、确认应答、超时重传

数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。

(2)窗口控制

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。

(3)拥塞控制

如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵,甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。

慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个rtt),将拥塞窗口大小*2。

拥塞避免:设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞。

快速重传:在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。

然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小。

这样可以达到:在****TCP****通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量,再进入慢慢上升的过程,网络不会轻易的发生瘫痪。

5.TCP滑动窗口与流量控制

接收方根据自己接收缓存的大小,动态调整发送方的发送窗口大小即接收窗口rwnd(接收方通过修改确认报文段的窗口字段来告知发送方),发送方将选择发送窗口和拥塞窗口的最小值。

零窗口与TCP持续计时器

  当窗口的左右边界重合(即窗口大小为0)时,发送端将停止发送数据直到窗口大小恢复为非零值,这样的窗口称为零窗口。当接收端重新获得可用空间,会给发送端发送一个窗口更新(window update),告知其可以继续发送数据。这样的窗口更新通常不包含数据(为纯ACK)。

但接收端发送的窗口更新是ACK报文,不能保证传输的可靠性。因此如果一个包含窗口更新的ACK丢失,通信双方就会一直处于等待状态:接收方等待接收数据(它已经发送了窗口更新),发送方等待窗口更新告知其可以继续发送,这样就会陷入死锁状态。为避免死锁发生,发送端会采用一个持续计时器间歇性地询问接收端,看其窗口是否增长。持续窗口计时器会触发窗口探测(window probe)消息的发送,强制要求接收端返回ACK。窗口探测包含一个字节的数据,采用TCP可靠传输(重传),强制要求接收端返回ACK,因此可以避免因窗口更新丢失而导致的死锁。

糊涂窗口综合征

  TCP基于窗口的流量控制机制的缺陷是可能会出现糊涂窗口综合征(Silly Window Syndrome,SWS)。当出现该问题时,TCP连接之间的数据交换可能是较小的数据段(极端情况下只有1字节的数据负载,却要消耗40字节的TCP头部),导致传输效率低下,造成资源浪费。一些针对这一特性的网络攻击的原理是,在TCP连接建立后,要么不做任何行为,要么只产生很小的应答,使得发送速率不断减慢。

   TCP连接的收发方两者都可能导致SWS的出现:接收端的通告窗口较小(例如没有等到窗口变大才通告),或者发送端发送的数据段较小(没有等待其他数据组合成一个更大的报文段)。引起SWS的原因不同,解决方案也不同。

   对于接收端来说,不应通告较小的窗口值。某些协议规定,在窗口可增至一个全长的报文段(MSS)或者接收端缓存空间的一半(取两者中的较小者)之前,不能通告比当前窗口更大的窗口值。

   而对于发送端来说,不应发送较小的报文段。具体实现的规则有所不同。

6.拥塞控制与流量控制的区别

拥塞控制的任务是确保子网能够承载所到达的流量。这是一个全局性问题,涉及到各方面的行为,包括所有的主机、所有的路由器、路由器内部的存储转发处理过程,以及所有可能会削弱子网承载容量的其它因素。

与此相反,流量控制只与特定的发送方和特定的接收方之间的点到点流量有关。它的任务是,确保一个快速的发送方不会持续地以超过接收方吸收能力的速率传输数据。流控制通常涉及到的做法是,接收方向发送方提供某种直接的反馈,以便告诉发送方别人一端的情形到底怎么样。

7.TCP发生粘包,拆包的原因:

1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。

2、待发送数据大于最大报文长度,TCP在传输前将进行拆包。

3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。

4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

解决方式:

  1. 给数据添加首部,首部包含了数据的长度
  2. 定长发送,不足的位补0
  3. 添加数据尾部和首部

8.浏览器中输入一个URL发生什么,用到哪些协议?

  1. 首先在应用层进行DNS解析,先从本地DNS缓存找,如果没有找到就访问DNS服务器(递归和迭代两种方式)
  2. 用DNS解析出ip以后在应用层发送http请求
  3. 然后在传输层tcp三次握手建立连接,然后传输数据
  4. 在网络层使用IP协议来传输分割好的tcp数据包数据,使用ARP协议根据ip得到mac地址
  5. 找到mac地址后把数据发送到数据链路层进行传输
  6. 接受方在数据链路层收到数据后把数据一层一层的往上传,一直传到应用层
  7. 然后服务器响应请求,返回html文件
  8. 浏览器收到服务器返回的文件以后进行页面渲染
上一篇下一篇

猜你喜欢

热点阅读