计算机网络面试:补充篇

网络分层

在这里插入图片描述

TCP/IP四层模型的网络接口层对应TCP/IP五层模型的哪两层?

答:物理层数据链路路层

网络层

谈谈网络层?

网络层又叫网际层、IP层。IP层主要是IP协议。

在这里插入图片描述

网络层特点

向上层只提供简单灵活、无连接、尽最大努力交付的数据报服务。

  • 简单灵活:每一个分组(也就是Ip数据报)独立发送, 与其前后分组无关 也即分组无序(不进行编号)
  • 无连接:网络在发送分组时不需要建立连接。
  • 尽最大努力交付:网络层不提供质量的承诺,即分组可能出错、丢失、重复、无序、当然也不保证分组交付的时限。
IP地址与硬件地址(MAC)区别?

在这里插入图片描述

  • MAC地址是数据链路层和物理层使用的地址,IP地址是网络层和以上各层使用的地址。
  • 数据自上层往下层发送时经过IP层会封装成IP数据报,这时数据报的首部就会存放ip地址
  • 当IP数据传递到数据链路层时就会被封装成MAC帧,MAC帧在传输数据时使用的源地址,和目的地址都是硬件的MAC地址。硬件MAC地址写在MAC帧的首部中。
  • IP层,IP数据报中的首部的源IP地址、目标ip地址是始终不变的。虽然经过多个路由器进行分组转发。
  • 数据链路层MAC帧的首部、尾部在不同的链路进行传输时是不断变化的。
  • 虽然在ip数据报有源站IP地址,但路由器只根据目的IP地址网络号进行路由选择。
主机或者路由器怎样知道应在MAC帧的首部填入什么样的MAC地址?

当IP数据报流入计算机或者路由器的链路层时(注意数据自上而下的),链路层会重新对MAC帧进行整理,原地址改为本机的MAC地址,目标地址改为下一目标的MAC地址。那么需要传送数据的目标ip地址是已知的,如何获得目标MAC地址呢?这里需要ARP协议配合。

由于IP协议使用了ARP协议通常把ARP协议归到网络层。

APR协议的作用是从网络层使用的IP地址解析出链路层使用的MAC地址。

还有个协议叫RARP逆地址解析协议,它的作用是知道自己MAC地址的主机可以通过这个协议逆向得到自己使用的IP地址。不过现在的DHCP协议已经包含了这个协议的功能。

IP数据报格式?

在TCP/IP的标准中,各种数据格式常常以32位(即4字节)为单位来描述。

一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

在这里插入图片描述

啥是NAT?

网络地址转换 NAT(Network Address Translation)

IPv4 地址只有 32 位长,因而最多只能提供 42.9 亿个唯一 IP 地址。不可能所有主机都分配一个唯一的 IP 地址。1994 年, NAT作为解决 IPv4 地址即将耗尽的一个临时性方案。

这种方案需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
在这里插入图片描述

传输层

TCP数据报文相关

报文格式是TCP首部+TCP数据报。TCP数据报其实就是应用层的报文。TCP首部有很多最短如源端口目的端口等TCP特有字段。
在这里插入图片描述

  • ACK(ACKnowlegment): 仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1

  • SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

  • FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

TCP特点

在这里插入图片描述

  • 面向连接:应用程序使用TCP协议之前要先建立连接,传送数据完毕后必须释放建立的链接。
  • 可靠交付:TCP传送的数据无差错、不丢失、不重复、按顺序到达。
  • 面向字节流:流入到应用进程或者从应用进程流出的是字节序列
  • TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
TCP三次握手

所谓的三次握手,是指建立一个TCP连接时,客服端和服务端总共需要发送3个数据包。

三次握手的目的是:连接服务器端口,建立 TCP 连接,并同步通信双方的序列号和确认号,交换 TCP 窗口大小信息。

在这里插入图片描述

详细步骤:

  • 设备A 发送同步序号 syn 包向设备 B 请求建立 TCP连接,并附带自身的缓冲区信息,然后进入 SYN_SEND 状态,表示请求已发送正在等待回复。
  • 设备B 收到请求后,记录设备A的信息,并创建自身的接收缓冲区,向设备A 发送 syn(服务端同步序列号) +ack(对客户端请求的确认) 的合成包,同时自身进入到 SYN_RECV 状态,表示已经准备好了,等待设备 A的会回复就可以向A发送数据了。
  • A 收到回复之后记录 B的信息,发送 ack 信息,自身进入 ESTABLISHED 状态,表示完全准备好了,可以进行发送和接收。
  • B 收到 A 的 ack 数据包后,进入 ESTABLISHED 状态。
TCP三次握手的目的?为啥不是两次?或者更多次?

我认为原因有三:
1、TCP是 可靠通信协议,所以TCP通信双方都必须要 维护一个序列号,标记已发送出去的数据包,哪些是已经被对方签收的。而三次握手就是通信双方相互告诉序列号的起始值,为了确保这个序列号被收到,所以双方都必须要有一个确认操作。
2、TCP协议需要在一个不可靠的网络环境下实现可靠的数据传输,意味着通信双方都必须通过某种手段来实现一个可靠的数据传输通道,而三次通信是建立这样一个通道的最小值,当然还可以四次,五次,知识没必要浪费这个资源。
3、防止历史的重复连接初始化造成的混乱问题,比如说在网络差的情况下,客户端连续多次发送建立连接的请求,假设只有两次握手服务端只能选择接受或者拒绝这个请求,但是服务器不知道这次请求是不是之前因为网络堵塞而过期的请求,也就是说服务端不知道当前客户端连接是有效还是无效

TCP四次挥手

在通信结束后,双方都可以释放连接,共需四次挥手。释放 TCP 连接前,客户端和服务端都处于已创建状态,直到客户端主动关闭 TCP 连接。

在这里插入图片描述

  • 机器 A 发送完数据之后,向机器B请求断开连接,自身进入FIN_WAIT_1状态,表示数据发送完成且已经发送FIN包(FIN标志位为1)
  • 机器 B 收到FIN包之后,回复ack包表示已经收到,但此时机器 B 可能还有数据没发送完成,自身进入CLOSE_WAIT状态,表示对方已发送完成且请求关闭连接,自身发送完成之后可以关闭连接;
  • 机器 B 数据发送完成之后,发送FIN包给机器 A,自身进入LAST_ACK状态,表示等待一个ACK包即可关闭连接;
  • 机器 A 收到 FIN包之后,知道机器 B 也发送完成了,回复一个ACK包,并进入TIME_WAIT状态

为什么客户端关闭连接前需要等待 2MSL 的时间?即 TIME_WAIT 的作用是什么?

MSL 即最长报文段寿命,它的存在是为了保证客户端发送的最后一个连接释放确认报文能到达服务器,从而使得服务器能正常释放连接。

  • 客户端发送的最后一个连接释放确认报文,可能会丢失,当服务器收不到最后一个连接释放确认报文时则不会进入关闭状态,但是会超时重发连接释放报文。如果客户端不等待 2MSL 时间就直接进入关闭状态,当最后一个连接释放确认报文丢失,服务端重发释放报文时,客户端则无法接受到这个报文,因此也就无法发送连接释放确认报文,最终导致服务端无法进入关闭状态。
  • 2MSL 的时间,还可以防止上文提到的早已失效的连接请求报文出现在本连接中,客户端发送了最后一个连接释放请求确认报文后,再经过 2MSL 时候,则可使本连接持续时间内所产生的所有报文段都从网络中消失,即在下一个新的连接中就不会出现早已失效的连接请求报文
TCP UDP的区别

在这里插入图片描述

  • 面向报文:面向报文的传输方式是应用层交给 UDP 多长的报文,UDP 发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率;若太短,会使IP数据报太小。

  • 面向字节流:面向字节流的话,虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串的无结构的字节流。TCP 有一个缓冲,当应用程序传送的数据块太长,TCP 就可以把它划分短一些再传送。

TCP可靠传输原理实现(滑动窗口)

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。

  • 确认和重传:接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。
  • 数据校验:数据合理分片与排序,TCP会对数据进行分片,接收方会缓存为按序到达的数据,重新排序后再提交给应用层。
  • 流程控制:当接收方来不及接收发送的数据时,则会提示发送方降低发送的速度,防止包丢失。
  • 拥塞控制:当网络发生拥塞时,减少数据的发送。
UDP可以进行广播为什么TCP不行?

UDP 不仅止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。TCP是一对一,全双工的传输方式。

如何设计在 UDP 上层保证 UDP 的可靠性传输?

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式。如不考虑拥塞处理,可靠UDP的简单设计如下:

  • 添加seq/ack机制,确保数据发送到对端
  • 添加发送和接收缓冲区,主要是用户超时重传。
  • 添加超时重传机制。

具体过程即是:发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

应用层

参考文章

安卓网络基础面试问题大全

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/124885132