阅读 2565

前端面试基础网络问题(万字长文)

总结回顾

这篇文章你会了解到什么

  • OSI七层协议和TCP/IP四层协议模型
  • 什么是UDP协议
  • 什么是TCP协议
  • TCP连接过程
  • TCP两次握手就可以完成,为撒需要三次了?
  • TCP断开连接过程
  • 为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?
  • ARQ协议(超时重传机制):停止等待ARQ协议、连续ARQ协议
  • 滑动窗口协议
  • 拥塞处理过程
  • 拥塞算法

一、七层协议(OSI)

1、应用层

作用:它是与其他计算机进行通信的应用,它是对应应用程序的通信服务的。各种应用软件,包括web应用。

协议:DNS、FTP、HTTP、SMTP、TELNET、IRC、WHOIS

2、表示层

作用:这一层的主要作用是定义数据格式和加密。

3、会话层

作用:控制应用程序的会话能力,它定义了一段会话的开始、控制和结束,包括对多个双向消息的控制和管理,以便在只完成一部分消息时可以通知应用。

PS:其实在应用层、表示层、会话层这三层中,协议是可以共用的

4、传输层

作用:对差错恢复协议和无差错恢复协议的选择,对同一主机上不同数据流的输入进行复用,对数据包进行重新排序。是最关键的一层,是唯一负责整体的数据传输和数据控制的。对上三层提供可靠的传输服务,对网络层提供可靠的目的地信息。在这一层数据的单位被称为数据段。

协议:TCP、UDP等

5、网络层

作用:主要负责寻找地址和路由选择,网络层还可以实现阻塞控制、网际互联等。

协议:IP、IPX、RIP、OSPF等

6、数据链路层

作用:负责物理层面上的互联的、节点间的通信传输;该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)

协议:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等

7、物理层

作用:负责0、1 比特流(0/1序列)与电压的高低、逛的闪灭之间的转换 规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。

典型规范:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌环网等

二、四层协议(TCP/IP网络模型)

协议的划分

OSI:

  • 物理层:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
  • 数据链路层:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2
  • 网络层:IP,IPX,AppleTalk DDP
  • 传输层:TCP,UDP,SPX
  • 会话层:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP
  • 表示层:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML
  • 应用层:FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP

TCP/IP:

  • 数据链路层:ARP,RARP
  • 网络层: IP,ICMP,IGMP
  • 传输层:TCP ,UDP,UGP
  • 应用层:Telnet,FTP,SMTP,SNMP.

计算机与网络设备要互相通信,双方需要基于相同的方法。比如如何建立通信目标,如何建立通信连接,由那一边先发起通信,使用何种语言进行通信,何时断开,这些都需要事先确认好。不同设备、不同操作系统之间也需要确认规则,我们称这些规则为协议。

TCP/IP是互联网相关协议的统称,包含:TCP,DUP,IP,FTP,HTTP,SMTP等等协议。

TCP/IP 模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。

  • 链路层:负责封装和解封装 IP 报文,发送和接受 ARP/RARP 报文等。
  • 网络层:负责路由以及把分组报文发送给目标网络或主机。
  • 传输层:负责对报文进行分组和重组,并以 TCP 或 UDP 协议格式封装报文。
  • 应用层:负责向用户提供应用程序,比如 HTTP、FTP、Telnet、DNS、SMTP 等。

在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。接下去介绍 TCP/IP 中有两个具有代表性的传输层协议----TCP 和 UDP。

三、UDP

UDP全称是用户数据协议,UDP是处于传输层的协议。和TCP一样是处理数据包的。UDP是面向无连接的。UDP不提供数据分组和组装,也不对数据进行重排,不保证数据是否安全到达。

1、面向无连接

UDP是一种面向无连接的协议,在发送数据之前,它不需要想TCP一样需要三次握手建立连接,想发送数据就可以发送,它只是数据的搬用工,不会对数据进行任何的拆分和组装。

  • 在发送数据时,应用层把数据传到传输层的UDP协议,UDP只是给数据增加一个UDP的标识。
  • 在接收数据时,网络成把数据传到传输层,UDP只是去除IP报文头,就传送给应用层了。

2、不可靠性

基于UDP是面试无连接的,不需要建立连接,想什么时候发送数据都可以发,所以,UDP是不可靠的。并且接受到什么数据就传递什么数据,并不会进行数据的备份。发送数据方并不关心数据是够丢失,也不关心接收方是够正确接收数据。 然后网络时好时坏,但是UDP协议没有网络阻塞的功能,如果数据开始发送,就会以一种恒定的速度开始发送数据。即使在网络不好的情况下,也不会进行速度的调整,这样会导致,在网络情况一般时,发生数据丢包。

3、高效性

UDP以恒定的速度发送数据,在网络情况不佳的情况下,是不可靠的,但是正是由于这样的不可靠性,导致UDP没有TCP那么复杂,不需要去保证数据的准确到达,也不需要重发,更不行考虑数据丢包的情况。

UDP头部包含:

  • 两个十六位的端口号,分别是源端口和目标端口
  • 整个数据报文的长度
  • 数据报文验证和IPV4,该字段用于发现头部信息和数据的错误。

所以,DUP的头部开销小,只有八个字节,相比TCP的二十几个字节在数据传输时,是非常高效的。

4、多种传输方式

UDP不只支持一对一的传输方式,还支持一对多、多对多、多对一的传输方式。换句话说,UDP提供了单播、多播、广播的传输方式。

5、面向报文

在数据发送时,UDP只是对应用层数据进行UDP头部表示就传递给IP网络层,并且不会对数据进行分组、拆分和封装,保留报文的边界,那么需要应用程序选择合适的报文大小。

使用场景:直播,游戏,等大概率会使用UDP,如果使用TCP,可能会出现极差的用户体验。TCP保证数据的准确和正确,如果网络出现波动,数据传输慢,等到数据传到过来时,可能已经发生了很多事情,用户的画面不是最新,已然是不能满足用户诉求。

四、TCP

当计算机进行通信时,两台计算机很多时候需要保证数据的可靠安全正确。例如,当你查看邮寄或者访问一个网页时,如果你不希望你看见的网页或者邮寄是完整的,没有丢失内容,那么这里需要使用到TCP。

TCP全称是传输控制协议,是一种面向有连接、安全可靠的、基础字节流的传输控制协议。

1、面向连接

在发送数据之前,双方需要建立连接,才能进行数据的正常发送。

2、仅支持单播传输

每条TCP传输只能在两个端点,只能进行点对点的传输,不支持多播和广播。

3、面向字节流

TCP不像UDP那样一个报文一个报文独立传输,而是在不保存报文边界的情况下以字节流的形式传输。

4、可靠性

TCP为了保证传输的可靠性给每一个包一个序号,同时也保证了传输到接收方的包是按序排列。接收方对于已经接受的包会回传一个相应的确认(ACK),如果发送方在确认的往返时延(RTT)没有收到确认,就会重新发送。

5、提供阻塞控制

当网络出现阻塞的时候,TCP会减少发送数量和发送速率。

6、全双工通信

TCP允许通信的双方应用程序在任何时候发送数据,因为TCP在两端都设有缓存,来存放临时通信数据。TCP可以马上发送数据段,也可以缓存等待一段时候在发数据段,以便一次发送更多的数据(最大的数据段取决于MSS)。

五、TCP的连接(三次握手)

首相我们假设,我们发送数据的一方是客户端,接受数据的一方为服务端。无论是客服端还是服务端,在建立连接之后,就可以发送和接受数据,所有TCP是全双工的。

起初客户端和服务端是都出关闭的状态,在通信开始前,双方会建立TCB,客户端在建立之后进行准备发送阶段,服务端处于LISTEN状态。

1、第一次握手

客服端发送请求连接报文段,其中包括自身的数据通信初始码。在请求发送之后,客户端进去了SYN-SENT状态。

2、第二次握手

服务端接受到请求连接报文,如果同意连接,这服务端回复一个报文段,其中也会包含一个自身的数据通信数据码。在发送后,便进入了SYN-RECEIVED状态。

3、第三次握手

客户端接受到服务端的报文段。还要向服务端发送一个确认报文。客户端在发送完成之后就进行了ESTABLISHED状态,服务端在接受到这个请求后也进行ESTABLISHED状态。此时客户端服务端建立连接完成。

PS:第三次握手中可以包含数据,通过快速打开(TFO)技术就可以实现这一功能。其实只要涉及到握手的协议,都可以使用类似 TFO 的方式,客户端和服务端存储相同的 cookie,下次握手时发出 cookie 达到减少 RTT 的目的。

PS:两次握手就可以完成,为撒需要三次了? 因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。 可以想象如下场景。客户端发送了一个连接请求 A,但是因为网络原因造成了超时,这时 TCP 会启动超时重传的机制再次发送一个连接请求 B。此时请求顺利到达服务端,服务端应答完就建立了请求,然后接收数据后释放了连接。 假设这时候连接请求 A 在两端关闭后终于抵达了服务端,那么此时服务端会认为客户端又需要建立 TCP 连接,从而应答了该请求并进入 ESTABLISHED 状态。但是客户端其实是 CLOSED 的状态,那么就会导致服务端一直等待,造成资源的浪费。

PS:在建立连接中,任意一端掉线,TCP 都会重发 SYN 包,一般会重试五次,在建立连接中可能会遇到 SYN Flood 攻击。遇到这种情况你可以选择调低重试次数或者干脆在不能处理的情况下拒绝请求。

六、TCP断开连接(四次握手)

1、第一次握手

如客户端认为数据发送完成,需要向服务端发送释放连接的请求。客户端进入FIN_WAIT_1状态。

2、第二次握手

服务端接收到客户端的连接释放请求,会告诉应用层要释放TCP连接。然后发送ACK到客户端,然后进入CLOSE_WAIT状态。此时表明客户端到服务端的连接已经释放,不会接受来自客户端的数据了,但是由于TCP是全双工。所以此时服务端还可以向客户端发送数据。

3、第三次握手

服务端如果在此时数据还没有发送完成,会继续发送,在数据发送完毕之后。服务端会向客户端发送连接释放的请求。然后服务端进入LAST_ACK状态。

4、第四次握手

客户端在接受到服务端的释放请求。会向服务端在发送一个确认请求。此时客户端进入TIME_WAIT状态 该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 服务端的重发请求的话,就进入 CLOSED 状态。当 客户端收到确认应答后,也便进入 CLOSED 状态。

PS:为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态? 为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。

七、ARQ协议(超时重传机制)

ARQ协议就是超时重传机制。通过确认和超时机制保证数据的正确到达,是OSI模型中传输层和数据链路层的错误纠正协议之一,在不可靠的服务基础上实现可靠的信息传输。ARQ协议包含停止等待ARQ协议和连续ARQ协议,拥有错误检测,正面确认,超时重传和负面确认及重传等机制。

1、停止等待ARQ协议

TCP是全双工协议,就是在建立连接之后,双方就是发送方也是接收方。在只考虑只是一方发送一方接收的情况下。我们假设发送方为A,接收方为B。

1.1 无差错的情况

A发送报文分组M1,发送完毕就暂停发送,等待B的确认。B收到M1,就向A发送确认。A收到确认之后就在发送下一个分组M2。

1.2出现差错的情况

如果A发送过程中出现差错或者B在接收M1是检查到出了差错(这里A在发送之前会保存分组的副本,再只有在收到确认之后才会清除副本),B在接收M1时检测到差错就丢弃M1,其他什么都不做。出现差错的情况,A只要超过一段时间没有收到确认,就任务出现差错,就会重新发送刚刚的分组,也就是超时重传。

超时重传就是在A发送完一个分组之后,就会设置一个超时计时器,如果在超时时间大于这个时间,就会重新发送分组。当然如果在时间内收到确认信息就不会重新发送。一般超时计时器的时间应该是大于一个RTT时间。

1.3 ACK延迟和丢失

如果A向B发送了分组M1,B接收到M1之后,发送确认应答信息,但是由于网络问题,确认信息丢失,那么这个时间,A在超时重传的时间段内,没有收到B 的确认信息。A会重传M1分组。那么B会做两个动作,①B会丢弃到M1分组,不向上层交付 ,因为之前已经收到过M1分组。②向A发送确认信息。

还有一种情况就是B发送的确认信息超时了,在超时重传的时间之后到达A,这种情况下,A会丢弃确认信息,然后重发分组,B在接收到信息之后,会丢弃重复的分组。并重发确认信息。

停止等待ARQ协议的优点是简答,但也有很严重的确定,就是信道利用率太低。 信道利用率U = TD / (TD + RTT + TA)。 其中Td发送时延,RTT是一个往返时间,Ta是接收时延

2、连续发送ARQ协议

由于停止等待ARQ协议通道利用率太低,所有需要使用连续ARQ协议来进行改善。这个协议会连续发送一组数据包。然后等待这些数据包的ACK。

连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。当发送方收到第一个分组的确认,就把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,则现在可以发送窗口内的第6个分组。

2.1累积确认

接收方一般都是采用累积确认的方式。也就是说接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。如果收到了这个分组确认信息,则表示到这个分组为止的所有分组都已经正确接收到了。

累积确认的优点是容易实现,即使确认丢失也不必重传。但缺点是,不能正确的向发送方反映出接收方已经正确收到的所有分组的信息。比如发送方发送了前5个分组,而中间的第3个分组丢失了,这时候接收方只能对前2个发出确认。而不知道后面3个分组的下落,因此只能把后面的3个分组都重传一次,这种机制叫Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。

八、滑动窗口协议

滑动窗口协议在在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。

发送窗口中有四个概念:

  • 已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)
  • 已发送但未收到确认的数据(位于发送窗口之内)
  • 允许发送但尚未发送的数据(位于发送窗口之内)
  • 发送窗口之外的缓冲区内暂时不允许发送的数据 接收窗口中也有四个概念:
  • 已发送确认并交付主机的数据(不在接收窗口和接收缓冲区之内)
  • 未按序收到的数据(位于接收窗口之内)
  • 允许接收的数据(位于接收窗口之内)
  • 不允许接收的数据(位于发送窗口之内)

滑动窗口是一个很重要的概念,它帮助 TCP 实现了流量控制的功能。接收方通过报文告知发送方还可以发送多少数据,从而保证接收方能够来得及接收数据,防止出现接收方带宽已满,但是发送方还一直发送数据的情况。

九、拥塞控制

网络拥塞现象是指到达通信网络中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。

拥塞控制是一种用来调整传输控制协议(TCP)连接上单次发送的分组数量的算法,通过增减单次发送量逐步调整,使之逼近当前网络的承载量。如果单次发送量为1,此协议就退化为停等协议。单次发送量是以字节来做单位的;但是如果假设TCP每次传输都是按照最大报文段(MSS)来发送数据的,那么也可以把数据包个数当作单次发送量的单位,所以有时我们说单次发送量增加1也就是增加相当于1个最大报文段的字节数。

1、拥塞控制的算法

拥塞控制假设分组的丢失都是由网络繁忙造成的。拥塞控制有三种动作,分别对应到源主机感受到的情况:

  1. 收到一条新确认。表明当前的单次发送量小于网络的承载量。此时可以增加单次发送量。若当前单次发送量小于慢启动阈值(ssthreash),则单次发送量加倍(乘以2),即指数增长;否则单次发送量加1,即线性增长。

  2. 收到三条对同一分组的确认,即三条重复的确认。说明网络有一点儿繁忙。此时单次发送量减半,慢启动阈值(ssthreash)约等于单次发送量,进入线性增长阶段。

  3. 对某一个分组的确认迟迟未到,即超时。说明网络比上一情况中的更加繁忙。此时慢启动阈值=单次发送量÷2,单次发送量=1,进入慢启动阶段(指数增长阶段)。

2、拥塞控制的四个阶段

2.1慢启动

慢启动,是传输控制协议(TCP)使用的一种阻塞控制机制。慢启动也叫做指数增长期。 慢启动算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。

慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。算法描述如下:

  1. 当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。

  2. 每收到一个ACK,拥塞窗口就翻倍(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。这是一种指数增长的关系。

  3. 发送方取拥塞窗口与通告窗口中的最小值作为发送上限。

2.2 拥塞避免

慢启动算法是在一个连接上发起数据流的方法,其指数级增长很快就会使网络出现拥塞现象,因为某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。拥塞避免算法是一种处理丢失分组的方法。有两种分组丢失的指示:发生超时和接收到重复的确认。发生超时,指源主机在超时定时器溢出时没有收到目的主机对某一分组的ACK;接收到重复确认,指在源主机的超时定时器溢出前,连续收到3个或3个以上收对某一分组的ACK。

当发现超时或接收到3次重复确认时,则表示有丢包事件,此时网络已发生拥塞现象,要进行相应的拥塞控制。算法描述如下:

  1. 将慢启动阈值(ssthreash)设置为当前窗口的一半(cwnd 和通告窗口大小的最小值,但最小为2个报文)。

  2. 如果是超时引起的拥塞,则拥塞窗口(cwmd)被置为1,进入慢启动过程。如果是重复确认引起的拥塞,则进入快速重传和快速恢复过程。

  3. 进入慢启动阶段后,拥塞窗口会指数级增长,如果拥塞窗口大于慢启动阈值(ssthreash),执行拥塞避免算法。执行拥塞避免算法时,由于慢启动阈值(ssthreash)已经存在,拥塞窗口大小不再翻倍增长,而是线性增加。

拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。1990年出现的TCPReno版本增加了 “快速重传”算法、”快速恢复”算法,避免了当网络拥塞不够严重时采用”慢启动”算法而造成过大地减小发送窗口尺寸的现象。

2.3快速重传

目的主机在收到一个失序的报文段时,会立即产生一个ACK(重复的ACK),这个重复的ACK不应该被延迟,目的在于让源主机知道目的主机收到了一个失序的报文段,并告诉源主机自己希望收到的序号。

由于我们不知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1到2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了,进入快速重传过程,描述如下:

1.将慢启动阈值(ssthreash)设置为当前拥塞窗口(cwnd)的一半,设置拥塞窗口(cwnd)为慢启动阈值(ssthreash)加上3倍的报文段大小。重传丢失的数据报文段,而无需等待超时定时器溢出。

2.每次收到另一个重复的ACK时,cwnd增加一个报文段大小并发送1个分组(如果新的cwnd允许发送)。收到另一个重复的ACK,说明网络中传输的一个分组到达了目的主机,网络中可再容纳一个分组,故cwnd增加一个报文段大小并发送一个分组。

2.4 快速恢复

丢失的分组通过快速重传过程发送完,并被目的主机接受后,目的主机就不再发送重复的ACK通知源主机发送丢失的分组了,而是发送确认新数据的ACK通知源主机发送新的分组。这个ACK应该是在进行重传后的一个往返时间内对重传分组的确认,也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。此时为了快速的恢复到较高的传输速度,就会进入快速恢复阶段,算法描述如下:

  1. 当确认新数据的ACK到达时,设置拥塞窗口(cwnd)为慢启动阈值(ssthreash)(快速重传时步骤1中设置的值),进入拥塞避免过程。

参考

关注下面的标签,发现更多相似文章
评论