网络数据包发送和接收过程解析

计算机网络体系结构分层

651016-20190403213253371-112748496.png

数据包名称简介

  • 包:可以说是全能性术语;
  • 帧:用于表示数据链路层中包的单位;
  • 数据包:是 IP 和 UDP 等网络层以上的分层中包的单位;
  • 段:则表示 TCP 数据流中的信息;
  • 消息:是指应用协议中数据的单位。

  每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。

651016-20190403213115559-1163198356.jpg

数据处理流程

用户 a 向用户 b 发送邮件为例子:

1c7ddca5e0e0415c8b4c69047e680fc7.jpeg

微信截图_20210330090819.png

1,应用程序处理

  首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。

2,TCP 模块的处理

  TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。

3,IP 模块的处理

  IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。

4,网络接口(以太网驱动)的处理

  从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。

5,网络接口(以太网驱动)的处理

  主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。

6,IP 模块的处理

  IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。另外,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。

7,TCP 模块的处理

  在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。

8,应用程序的处理

接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。

传输层中的 TCP 和 UDP

TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。

(1) TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。

(2) UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。

TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。

端口号

  数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

3f35fe4b91bb4a27b4ab30f84639d32a.jpeg
65b24665096545c089a7a18300218c6d.jpeg

  • (1) 和 (2) 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。
  • (3) 和 (1) 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。
  • 当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。

端口号的确定

  • 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
  • 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。

端口号与协议

  端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。

UDP

  • UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
  • UDP 将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
  • 传输途中出现丢包,UDP 也不负责重发。
  • 当包的到达顺序出现乱序时也没有纠正的功能。
  • 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。

UDP 常用于一下几个方面:

  • 1.包总量较少的通信(DNS、SNMP等);
  • 2.视频、音频等多媒体通信(即时通信);
  • 3.限定于 LAN 等特定网络中的应用通信;
  • 4.广播通信(广播、多播)。

TCP

  TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。

  根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。

三次握手

  TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。三次握手是指建立一个 TCP 连接时,需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

3148139034514574a74a055e2a35b6fd.jpeg

  • 第一次握手:客户端将标志位 SYN 置为1,随机产生一个值 seq=J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。

  • 第二次握手:服务器端收到数据包后由标志位 SYN=1,知道客户端请求建立连接,服务器端将标志位 SYNACK 都置为1,ack=J+1,随机产生一个值 seq=K ,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。

  • 第三次握手:客户端收到确认后,检查 ack 是否为 J+1ACK 是否为1,如果正确,则将标志位 ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1ACK 是否为1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED (已确立的)状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

  • SYN攻击:在三次握手过程中,Server 发送 SYN-ACK 后,收到 Client 的ACK之前的TCP连接称为半连接,此时Serve处于SYN_RECV状态,当收到ACK后,Server 转入ESTABLISHED状态。SYN 攻击就是 Client 在短时间内伪造大量不存在的IP地址,并向Server不断的发送 SYN 包,Server回复确认包,并等待 Client 的确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络阻塞甚至系统瘫痪。

SYN攻击就是一种典型的DDOS攻击,检测SYN攻击方式也很简单,即当有大量半连接状态且源地址是随机的,则可以断定遭到SYN攻击了,使用如下命令让其无处可逃:netstat -nap|grep SYN_RECV

四次挥手

  四次挥手即终止 TCP 连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在 socket 编程中,这一过程由 客户端 或 服务端 任一方执行 close 来触发。

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

3e49dad546ba48eca6777783a8456a97.jpeg

中断连接端可以是客户端,也可以是服务器端。

  • 第一次挥手:客户端发送一个 FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
  • 第二次挥手:服务器端收到 FIN 后,先发送 ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务器端的 FIN 报文。
  • 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送 FIN=N 报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入 LAST_ACK 状态。
  • 第四次挥手:客户端收到 FIN=N 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送 ack=N+1 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了 2MSL 后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,

4c5ab6ed942c431bbed30009959783c0.jpeg

通过序列号与确认应答提高可靠性

  在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。 反之,则数据丢失的可能性很大。

  在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

  未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。

  此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。

  对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此引入了序列号。

  序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

重发超时的确定

  重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证 “确认应答一定能在这个时间内返回”。

  TCP 要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值。

  在 BSD 的 Unix 以及 Windows 系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右。数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。

  此外, 数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

以段为单位发送数据

  在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。

  TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以 MSS 为单位。

  MSS 在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。然后会在两者之间选择一个较小的值投入使用。

利用窗口控制提高速度

  TCP 以 1 个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长,通信性能就越低。

  为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:

8c6eab31573940a5bc369ea648d45591.jpeg

  窗口大小就是指:无需等待确认应答,而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段,同时进行确认应答的功能。

滑动窗口控制

0f015679fbef46deb30d6669d5e28ddf.jpeg

  上图中的窗口内的数据,即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。

  在滑动窗口以外的部分,包括未发送的数据,以及已经确认对端已收到的数据。当数据发出后,若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。

  收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为 滑动窗口控制

窗口控制中的重发控制

  在使用窗口控制中, 出现丢包一般分为两种情况:

① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:

f665dba5def44bb8a9ae13848602442c.jpeg

② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为 高速重发控制

1a1667fade0340998a1879a9f06d8511.jpeg

网络层中的 IP 协议

  IP(IPv4、IPv6)相当于 OSI 参考模型中的第3层——网络层。网络层的主要作用是 “实现终端节点之间的通信”。这种终端节点之间的通信也叫 “点对点通信”。

微信截图_20210330090750.png

  • 主机:配置有 IP 地址,不进行路由控制的设备。
  • 路由器:既有 IP 地址又具有路由控制功能的设备。
  • 节点:主机和路由器的统称。

  网络的下一层—数据链路层 的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上,也能实现两端节点之间的数据包传输。

IP 大致分为三大作用模块,它们是 IP 寻址、路由(最终节点为止的转发)、IP 分包与组包。

IP 地址

  在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。在数据链路中的 MAC 地址正是用来标识同一个链路中不同计算机的一种识别码。

  作为网络层的 IP,也有这种地址信息,一般叫做 IP 地址。IP 地址用于在 “连接到网络中的所有主机中识别出进行通信的目标地址”。因此,在 TCP/IP 通信中所有主机或路由器必须设定自己的 IP 地址。

  不论一台主机与哪种数据链路连接,其 IP 地址的形式都保持不变。

  IP 地址(IPv4 地址)由32位正整数来表示。IP 地址在计算机内部以二进制方式被处理。然而,由于我们并不习惯于采用二进制方式,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数。如下:

902f8a4e03a242ecb6e16e3f718371e6.jpeg

将 IP 地址的32位二进制进行计算,得出约 43 亿个 IP 地址。

实际上,网络的发展超乎想象,互联网上的设备远超 43 亿, 2019 年 11 月 25 日全球的 IPv4 地址已经彻底耗尽,但是直到现在大家仍然还在用 IPv4 ,并没有因为地址没了而无法上网。是因为除了 IPv6 之外,我们使用 NAT 技术缓解了地址不足的问题。

IP 地址组成

IP 地址由网络号(网段地址)和主机号(主机地址)两部分组成。

微信截图_20210330090934.png

IP地址的主机标识

  如下图,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP 地址的 “主机标识” 则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠,即 IP 地址具有了唯一性。

微信截图_20210330091419.png

IP地址的网络标识

  如下图,IP 包被转发到途中某个路由器时,正是利用目标 IP 地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。

微信截图_20210330091204.png

IP 地址的分类

  IP 地址分为四个级别,分别为A类、B类、C类、D类。它根据 IP 地址中从第 1 位到第 4 位的比特列对其网络标识和主机标识进行区分。

微信截图_20210330091531.png

  • A 类 IP 地址是首位以 0 开头的地址。从第 1 位到第 8 位是它的网络标识(网络号)。用十进制表示的话,0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为 16,777,214(2的24次方-2) 个。其中 0 和 127 属于保留地址,减去两个保留地址,因此有 126 个可用的 A 类地址。

微信截图_20210330091724.png
微信截图_20210330091808.png

  • B 类 IP 地址是前两位 10 的地址。从第 1 位到第 16 位是它的网络标识(网络号)。用十进制表示的话,128.0.0.0~191.255.0.0 是 B 类的网络地址。B 类地址的后 16 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534 (2的16次方-2)个。其中 128.0191.255 属于保留地址,减去两个保留地址,因此有 16382 个可用的 B 类地址。

微信截图_20210330091932.png

微信截图_20210330092058.png

  • C 类 IP 地址是前三位为 110 的地址。从第 1 位到第 24 位是它的网络标识(网络号)。用十进制表示的话,192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为 254 (2的8次方-2)个。其中 192.0.0223.255.255 属于保留地址,减去两个保留地址,因此有 2097150 个可用的 C 类地址。

微信截图_20210330092208.png

微信截图_20210330092307.png

  • D 类 IP 地址是前四位为 1110 的地址。从第 1 位到第 32 位是它的网络标识(网络号)。用十进制表示的话,224.0.0.0~239.255.255.255 是 D 类的网络地址。D 类地址没有主机标识,常用于多播。

127.x.x.x 段地址空间是被保留的回环地址。

  在分配 IP 地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用。而全部为 1 的主机通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么 C 类地址每个网段最多只能有 254( 2的8次方- 2 = 254)个主机地址的原因。

广播地址

  广播地址( Broadcast Address) 是专门用于同时向网络中所有工作站进行发送的一个地址。在使用 TCP/IP 协议的网络中,主机标识段 host ID 为全1 (11111111,即十进制的255) 的IP 地址为广播地址,广播的分组传送给host ID 段所涉及的所有计算机。例如,对于 10.1.1.0 (255.0.0.0 )网段,其直播广播地址为 10.255.255.255 (255 即为 2 进制的11111111),当发出一个目的地址为 10.255.255.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

广播地址应用于网络内的所有主机,广播分为受限广播(本地广播)和直接广播两种。在本网络内的广播叫做受限广播(本地广播);在不同网络之间的广播叫做直接广播。

  • (1)受限广播(本地广播)
    它不被路由发送,但会被送到相同物理网络段上的所有主机
    IP地址的网络字段和主机字段全为1就是地址 255.255.255.255
  • (2)直接广播
    网络广播会被路由,并会发送到专门网络上的每台主机
    IP地址的网络字段定义这个网络,主机字段通常全为1,如 192.168.10.255
受限地址

  受限的广播地址是 255.255.255.255。该地址用于主机配置过程中IP数据包的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出本地网络中。

指向网络

  指向网络的广播地址是主机号为全1(11111111)的地址。A类网络广播地址为 netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

指向子网

  指向子网的广播地址为主机号为全1(11111111)且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往 128.1.2.255 的数据报,当B类网络 128.1 的子网掩码为 255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为 255.255.254.0,该地址就不是指向子网的广播地址。

指向所有子网

  指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如,如果目的子网掩码为 255.255.255.0 ,那么IP地址 128.1.255.255 是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。

IP多播(组播)

  IP多播(也称 多址广播组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在 网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、”push”技术(如股票行情等)和虚拟现实游戏等方面。

  有些应用会有这样的要求:一些分布在各处的进程需要以组的方式协同工作,组中的进程通常要给其他所有的成员发送消息。即有这样的一种方法能够给一些明确定义的组发送消息,这些组的成员数量虽然很多,但是与整个网络规模相比却很小。给这样一个组发送消息称为多点点播送,简称多播。需要注意的是多播数据包的目的ip地址实际上不可能对应某一台真实存在的主机的ip地址,也就是说该目的ip地址永远不可能作为源地址,即多播ip地址只能用于目的ip地址,不能用于源ip地址。

组播使用 D 类地址。因此 IP 地址前四位是 “1110” 开头的,就是组播地址。剩下的 28 位就是组播的组编号。组播的地址范围是 224.0.0.0 ~ 239.255.255.255 ,其中 224.0.0.0 ~ 224.0.0.255 既可以在同一个网段内实现组播,又可以跨网段给全网所有组员发送组播包。

微信截图_20210330093819.png

微信截图_20210330093945.png

1.多播地址和多播组

  IP多播通信必须依赖于IP多播地址,在 IPv4 中它是一个D类IP地址,并且ip首部中的协议字段为2,表明采用的是IGMP网际组管理协议。范围从 224.0.0.0239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。因此,如果从首位开始到第 4 位是 1110 ,就可以认为是多播地址,而剩下的 28 位可以成为多播的组编号。所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组,所有的路由器必须属于 224.0.0.2 的组。

  • 局部链接多播地址范围在 224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;
  • 预留多播地址为 224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;
  • 管理权限多播地址为 239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于 Internet,可限制多播范围。

  使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。

2. 多播技术硬件支持

要实现IP多播通信,要求介于多播源和接收者之间的路由器、集线器、交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。

  • (1)主机
    支持IP多播通信的平台包括 Windows CE 2.1、Windows 95、Windows 98、Windows NT 4 和 Windows 2000 等,运行这些操作系统的主机都可以进行IP多播通信。此外,新生产的网卡也几乎都提供了对IP多播的支持。
  • (2)集线器和交换机
    目前大多数集线器、交换机只是简单地把多播数据当成广播来发送接收,但一些中、高档交换机提供了对IP多播的支持。例如,在 3COM SuperStack 3 Swith 3300 交换机上可启用 802.1p 或 IGMP 多播过滤功能,只为已侦测到IGMP 数据包的端口转发多播数据包。
  • (3)路由器
    多播通信要求多播源节点和目的节点之间的所有路由器必须提供对 Internet组管理协议(IGMP)、多播路由协议(如PIM、DVMRP等)的支持。

  多播用于将包发送给特定组内的所有主机。由于其直接使用 IP 地址,因此也不存在可靠传输。相比于广播,多播既可以穿透路由器,又可以实现只给那些必要的组发送数据包。请看下图:

71e3a03024f04d32954f591d6e1edb43.jpeg

子网掩码

  子网掩码是在IPv4地址资源紧缺的背景下为了解决lP地址分配而产生的虚拟lP技术,通过子网掩码将A、B、C三类地址划分为若干子网,从而显著提高了IP地址的分配效率,有效解决了IP地址资源紧张的局面。如果是都是使用的IPV6的话是没有子网掩码的概念。IPV6是端到端的连接通信,不需要子网了。

  子网掩码用 32 位的二进制表示, IP 地址的网段地址部分设置为 1 , IP 地址的主机地址部分设置为 0 。换句话说, IP 地址有多少位网段地址,子网掩码就有多少位取 1 ,其余都取 0 。为了方便记录,每 8 位为一组,以 . 隔开,再转换为十进制数。

将子网掩码和 IP 地址进行与( AND )运算,可得到这个 IP 地址的网段地址。

详情参考:IP4-子网掩码

概念 特征 网络范围 默认掩码
A类地址 第1个8位中的第1位始终为0 0-127.x.x.x 255.0.0.0/8
B类地址 第1个8位中的第1、2位始终为10 128-191.x.x.x 255.255.0.0/16
C类地址 第1个8位中的第1、2、3位始终为110 192-y.x.x.x 255.255.255.0/24

  对于子网掩码,目前有两种表示方式。第一种是,将 IP 地址与子网掩码的地址分别用两行来表示。以 172.20.100.52 的前 26 位是网络地址的情况为例,如下:

bb3cd3458dc94871a4a68f3fdd4897eb.jpeg

第二种表示方式是,在每个 IP 地址后面追加网络地址的位数用 / 隔开,如下:

050f0e2d38554dd89fdc4427226cc688.jpeg

CIDR 与 VLSM

解决 IP 地址浪费问题,除了使用子网掩码,还使用了 CIDR 和 VLSM 技术。

CIDR ,即无类域间路由,采用任意长度分割 IP 地址的网络号和主机号。它有两个作用:

  • 把多个网段聚合到一起,生成一个更大的网段;
  • 汇总路由表 IP 地址,分担路由表压力。

微信截图_20210330094830.png

VLSM ,即可变长子网掩码,它可以对 A 、 B 、 C 类地址再进行子网划分,以达到充分利用 IP 地址的目的。

假如一家企业有 100 台电脑,按以前的办法,只能分配一个 C 类地址 222.222.222.0 。但是 VLSM 可以在一个 C 类地址上划分出多个子网地址,再分配其中一个容纳主机数量与稍大于企业需求数量的子网地址给企业,这样就可以实现 IP 地址的合理使用。

计算容纳 100 台电脑的子网:使用主机号的位数计算出子网的主机地址数量。当主机号有 7 位时,有 126 个可用主机地址,可容纳 100 台电脑。

微信截图_20210330095148.png

计算子网地址:当主机号有 7 位时,网络号有 32 - 7 = 25 位,也就是 222.222.222.0/24 向主机位借了一位作为子网位,那么子网掩码也就是 255.255.255.128。可分配 222.222.222.0/25 使用。

微信截图_20210330095237.png

222.222.222.0/25子网详情:

微信截图_20210330095312.png

CIDR 和 VLSM 的区别

CIDR 是主机号向网络号借位,目的是把几个网络汇总成一个大的网络,增加子网主机数量;

VLSM 是网络号向主机号借位,目的是把一个标准的网络划分成几个子网,减少子网主机数量。

公网地址与私有地址

IP 地址分为公网地址和私有地址。公网地址是在互联网上使用的,私有地址是在局域网中使用的。

公网地址由 Internet NIC 负责分配,通过它直接访问互联网。

微信截图_20210330095612.png

私有地址是一段保留的 IP 地址。只在局域网中使用,无法在互联网上使用。但是私有地址可以通过 NAT 技术,将私有地址转换为公网地址接入互联网。

微信截图_20210330095637.png

公网 IP 地址在互联网范围内是唯一的,私有 IP 地址只要在同一个局域网内唯一即可。在不同局域网内出现相同的私有 IP 不会影响使用。

IP路由

  发送数据包时所使用的地址是网络层的地址,即 IP 地址。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于 指明路由器或主机 的信息,以便真正发往目标地址。保存这种信息的就是 路由控制表

  IP 协议始终认为路由表是正确的。然后,IP 本身并没有定义制作路由控制表的协议。即 IP 没有制作路由控制表的机制。该表示由一个叫做 路由协议 的协议制作而成。

当一个数据包到达路由器时,路由器根据数据包的目的地址查询路由表,根据查询结果将数据包转发出去,这个过程就是 IP路由。

微信截图_20210330101202.png

路由表

  为了将数据包发给目的节点,所有节点都维护着一张路由表。路由表记录 IP 数据在下一跳应该发给哪个路由器。IP 包将根据这个路由表在各个数据链路上传输。

微信截图_20210330101335.png

  路由控制表的形成方式有两种:一种是管理员手动设置,也叫做 静态路由控制;另一种是路由器与其他路由器相互交换信息时自动刷新,叫做 动态路由控制

微信截图_20210330101457.png

下一跳

Hop ,中文叫 “跳”。它是指网络中的一个区间。IP 包就是在网络中一跳一跳的转发,在每一个区间内决定 IP 包下一跳的路径。

一跳是指数据链路中广播域的区间,也就是说不经过路由器而能直接到达的相连主机或路由器网卡的一个区间。

微信截图_20210330101607.png

IP 数据包就像包裹,而送货车就像数据链路。包裹不可能自己移动,必须有送货车承载转运。而一辆送货车只能将包裹送到某个区间范围内。每个不同区间的包裹将由对应的送货车承载、运输。IP 的工作原理也是如此。

微信截图_20210330101639.png

路由条目类型

默认路由

默认路由是指路由表中任何一个地址都能与之匹配的条目。所有数据包都可以使用默认路由进行数据转发。默认路由为 0.0.0.0/0default

微信截图_20210330102027.png

主机路由

IP地址/32 被称为主机路由,它是路由表中指向单个 IP 地址或主机名的路由条目。例如:192.168.153.15/32 就是一条主机路由,表示整个 IP 地址的所有位都将参与路由。

回环地址

以 127 开头的 IP 地址都是环回地址,其所在的回环接口可以理解为虚拟网卡。使用回环地址时,数据包会直接被主机的 IP 层获取,而不经过链路层,也不会流向网络。一般用来检查主机上运行的网络服务是否正常。

路由汇总

路由汇总主要是为了减少路由条目,把可以聚合的路由汇聚为一个大网络。

路由表越大,查找路由表所需的内存和 CPU 也就越多,时间也会越长,导致转发 IP 数据包的性能下降。如果想要搭建大规模、高性能的网络,就需要尽可能的路由表的大小。

微信截图_20210330102240.png
微信截图_20210330102302.png

IP 地址与路由控制

IP 地址的网络地址部分用于进行路由控制。路由控制表中记录着网络地址与下一步应该发送至路由器的地址。

  在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。

97e1e1332e5445c5b3da354f7cf407f9.jpeg

IP 分包与组包

数据链路与MTU

数据链路不同, MTU 则不同。

  每种数据链路的最大传输单元(MTU)都不尽相同,因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同,网络层的 IP 是数据链路的上一层, IP 通过分片屏蔽数据链路的差异,实现不同数据链路互通。从 IP 的上一层看,它完全可以忽略各个数据链路上的 MTU ,只需要按照源 IP 地址发送的长度接收数据包。

微信截图_20210330102721.png

IP报文的分片与重组

  任何一台主机都有必要对 IP 分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。

微信截图_20210330104125.png

路径 MTU 发现

分片机制有两点不足:

  • 加重路由器的处理性能;
  • 在分片传输中,一旦某个分片丢失,会造成整个 IP 数据包作废。

因此,只要允许,是不希望由路由器进行 IP 数据包的分片处理的。

为了应对分片机制的不足,路径MTU发现(Path MTU Discovery) 技术应运而生。

  路径 MTU 指的是,从发送端主机到接收端主机之间不需要分片是最大 MTU 的值。即路径中存在的所有数据链路中最小的 MTU 。进行路径 MTU 发现,就可以避免在中途的路由器上进行分片处理,也可以在 TCP 中发送更大的包。

微信截图_20210330104310.png

路径 MTU 发现的工作原理如下:

  • 1,发送端主机发送 IP 数据包时将其头部的分片禁止标志位设置为 1 。根据这个标志位,途中的路由器即使收到需要分片的大包,也不会分片,而是直接将包丢弃。之后通过一个 ICMP 不可达消息将数据链路上 MTU 值给发送端主机。

  • 2,发送端主机根据收到的 MTU 值对数据包进行分片处理,再把 IP 数据包发送给相同的目的主机。如此重复,直到数据包被发送到目标主机为止没有再收到任何 ICMP ,就认为最后一次 ICMP 所通知的 MTU 即是一个合适的 MTU 值。MTU 值至少可以缓存约 10 分钟,在这 10 分钟内使用刚得到的 MTU ,过了 10 分钟后就重新做一次路径 MTU 发现。

上面的例子是 UDP ,如果是在 TCP 的情况下,根据路径 MTU 的大小计算出最大段长度( MSS ),然后再根据这些信息进行数据包的发送。因此,在 TCP 中如果使用路径 MTU 发现, IP 层则不会再分片。

路由器三层转发原理

  路由器有多个端口,分别连接不同的数据链路。它通过识别目的 IP 地址的网络号,再根据路由表进行转发,路由表中有匹配的路由条目才会转发,无匹配的路由条目则直接丢弃。路由条目既可以手动设置静态路由,也可以通过路由协议自动生成动态路由。

路由器如何进行三层转发

当一台路由器收到一个数据包时,会执行如下步骤:

1,对数据包进行解封装。
通过解封装,查看网络层头部信息的 目的 IP 地址。

2,在路由表中查找匹配的路由条目。

查找匹配的路由条目,就需要将数据包的目的 IP 地址与各个路由条目的网段地址先进行二进制与( AND )运算,再将运算结果与路由条目的网段地址进行比较,若一致则该条目与目的 IP 地址相匹配。最后,与所有路由条目完成运算和比较,可得到一条或多条相匹配的路由条目。也可能没有匹配的路由条目,那么丢弃数据包。

微信截图_20210330104705.png

3,从多个匹配项中选择掩码最长的路由条目。

如果路由表中有多条路由条目都匹配数据包的目的 IP 地址,则路由器会选择掩码长度最长的路由条目,这种匹配方式称为最长匹配原则。

例如:10.1.3.10 的网络地址与 10.1.3.0/1610.1.3.0/24 两项都匹配,这时应该选择匹配度最长的 10.1.3.0/24

微信截图_20210330104813.png

4,将数据包按照相应路由条目进行转发。

路由条目中包含下一跳和出接口。当路由器找到相应的路由条目后,它就会根据对应的下一跳和出接口,将数据包从出接口发送数据给下一跳设备。

微信截图_20210330104927.png

IPv6

  IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节

IPv6 的特点

  • IP 地址的扩大与路由控制表的聚合。
  • 性能提升。包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
  • 支持即插即用功能。即使没有 DHCP服务器 也可以实现自动分配 IP 地址。
  • 采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
  • 多播、Mobile IP 成为扩展功能。

IPv6 中 IP 地址的标记方法

  一般人们将 128 比特 IP 地址以每 16 比特为一组,每组用冒号( : )隔开进行标记。而且如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号(::)隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。

IPv6 地址的结构

  IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配 IP 地址。

be1bff3dd05c4f999c7836ca26598c7d.jpeg

全局单播地址

  全局单播地址是指世界上唯一的一个地址。它是互联网通信以及各个域内部通信中最为常用的一个 IPv6 地址。

  格式如下图所示,现在 IPv6 的网络中所使用的格式为,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特为网络标识,后 64 比特为主机标识。

478cf4cd8c2b43339b80d7b667a6520a.jpeg

链路本地单播地址

  链路本地单播地址是指在同一个数据链路内唯一的地址。它用于不经过路由器,在同一个链路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址。

d9e6580e7ce245aa9116004055f69b8b.jpeg

唯一本地地址

  唯一本地地址是不进行互联网通信时所用的地址。唯一本地地址虽然不会与互联网连接,但是也会尽可能地随机生成一个唯一的全局 ID。

  • L 通常被置为 1
  • 全局 ID 的值随机决定
  • 子网 ID 是指该域子网地址
  • 接口 ID 即为接口的 ID

8efd0df062b049978546f10dc3895af5.jpeg

IPv6 分段处理

  IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。

  IPv6 中最小 MTU 为 1280 字节,因此,在嵌入式系统中对于那些有一定系统资源限制的设备来说,不需要进行 路径MTU发现,而是在发送 IP 包时直接以 1280 字节为单位分片送出。

IP 协议相关技术

  IP 旨在让最终目标主机收到数据包,但是在这一过程中仅仅有 IP 是无法实现通信的。必须还有能够解析主机名称和 MAC 地址的功能,以及数据包在发送过程中异常情况处理的功能。

DNS

  我们平常在访问某个网站时不适用 IP 地址,而是用一串由罗马字和点号组成的字符串。而一般用户在使用 TCP/IP 进行通信时也不使用 IP 地址。能够这样做是因为有了 DNS (Domain Name System)功能的支持。DNS 可以将那串字符串自动转换为具体的 IP 地址。

  这种 DNS 不仅适用于 IPv4,还适用于 IPv6。

ARP

  地址解析协议,即 ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个 TCP/IP 协议。主机发送信息时将包含目标IP地址的 ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机 ARP缓存 中,并保留一定时间,下次请求时直接查询 ARP缓存 以节约资源。

  地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送 ARP 应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机 ARP缓存;由此攻击者就可以向某一主机发送伪 ARP 应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个 ARP欺骗。ARP命令可用于查询本机 ARP缓存 中 IP 地址和 MAC 地址的对应关系、添加或删除静态对应关系等。相关协议有 RARP代理ARP。NDP用于在IPv6中代替地址解析协议。

  只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时,还要知道每个 IP 地址所对应的 MAC 地址。

  ARP 是一种解决地址问题的协议。以目标 IP 地址为线索,用来定位下一个应该接收数据分包的网络设备对应的 MAC 地址。不过 ARP 只适用于 IPv4,不能用于 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息。

RARP 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议。

ARP 的工作原理

当主机 A 向同一个网段内的主机 C 发送数据,但是不知道主机 C 的 MAC 地址。

微信截图_20210330105123.png

1,ARP 请求:主机 A 以主机 C 的 IP 地址为目的 IP 地址,以广播 MAC 地址为目的 MAC 地址,在同网段内发送这个广播报文,这个报文就叫 ARP 请求报文。

二层交换机不查看 IP 地址,根据目的 MAC 地址将报文除接收端口外的所有端口发送。

微信截图_20210330105217.png

2,ARP 响应:主机 C 发现目的 IP 地址是自己的 IP 地址,于是主机 C 以自己 MAC 地址和 IP 地址作为源 MAC 地址和源 IP 地址,以主机 A 的 MAC 地址和 IP 地址作为目的 MAC 地址和目的 IP 地址,发送响应报文给主机 A ,这个报文就叫 ARP 响应报文。其它主机收到主机 A 的 ARP 请求报文,因为目的 IP 地址不是自己的 IP 地址,因此不会进行响应。

当主机 A 在发送 ARP 广播请求报文时,二层交换机已经有主机 A 的 MAC 地址表条目。当收到主机 C 发送的单播 ARP 响应报文时,二层交换机将报文从相应端口发送出去。并将主机 C 的 MAC 地址和对应端口记录到 MAC 地址表中。

微信截图_20210330105326.png

3,更新 ARP 缓存表:主机 A 收到 ARP 响应报文后,将主机 C 的 IP 地址和 MAC 地址记录到 ARP 缓存表中。下次再向主机 C 发送数据时,直接将缓存的目的 MAC 地址进行封装。

微信截图_20210330105401.png

当主机 A 向不同网段的主机 C 发送数据,但是不知道主机 C 的 MAC 地址。

微信截图_20210330105435.png

1,主机 A 使用主机 C 的 IP 地址查询 ARP ,ARP 发现主机 C 不在同一个网段,需要通过默认网关(即默认路由的下一跳地址),但是没有网关 MAC 地址;

微信截图_20210330105523.png

2,主机 A 先将发送给主机 C 的数据放入缓存中,然后发送 ARP 请求报文,主机 A 以网关 IP 地址为目的 IP 地址发送 ARP 广播请求报文;

微信截图_20210330105548.png

3,路由器收到 ARP 广播请求报文后,将主机 A 的 MAC 地址和对应端口添加到自己的 MAC 表中,然后查看目的 IP 地址发现是请求自己的 MAC 地址,于是单播发送 ARP 响应报文;

微信截图_20210330105612.png

4,主机 A 收到 ARP 响应报文后,将发送给主机 C 的数据封装网关 MAC 地址为目的 MAC 地址进行发送;

微信截图_20210330105634.png

5,路由器收到报文后,查看目的 IP 地址,是发送给主机 C 的,于是查询路由表从相应端口发送数据。由于没有主机 C 的 MAC 地址,路由器发送 ARP 请求报文,源 MAC 地址和源 IP 地址替换为发送端口的MAC 地址和 IP 地址;

微信截图_20210330105656.png

6,主机 C 收到 ARP 请求报文后,添加路由器的端口和 MAC 地址到 MAC 地址表,单播发送 ARP 响应报文;

微信截图_20210330105715.png

7,路由器收到主机 C 的 MAC 地址后,将其添加到 MAC 地址表中。将主机 A 发送给主机 C 的报文重新封装,以自己的 MAC 地址为源 MAC 地址,以主机 C 的 MAC 地址为目的 MAC 地址,发送给主机 C ;

微信截图_20210330105737.png

8,主机 C 收到主机 A 发送的数据,发送过程结束。

当主机 C 向主机 A 发送回复报文时,同主机 A 向主机 C 发送数据的步骤一致。

ARP 代理

如果 ARP 请求是从一个网络的主机发往同一网段却不在同一物理网络上的另一台主机,那么连接它们的具有代理 ARP 功能的设备就可以回答该请求,这个过程称作 代理ARP 。

代理 ARP 功能屏蔽了分离的物理网络,让用户使用起来,跟在同一个物理网络上一样。

免费 ARP

免费 ARP 是一种特殊的 ARP 请求,它并非通过 IP 找到对应的 MAC 地址,而是当主机启动的时候,发送一个免费 ARP 请求,即请求自己的 IP 地址的 MAC 地址。

与普通 ARP 请求报文的区别在于报文中的目标 IP 地址。普通 ARP 报文中的目标 IP 地址是其它主机的 IP 地址;而免费 ARP 的请求报文中,目标 IP 地址是自己的 IP 地址。

微信截图_20210330110049.png

免费 ARP 的作用:

  • 起到一个宣告作用。它以广播的形式将数据包发送出去,不需要得到回应,只为了告诉其它主机自己的 IP 地址和 MAC 地址。
  • 可用于检测 IP 地址冲突。当一台主机发送了免费 ARP 请求报文后,如果收到了 ARP 响应报文,则说明网络内已经存在使用该 IP 地址的主机。
  • 可用于更新其它主机的 ARP 缓存表。如果该主机更换了网卡,而其它主机的 ARP 缓存表仍然保留着原来的 MAC 地址。这时,通过免费的 ARP 数据包,更新其它主机的 ARP 缓存表。

ICMP

IP 提供尽力而为的服务,指为了把数据包发送到目的地址尽最大努力。它并不做对端目的主机是否收到数据包的验证,无法保证服务质量。

  ICMP(Internet Control Message Protocol) Internet控制报文协议。它是 TCP/IP 协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  ICMP 使用 IP 的基本支持,就像它是一个更高级别的协议,但是,ICMP 实际上是IP的一个组成部分,必须由每个IP模块实现。

  ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。

  IPv4 中 ICMP 仅作为一个辅助作用支持 IPv4。也就是说,在 IPv4 时期,即使没有 ICMP,仍然可以实现 IP 通信。然而,在 IPv6 中,ICMP 的作用被扩大,如果没有 ICMPv6,IPv6 就无法进行正常通信。

ICMP 报文像 TCP/UDP 一样通过 IP 进行传输,但是 ICMP 的功能不是传输层的补充,应该把它当做网络层协议。’

ICMP 头部封装字段如:

微信截图_20210330110618.png

通过类型字段和编码字段的取值判断这个 ICMP 消息的类型。常见的 ICMP 消息所对应的类型和编码值如下图。

微信截图_20210330110640.png

从功能上,ICMP 的消息分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息。

微信截图_20210330110700.png

ping

我们常用的 ping 工具就是通过 ICMP 消息测试网络层连通性的。源主机发出 Echo request 消息,目的主机回应 Echo reply 消息,则两台主机间的网络层通信正常。也可以通过 ping 命令来判断目标主机是否启用。

微信截图_20210330110752.png

DHCP

  如果逐一为每一台主机设置 IP 地址会是非常繁琐的事情。特别是在移动使用笔记本电脑、只能终端以及平板电脑等设备时,每移动到一个新的地方,都要重新设置 IP 地址。

  于是,为了实现自动设置 IP 地址、统一管理 IP 地址分配,就产生了 DHCP(Dynamic Host Configuration Protocol)协议。有了 DHCP,计算机只要连接到网络,就可以进行 TCP/IP 通信。也就是说,DHCP 让即插即用变得可能。

   DHCP (Dynamic Host Configuration Protocol,动态主机配置协议) 是一个局域网的网络协议,使用UDP协议工作,指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为 Windows Server 的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。

  主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

  在RFC 2131中有详细的描述,DHCP有3个端口,其中 UDP67UDP68 为正常的 DHCP 服务端口,分别作为 DHCP ServerDHCP Client 的服务端口;546号端口用于 DHCPv6 Client,而不用于 DHCPv4 ,是为 DHCP failover 服务,这是需要特别开启的服务,DHCP failover 是用来做双机热备的。

DHCP 不仅在 IPv4 中,在 IPv6 中也可以使用。

NAT

  NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。

  除转换 IP 地址外,还出现了可以转换 TCP、UDP 端口号的 NAPT(Network Address Ports Translator)技术,由此可以实现用一个全局 IP 地址与多个主机的通信。

  NAT(NAPT)实际上是为正在面临地址枯竭的 IPv4 而开发的技术。不过,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 之间的相互通信当中常常使用 NAT-PT

IP隧道

e11421fc61d14423adab54661884f497.jpeg

夹着 IPv4 网络的两个 IPv6 网络

  如上图的网络环境中,网络A 网络B 之间无法直接进行通信,为了让它们之间正常通信,这时必须得采用 IP 隧道的功能。

  IP 隧道可以将那网络A 发过来的 IPv6 的包统合为一个数据,再为之追加一个 IPv4 的首部以后转发网络C。

  一般情况下,紧接着 IP 首部的是 TCP 或 UDP 的首部。然而,现在的应用当中 “IP首部的后面还是 IP首部” 或者 “IP首部 的后面是 IPv6的首部” 等情况与日俱增。这种在网络层的首部后面追加网络层首部的通信方法就叫做 “IP隧道”。

扩展:运行在传输层中的 TCP 和 UDP 的协议

每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议之一:

运行在 TCP协议上的协议:

  • HTTP(HypertextTransferProtocol,超文本传输协议),主要用于普通浏览。
  • HTTPS(HTTP over SSL,安全超文本传输协议), HTTP协议的安全版本。
  • FTP(FileTransferProtocol,文件传输协议),用于文件传输。
  • POP3(PostOfficeProtocol,version3,邮局协议),收邮件用。
  • SMTP(SimpleMailTransferProtocol,简单邮件传输协议),用来发送电子邮件。
  • TELNET(Teletypeover theNetwork,网络电传),通过一个 终端(terminal)登陆到网络。
  • SSH(SecureShell,用于替代安全性差的TELNET),用于加密安全登陆用。

运行在 UDP协议上的协议:

  • BOOTP(BootProtocol,启动协议),应用于无盘设备。
  • NTP(NetworkTimeProtocol,网络时间协议),用于网络同步。
  • DHCP(DynamicHostConfigurationProtocol,动态主机配置协议),动态配置IP地址。

运行在 TCP和 UDP协议上:

  • DNS(DomainNameService,域名服务),用于完成地址查找,邮件转发等工作。

参考:

https://www.sohu.com/a/339068354_774177

71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

https://blog.csdn.net/weixin_44630560/article/details/108100907