区块链技术博客
www.b2bchain.cn

iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)求职学习资料

本文介绍了iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

一、可靠数据传输

网络层服务(IP服务)是不可靠的。IP不保证数据报的交付,不保证数据报的按序交付,也不保证数据报中数据的完整性。

TCP则是在IP服务上创建了一种可靠数据传输服务
TCP的可靠数据传输服务确保一个进程从其接收缓存中读出的数据流是无损坏、无间隔、无冗余、按序的数据流。即该字节流与连接的另一端发出的字节流是完全相同的。
作为TCP接收方,有三个与发送和重传有关的主要事件

1、从上层应用数据接收数据

将数据封装到一个报文段中,并把报文段交付给IP。每个报文段都包含一个序号Seq,即该报文段第一个数据字节的字节流编号。如果定时器还没有为其他报文段而运行,则启动定时器(即不是每条报文段都会启动一个定时器,而是一共只启动一个定时器),定时器的过期间隔是TimeoutInterval
是由EstimatedRTT和DevRTT计算得来的:TCP的往返时间的估计与超时

2、超时

TCP通过重传引起超时的报文段来响应超时事件,然后重启定时器。

而发送端超时有两种情况:发送数据超时,接收端发送ACK超时。这两种情况都会导致发送端在TimeoutInterval内接收不到ACK确认报文段。

  • 1、如果是发送数据超时,直接重传即可。
  • 2、而如果是接收端发送ACK超时,这种情况接收端实际上已经接收到发送端的数据了。那么当发送端超时重传时,接收端会丢弃重传的数据,同时再次发送ACK。

而如果在TimeoutInterval后接收到了ACK,会收下ACK,但不做任何处理

  • TCP不会为没有数据的ACK超时重传

以下两种情况:

  • 1、如果在发送两条或多条数据报文段都超时,那么只会重传序号最小的那个,并重启定时器。只要其余报文段的ACK在新重启的定时器超时前到达,就不会重传。
  • 2、如果发送序号为100120的两条数据报文段,序号100的ACK丢失,但收到了序号120的ACK,由于累积确认机制,可以得出接收方已经接收到了序号100的报文段,这种情况也不会去重传。

3、接收到ACK

用TCP状态变量SendBase指最早未被确认的字节的序号。则SendBase - 1 指接收方已正确按序接收到的数据的最后一个字节的序号。
当收到ACK确认报文段后,会将ACK的值Y与SendBase比较。TCP采用累计确认的方法,所以Y确认来字节编号在Y之前的所有字节都已经收到。如果YSendBase小,不用理会;而如果YSendBase大,则该ACK是在确认一个或多个先前未被确认的报文段,因此要更新SendBase变量,如果当前还有未被确认的报文段,TCP还要重启定时器。
通过超时重传,能保证接收到的数据是无损坏、无冗余的数据流,但并不能保证按序。

而通过TCP滑动窗口,能够有效保证接收数据有序

二、流量控制

TCP连接的双方主机都会为该TCP连接分配缓存和变量。当该TCP连接收到正确、按序的字节后,就将数据放入接收缓存。上层的应用进程会从该缓存中读取数据,但不必是数据一到达就立即读取,因为此时应用程序可能在做其他事务。而如果应用层读取数据相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。

所以,TCP为应用程序提供了流量控制服务(flow-control service),以消除发送方使接收方缓存溢出的可能性。

流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
作为全双工协议,TCP会话的双方都各自维护一个发送窗口和一个接收窗口(receive window)的变量来提供流量控制。而发送窗口的大小是由对方接收窗口来决定的,接收窗口用于给发送方一个指示–该接收方还有多少可用的缓存空间。

iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)

1、发送窗口

发送方的发送缓存内的数据都可以被分为4类:

  • 已发送,已收到ACK
  • 已发送,未收到ACK
  • 未发送,但允许发送
  • 未发送,但不允许发送

则2和3属于发送窗口

  • 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界

2、接收窗口

接收方的缓存数据分为3类:
1.已接收
2.未接收但准备接收
3.未接收而且不准备接收
则2 属于接收窗口(这里的接收指接收数据并确认)

  • 接收窗口只有在前面所有的报文段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,会先接收下来,接收窗口不会移动,并不对后续字节发送ACK确认报文,以此确保发送端会对这些数据重传。

我们定义以下变量:

  • LastByteRead:接收方应用程序读取的数据流的最后一个字节编号。可以得知,这是接收缓存的起点

  • LastByteRcvd:从网络中到达的并且已放入接收缓存中的数据流的最后一个自己的的编号。

可以得知:LastByteRcvdLastByteRead <= RcvBuffer(接收缓存大小)
那么接收窗口rwnd =RcvBuffer – (LastByteRcvdLastByteRead
rwnd是随时间动态变化的,如果rwnd为0,则意味着接收缓存已经满了。

一、可靠数据传输

网络层服务(IP服务)是不可靠的。IP不保证数据报的交付,不保证数据报的按序交付,也不保证数据报中数据的完整性。

TCP则是在IP服务上创建了一种可靠数据传输服务
TCP的可靠数据传输服务确保一个进程从其接收缓存中读出的数据流是无损坏、无间隔、无冗余、按序的数据流。即该字节流与连接的另一端发出的字节流是完全相同的。
作为TCP接收方,有三个与发送和重传有关的主要事件

1、从上层应用数据接收数据

将数据封装到一个报文段中,并把报文段交付给IP。每个报文段都包含一个序号Seq,即该报文段第一个数据字节的字节流编号。如果定时器还没有为其他报文段而运行,则启动定时器(即不是每条报文段都会启动一个定时器,而是一共只启动一个定时器),定时器的过期间隔是TimeoutInterval
是由EstimatedRTT和DevRTT计算得来的:TCP的往返时间的估计与超时

2、超时

TCP通过重传引起超时的报文段来响应超时事件,然后重启定时器。

而发送端超时有两种情况:发送数据超时,接收端发送ACK超时。这两种情况都会导致发送端在TimeoutInterval内接收不到ACK确认报文段。

  • 1、如果是发送数据超时,直接重传即可。
  • 2、而如果是接收端发送ACK超时,这种情况接收端实际上已经接收到发送端的数据了。那么当发送端超时重传时,接收端会丢弃重传的数据,同时再次发送ACK。

而如果在TimeoutInterval后接收到了ACK,会收下ACK,但不做任何处理

  • TCP不会为没有数据的ACK超时重传

以下两种情况:

  • 1、如果在发送两条或多条数据报文段都超时,那么只会重传序号最小的那个,并重启定时器。只要其余报文段的ACK在新重启的定时器超时前到达,就不会重传。
  • 2、如果发送序号为100120的两条数据报文段,序号100的ACK丢失,但收到了序号120的ACK,由于累积确认机制,可以得出接收方已经接收到了序号100的报文段,这种情况也不会去重传。

3、接收到ACK

用TCP状态变量SendBase指最早未被确认的字节的序号。则SendBase - 1 指接收方已正确按序接收到的数据的最后一个字节的序号。
当收到ACK确认报文段后,会将ACK的值Y与SendBase比较。TCP采用累计确认的方法,所以Y确认来字节编号在Y之前的所有字节都已经收到。如果YSendBase小,不用理会;而如果YSendBase大,则该ACK是在确认一个或多个先前未被确认的报文段,因此要更新SendBase变量,如果当前还有未被确认的报文段,TCP还要重启定时器。
通过超时重传,能保证接收到的数据是无损坏、无冗余的数据流,但并不能保证按序。

而通过TCP滑动窗口,能够有效保证接收数据有序

二、流量控制

TCP连接的双方主机都会为该TCP连接分配缓存和变量。当该TCP连接收到正确、按序的字节后,就将数据放入接收缓存。上层的应用进程会从该缓存中读取数据,但不必是数据一到达就立即读取,因为此时应用程序可能在做其他事务。而如果应用层读取数据相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。

所以,TCP为应用程序提供了流量控制服务(flow-control service),以消除发送方使接收方缓存溢出的可能性。

流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
作为全双工协议,TCP会话的双方都各自维护一个发送窗口和一个接收窗口(receive window)的变量来提供流量控制。而发送窗口的大小是由对方接收窗口来决定的,接收窗口用于给发送方一个指示–该接收方还有多少可用的缓存空间。

iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)

1、发送窗口

发送方的发送缓存内的数据都可以被分为4类:

  • 已发送,已收到ACK
  • 已发送,未收到ACK
  • 未发送,但允许发送
  • 未发送,但不允许发送

则2和3属于发送窗口

  • 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界

2、接收窗口

接收方的缓存数据分为3类:
1.已接收
2.未接收但准备接收
3.未接收而且不准备接收
则2 属于接收窗口(这里的接收指接收数据并确认)

  • 接收窗口只有在前面所有的报文段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,会先接收下来,接收窗口不会移动,并不对后续字节发送ACK确认报文,以此确保发送端会对这些数据重传。

我们定义以下变量:

  • LastByteRead:接收方应用程序读取的数据流的最后一个字节编号。可以得知,这是接收缓存的起点

  • LastByteRcvd:从网络中到达的并且已放入接收缓存中的数据流的最后一个自己的的编号。

可以得知:LastByteRcvdLastByteRead <= RcvBuffer(接收缓存大小)
那么接收窗口rwnd =RcvBuffer – (LastByteRcvdLastByteRead
rwnd是随时间动态变化的,如果rwnd为0,则意味着接收缓存已经满了。

一、可靠数据传输

网络层服务(IP服务)是不可靠的。IP不保证数据报的交付,不保证数据报的按序交付,也不保证数据报中数据的完整性。

TCP则是在IP服务上创建了一种可靠数据传输服务
TCP的可靠数据传输服务确保一个进程从其接收缓存中读出的数据流是无损坏、无间隔、无冗余、按序的数据流。即该字节流与连接的另一端发出的字节流是完全相同的。
作为TCP接收方,有三个与发送和重传有关的主要事件

1、从上层应用数据接收数据

将数据封装到一个报文段中,并把报文段交付给IP。每个报文段都包含一个序号Seq,即该报文段第一个数据字节的字节流编号。如果定时器还没有为其他报文段而运行,则启动定时器(即不是每条报文段都会启动一个定时器,而是一共只启动一个定时器),定时器的过期间隔是TimeoutInterval
是由EstimatedRTT和DevRTT计算得来的:TCP的往返时间的估计与超时

2、超时

TCP通过重传引起超时的报文段来响应超时事件,然后重启定时器。

而发送端超时有两种情况:发送数据超时,接收端发送ACK超时。这两种情况都会导致发送端在TimeoutInterval内接收不到ACK确认报文段。

  • 1、如果是发送数据超时,直接重传即可。
  • 2、而如果是接收端发送ACK超时,这种情况接收端实际上已经接收到发送端的数据了。那么当发送端超时重传时,接收端会丢弃重传的数据,同时再次发送ACK。

而如果在TimeoutInterval后接收到了ACK,会收下ACK,但不做任何处理

  • TCP不会为没有数据的ACK超时重传

以下两种情况:

  • 1、如果在发送两条或多条数据报文段都超时,那么只会重传序号最小的那个,并重启定时器。只要其余报文段的ACK在新重启的定时器超时前到达,就不会重传。
  • 2、如果发送序号为100120的两条数据报文段,序号100的ACK丢失,但收到了序号120的ACK,由于累积确认机制,可以得出接收方已经接收到了序号100的报文段,这种情况也不会去重传。

3、接收到ACK

用TCP状态变量SendBase指最早未被确认的字节的序号。则SendBase - 1 指接收方已正确按序接收到的数据的最后一个字节的序号。
当收到ACK确认报文段后,会将ACK的值Y与SendBase比较。TCP采用累计确认的方法,所以Y确认来字节编号在Y之前的所有字节都已经收到。如果YSendBase小,不用理会;而如果YSendBase大,则该ACK是在确认一个或多个先前未被确认的报文段,因此要更新SendBase变量,如果当前还有未被确认的报文段,TCP还要重启定时器。
通过超时重传,能保证接收到的数据是无损坏、无冗余的数据流,但并不能保证按序。

而通过TCP滑动窗口,能够有效保证接收数据有序

二、流量控制

TCP连接的双方主机都会为该TCP连接分配缓存和变量。当该TCP连接收到正确、按序的字节后,就将数据放入接收缓存。上层的应用进程会从该缓存中读取数据,但不必是数据一到达就立即读取,因为此时应用程序可能在做其他事务。而如果应用层读取数据相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。

所以,TCP为应用程序提供了流量控制服务(flow-control service),以消除发送方使接收方缓存溢出的可能性。

流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
作为全双工协议,TCP会话的双方都各自维护一个发送窗口和一个接收窗口(receive window)的变量来提供流量控制。而发送窗口的大小是由对方接收窗口来决定的,接收窗口用于给发送方一个指示–该接收方还有多少可用的缓存空间。

iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)

1、发送窗口

发送方的发送缓存内的数据都可以被分为4类:

  • 已发送,已收到ACK
  • 已发送,未收到ACK
  • 未发送,但允许发送
  • 未发送,但不允许发送

则2和3属于发送窗口

  • 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界

2、接收窗口

接收方的缓存数据分为3类:
1.已接收
2.未接收但准备接收
3.未接收而且不准备接收
则2 属于接收窗口(这里的接收指接收数据并确认)

  • 接收窗口只有在前面所有的报文段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,会先接收下来,接收窗口不会移动,并不对后续字节发送ACK确认报文,以此确保发送端会对这些数据重传。

我们定义以下变量:

  • LastByteRead:接收方应用程序读取的数据流的最后一个字节编号。可以得知,这是接收缓存的起点

  • LastByteRcvd:从网络中到达的并且已放入接收缓存中的数据流的最后一个自己的的编号。

可以得知:LastByteRcvdLastByteRead <= RcvBuffer(接收缓存大小)
那么接收窗口rwnd =RcvBuffer – (LastByteRcvdLastByteRead
rwnd是随时间动态变化的,如果rwnd为0,则意味着接收缓存已经满了。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS 网络相关面试题(可靠数据传输、流量控制(滑动窗口)、拥塞控制)求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们