网络协议全景:Linux环境下的TCP/IP、UDP

在这里插入图片描述

目录

  • 1.UDP协议解析
      • 1.1.定义
      • 1.2.UDP报头
      • 1.3.特点
      • 1.4.缓冲区
  • 2.TCP协议解析
      • 2.1.定义
      • 2.2.报头解析
        • 2.2.1.首部长度(4位)
        • 2.2.2.窗口大小
        • 2.2.3.确认应答机制
        • 2.2.4.6个标志位
      • 2.3.超时重传机制
      • 2.4.三次握手四次挥手
        • 2.4.1.全/半连接队列
        • 2.4.2.listen
        • 2.4.3.TIME_WAIT状态
      • 2.5.滑动窗口
        • 2.5.1.快重传
      • 2.6.流量控制
      • 2.7.拥塞控制
      • 2.8.延时应答
  • 3.IP协议解析
      • 3.1.报头解析
      • 3.2.网段划分
      • 3.3.子网掩码
      • 3.4.私有和公网IP
      • 3.5.路由
      • 3.6.IP分片
  • 4.数据链路层
      • 4.1.以太网
      • 4.2.mac帧格式
      • 4.3.mac地址和ip地址
      • 4.4.MTU
      • 4.5.ARP协议

1.UDP协议解析

1.1.定义

UDP即用户数据报协议是在传输层的一个无连接协议,UDP具有简单的报头格式和面向数据报的特点,特别适合对延迟敏感但容忍丢包的应用场景,如视频流、语音通信和在线游戏。

1.2.UDP报头

UDP的报头格式非常简单:

0 - 1516 - 31
16位源端口号 (Source Port)16位目标端口号 (Destination Port)
16位UDP长度 (Length)16位校验和 (Checksum)

UDP报头共8字节

  • 源端口:发送方的端口号,标识发送应用程序的进程。对于不需要回复的情况,可以设置为0。
  • 目标端口:接收方的端口号,用于确定数据报的接收进程。
  • 长度:包括UDP报头和数据部分在内的数据报总长度,最小为8字节(仅包含报头),最大为65535字节。
  • 校验和:用于校验数据在传输过程中是否损坏。如果校验失败,此报文直接丢弃。

在目标进程接收到UDP报文后,可根据16位UDP长度减去8字节的报头长度,找到数据所在的位置。16位标识UDP的长度因此报文限制传输报文大小为必须小于64k

1.3.特点

  • 无连接:UDP不建立连接,不维护连接状态,数据报的传输是独立的、无序的。这种无连接性降低了传输的复杂度,减少了开销。
  • 面向数据报:UDP以数据报为单位进行传输,每个数据报是一个独立的实体,不依赖于其他数据报。数据报在发送和接收过程中不会进行任何拆分和重组。每个数据报的长度是明确的,这使得UDP特别适合那些需要快速传输并且能容忍部分丢包的场景。
  • 无可靠性保证:UDP不保证数据的可靠传输,数据报可能会丢失、重复或乱序到达。因此,应用程序需要自己处理错误检测和恢复机制。
  • 较低的传输开销:由于UDP报头只有8个字节,且不需要维护连接状态,因此它比TCP等协议的开销要低,适合在网络拥塞较小且对实时性要求较高的应用中使用。

1.4.缓冲区

  • 发送缓冲区:UDP不会为数据报建立复杂的缓冲机制,因为UDP无序传输和没有重发机制,因此,UDP没有真正意义上的发送缓冲区,当应用程序调用操作系统的发送函数(如sendto())时,数据直接从应用程序传递到操作系统的网络栈,并在合适的时候立即发送到网络上。。
  • 接收缓冲区:UDP的数据报按到达顺序存储在接收缓冲区中,但不保证顺序。如果缓冲区已满新的数据报将被丢弃。因此,应用程序需要及时处理接收到的数据,防止缓冲区溢出。

2.TCP协议解析

2.1.定义

TCP(传输控制协议),提供可靠的、面向连接的通信服务。它通过建立连接、数据传输和连接终止的机制,确保数据能按顺序、无差错地从一端传送到另一端。

2.2.报头解析

在这里插入图片描述

  • 源端口号:发送端的端口号。
  • 目标端口号:接收端的端口号。
  • 序列号:发送方用来标记数据包顺序。
  • 确认号:接收方用来确认接收的下一个数据包序号。
  • 窗口大小:接收方可以容纳的最大字节数,控制数据流。
  • 校验和:用于检测传输中的数据错误。
  • 控制标志:包括SYN、ACK、FIN等,用于控制连接的建立、数据传输、终止等过程。
2.2.1.首部长度(4位)

TCP报头中有一个4位的数据偏移字段,也称为头部长度字段。它的基本单位是4字节,所以其能表示TCP报头的最大长度是15 × 4字节 = 60字节。在分离报头和有效载荷的时候,报头长度就是首部长度*4,报头之后的部分就是TCP的有效载荷。

2.2.2.窗口大小

在这里插入图片描述
当cs基于tcp协议进行通信时,他们传送的都是完整的tcp报文,但是我们知道缓冲区的大小是有限,我们怎么知道对方的缓冲区还有多少,来制定我要不要继续发送呢?因此在tcp报头中的16位窗口大小就标识了自己接受缓冲区的剩余大小

2.2.3.确认应答机制

每当一端(发送方)发送一个数据段时,接收方会在收到数据后发送一个确认应答报文(ACK),告知发送方已经成功接收到数据。发送方可以根据接收方的确认应答判断数据是否正确到达。如果长时间没有收到确认应答,发送方会重新发送数据段,这种机制保证了即使网络出现丢包,数据仍然可以最终传输成功。
TCP报头中的确认序号
在 TCP 报文头部的字段中,**确认号(Acknowledgment Number)**用于实现确认应答。这个字段表示接收方期望接收到的下一个字节的序号。假设发送方发送了一个字节序号为 1000 到 1500 的数据段,那么接收方在成功接收到该段数据后,确认号将被设置为 1501,表示它期待收到序号为 1501 的下一个字节。表示确认序号之前的数据,全部都收到了,下次从确认序号开始发送

2.2.4.6个标志位

在 TCP 报头中,有一个 6 位的标志字段,这些标志位用于控制 TCP 连接的状态和数据传输流程。它们分别是:URG、ACK、PSH、RST、SYN、FIN。下面将解析他们的含义:

  • ACK确认标志位,表示当前数据段中包含一个有效的确认号。如果该位被置为
    1,则确认号字段有效,表明接收方确认已接收到某个序列号之前的所有数据。只有在连接建立之后,每个 TCP 数据段都会携带 ACK 位。当 TCP 连接处于建立后的状态时,几乎所有的 TCP 报文段都将 ACK 位置为 1。比如,在三次握手过程的第二次和第三次握手中,ACK 位都为 1。
  • SYN 位用于建立 TCP 连接的初始阶段,请求建立连接。表示一个同步序列号的请求,用来开始 TCP 的三次握手过程。
  • FIN结束标志位用于优雅地关闭 TCP 连接,表示发送方已经完成数据传输,并希望终止连接。当某一方想关闭连接时,发送 FIN 标志位的报文,并等待对方的确认。TCP 连接关闭采用四次挥手,其中第一次挥手发送 FIN 报文,接收方接收到后会发送一个 ACK 确认,然后再发送自己的 FIN 报文,等待最终确认。FIN 标志位的设置是 TCP 连接终止的信号,它与四次挥手密切相关。
  • PSH推送标志位用于告诉接收方,发送方已经发送了一批完整的、需要立即交付给应用程序的数据,而不必等待更多数据。通过设置 PSH 位,发送方可以保证数据被立即处理。
  • RST复位标志位用于重置连接,当 RST 被置为 1 时,表示当前连接出现问题,需要立即中断或重置连接。
  • URG紧急指针标志位用来表示数据段中存在紧急数据,当该位被置为 1 时,表明 TCP 报文段中包含需要立即处理的紧急数据,接收方应优先处理这些数据。

2.3.超时重传机制

TCP 提供了超时重传机制,即当发送方在规定的时间内没有收到接收方的确认应答(ACK),会假设数据包丢失并重新发送数据段。
工作原理
在 TCP 连接中,发送方每发送一个数据段后,都会启动一个定时器,用于等待接收方的确认应答(ACK)。如果在指定时间内没有收到 ACK,TCP 认为数据段可能在传输过程中丢失,发送方将重传该数据段。这就是所谓的超时重传
那应该在多久的时间没有收到应答就重传呢?

在 TCP 协议的实现中,Linux 操作系统使用的超时重传时间RTO是根据网络的往返时间RTT动态调整的,没有一个固定的超时值。

初始 RTO 值:在 Linux 系统中,TCP 连接刚开始时,由于没有足够的历史数据来估算 RTT,RTO 会被设置为一个默认值。这个默认值通常为 1秒(1000毫秒)

动态调整:随着 TCP 连接的建立和数据传输,Linux 内核会根据 RTT 的测量结果不断调整 RTO 的值。一般来说,TCP 通过平滑的 RTT 估计值和 RTT 波动量来动态计算 RTO。
如果重传一定次数后,tcp会认为网络或对方主机出现问题,将会关闭连接。

2.4.三次握手四次挥手

客户端 服务器 SYN 1 SYN + ACK 2 ACK 3 客户端 服务器

三次握手是建立 TCP 连接的过程。它确保了客户端和服务器之间的连接是可靠的,并且可以开始传输数据。以下是三次握手的步骤:

  • SYN:客户端向服务器发送一个带有 SYN(同步)标志的包,请求建立连接。
  • SYN-ACK:服务器接收到 SYN 包后,回应一个带有 SYN 和 ACK(确认)标志的包(捎带应答),以确认客户端的请求。
  • ACK:客户端收到服务器的 SYN-ACK 包后,发送一个带有 ACK 标志的包,以确认服务器的回应。

其中三次握手也可以看成四次握手,在客户端向服务器发送SYN后 服务器将SYN和ACK捎带应答给了客户端。设定为三次握手的原因有:可以验证通信双方是否全双工,奇数次的握手将握手失败的成本嫁接到客户端,不对服务器产生影响。

四次挥手示意图

客户端 服务器 FIN 1 服务器接收到 FIN 包后,进入 FIN_WAIT_1 状态 ACK 2 客户端接收到 ACK 包后,进入 FIN_WAIT_2 状态 FIN 3 服务器接收到 FIN 包后,进入 TIME_WAIT 状态 ACK 4 客户端接收到 ACK 包后,进入 TIME_WAIT 状态 服务器接收到 ACK 包后,进入 CLOSED 状态 客户端在 TIME_WAIT 状态保持一段时间后,进入 CLOSED 状态 客户端 服务器

四次挥手是断开 TCP 连接的过程。它确保了数据传输完成后,连接被正确地关闭。以下是四次挥手的步骤:

  • FIN:客户端向服务器发送一个带有 FIN(结束)标志的包,请求断开连接。
  • ACK:服务器收到 FIN 包后,发送一个 ACK 包以确认客户端的断开请求。
  • FIN:服务器准备断开连接时,向客户端发送一个带有 FIN 标志的包
  • ACK:客户端收到服务器的 FIN 包后,发送一个 ACK 包以确认服务器的断开请求。
    这个过程确保了双方都正确地关闭了连接,避免了数据丢失。
2.4.1.全/半连接队列

在TCP协议中,全连接队列和半连接队列是两个重要的队列,用于管理TCP连接的建立过程。

半连接队列

  • 作用: 存储还未完成三次握手的连接请求。当一个客户端发起连接请求(SYN报文)时,服务器端的操作系统会将这个连接请求放入半连接队列中。
  • 状态: 这个队列主要是用来保存那些已经收到SYN报文、已经发送了SYN-ACK报文,但还没有收到ACK报文的连接。
  • 长度: 半连接队列的长度是有限的,通常由操作系统的配置决定。如果半连接队列满了,新的连接请求可能会被拒绝或丢弃。

全连接队列

  • 作用: 当三次握手完成后,连接会被移到全连接队列。全连接队列存储所有已经完成握手的连接,这些连接现在可以被应用程序接受(通常通过 accept() 系统调用)。
  • 状态: 这个队列的长度也是有限的,若全连接队列满了,新的连接请求会被拒绝或丢弃,直到有空间可用为止。
2.4.2.listen
int listen(int sockfd, int backlog);

backlog 参数
意义: backlog 参数控制全连接队列的长度。它告诉操作系统在连接处理期间可以积累多少个已完成三次握手的连接。
配置: 合理配置 backlog 的大小可以影响服务器的并发处理能力。如果 backlog 设置得过小,可能会导致合法的连接请求被拒绝,影响服务器的响应能力。如果设置得过大,则可能浪费系统资源。

2.4.3.TIME_WAIT状态

TIME_WAIT 状态概述

  • 定义: TIME_WAIT 是TCP连接的终止状态之一。它是连接关闭后,主动关闭一方进入的状态。
  • 作用: TIME_WAIT 状态确保所有的数据包都被正确处理,并防止旧的重复数据包在网络上出现。

进入 TIME_WAIT 状态的条件

  • 主动作关闭连接: 当一个TCP连接的主动关闭方(通常是客户端)发送了一个 FIN 报文,并收到对方的 FIN-ACK 报文后,该方会进入 TIME_WAIT 状态。
  • 协议要求: 根据TCP协议规范,主动关闭的一方在关闭连接后,必须保持 TIME_WAIT 状态一段时间,以确保对方的 FIN 报文被正确接收,并处理可能的重传。

TIME_WAIT 状态的持续时间

  • 持续时间: TIME_WAIT 状态通常会持续2倍的MSL(Maximum Segment Lifetime)。MSL是网络中数据包的最大生存时间,通常被设置为2分钟。因此,TIME_WAIT 状态的默认持续时间通常为4分钟。
  • 目的: 这个时间段的设置是为了确保所有的重传数据包都能被处理,避免在网络中出现已关闭连接的数据包。

TIME_WAIT 状态的作用

  1. 确保数据完整性: 通过等待,确保任何可能的重传的旧数据包被丢弃,避免数据混淆。
  2. 处理重传: 确保所有的 FIN 报文都被处理,并确保连接的正常终止。
  3. 避免端口重用问题: 避免在短时间内重新使用相同的端口号,防止新连接与旧连接数据混淆。也就是服务器主动关闭后,无法立即重启的原因

使用 setsockopt 实现服务器快速重启

  1. SO_REUSEADDR
  • 作用: 允许服务器在重启时重用地址和端口,即使端口仍处于 TIME_WAIT 状态。
  • 使用场景: 服务器程序需要快速重启并重新绑定到相同端口时,SO_REUSEADDR 选项可以防止端口被占用的问题。

2. SO_REUSEPORT (部分系统支持,如Linux)

  • 作用: 允许多个套接字绑定到同一个IP地址和端口。这个选项在多线程或多进程服务器中尤其有用。
  • 使用场景: 实现更高的并发能力,允许多个进程共享相同的端口。
int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &optval, sizeof(optval));

2.5.滑动窗口

什么是 TCP 滑动窗口?

TCP 滑动窗口是 TCP 协议中的一种流量控制机制,用于调节发送方和接收方之间的数据传输速度,以避免网络拥塞或接收方缓冲区溢出。滑动窗口的核心思想是,接收方通过告知发送方自己当前的接收能力,来动态调整数据传输速率。

滑动窗口的基本原理

1. 发送窗口

发送窗口是发送方维护的一个区域,它表示发送方允许发送但尚未确认的最大数据量。发送窗口由三个关键参数组成:

  • 已确认的字节:已经成功接收到的字节,这些字节不再需要重新传输。
  • 可发送的字节:可以发送的数据量,这部分数据已经进入滑动窗口,等待发送。
  • 未确认的字节:已发送但尚未收到确认的数据。

窗口的右端表示发送方可以发送的最大数据量,发送方根据接收方的反馈(窗口大小)和确认号来调整发送窗口的大小。
在这里插入图片描述

2. 窗口大小的动态调整

  • 发送方会根据接收方反馈的窗口大小调整自己的发送速率。当接收窗口较大时,发送方可以继续发送较多的数据;当接收窗口变小或为 0 时,发送方必须暂停数据发送,直到接收窗口重新增大。至少不能超过接受缓冲区的剩余空间大小。

3. 窗口的滑动

  • 当接收方确认接收到数据并释放缓冲区空间时,窗口会向前滑动。其实滑动窗口可以看成用双指针在数组维护的一段空间,前指针根据确认序号向右滑动,后指针根据确认序号+min(接受缓冲区剩余大小,有效数据,拥塞窗口) 这块我们后面再讲。
|----------------|----------------|----------------|
已确认数据       可发送数据        未确认数据
|----------------|----------------|----------------|<-左边界->      <-滑动窗口->      <-右边界->      
2.5.1.快重传

快速重传是 TCP 的一种优化机制,用于在不等待超时的情况下快速检测并重新传输丢失的数据包。它是 TCP 的可靠传输机制拥塞控制机制中的重要部分。通过快速重传,TCP 可以在不依赖超时重传的情况下,尽快恢复丢失的数据包,进而提高传输效率。

快速重传的背景

在 TCP 协议中,发送方发送数据后,接收方会对每个数据包进行确认(ACK)。通常,接收方会返回一个确认号(ACK),表示它已经成功接收到的数据序列号的下一个字节。

然而,在网络传输中,某些数据包可能会因为网络问题或拥塞而丢失。通常情况下,发送方会等待一个超时事件来判断数据包是否丢失,超时后会重新发送该数据包。但这可能导致不必要的延迟。为了解决这个问题,TCP 引入了快速重传机制。

快速重传的工作机制

  1. 三次重复 ACK 的概念

当接收方检测到一个数据包丢失时,它不能立即发送该丢失数据包的确认,而是会重复发送前一个已经成功接收的 ACK(称为“重复确认”)。例如:

  • 发送方发送了数据包 1、2、3 和 4;
  • 接收方成功接收到数据包 1,但数据包 2 丢失;
  • 当接收方接收到数据包 3 时,它会重复发送数据包 1 的 ACK(也就是 ACK 2),表明仍然在等待数据包 2。

如果发送方收到连续三个重复的 ACK(总共四个相同的 ACK),它就会意识到某个数据包可能已经丢失,而无需等待超时。此时,发送方会立即重新传输丢失的数据包,而不是等待超时事件。

  1. 工作流程

以发送方发送多个数据包为例,展示快速重传的流程:

发送方: [发送数据包 1][发送数据包 2][发送数据包 3]...[发送数据包 N]

接收方: [收到数据包 1]...[收到数据包 3][发现数据包 2 丢失] -> [发送ACK 1][发送ACK 1][发送ACK 1]

发送方收到三个相同的 ACK 1 后 -> [快速重传数据包 2]

2.6.流量控制

流量控制的工作原理

  • 初始传输:TCP 连接建立后,接收方会通过窗口大小告知发送方自己当前能够接收的数据量。发送方在传输数据时,会根据这个窗口大小控制传输速率。
  • 动态调整:在传输过程中,接收方会根据自身的缓冲区情况不断调整接收窗口。当接收方缓冲区逐渐被填满,窗口大小会逐渐减小,直到降为零,发送方就会停止发送数据,等待窗口重新打开。
  • 暂停与恢复:当接收方处理了已接收的数据并释放了缓冲区空间,窗口大小会增加,发送方收到新的 ACK 后,就可以继续发送新的数据包。

接受和发送缓冲区有限,根据实际情况,控制发送速度的大小就是流量控制。

2.7.拥塞控制

TCP 拥塞控制是 TCP 协议中的一项重要机制,用于防止网络因数据流量过大而发生拥塞。

  1. 拥塞窗口(Congestion Window, cwnd)

拥塞控制的核心是拥塞窗口,它限制了发送方在未经确认的情况下可以发送的最大数据量。与流量控制中的接收窗口不同,拥塞窗口是根据网络状况动态调整的。

  1. 拥塞控制的四个阶段

TCP 拥塞控制通常分为以下四个阶段:

  • 慢启动:TCP 连接初始阶段,拥塞窗口从较小的值开始,发送方每收到一个 ACK,拥塞窗口的大小就会指数级增长,直到达到慢启动门限或检测到网络拥塞。

  • 拥塞避免:当拥塞窗口达到慢启动门限后,TCP 进入拥塞避免阶段,此时拥塞窗口的增长速度变为线性增长,逐步增加数据发送量,直到再次检测到拥塞。

  • 快速重传:当发送方收到三个重复的 ACK 时,推测某个数据包丢失,不等待超时,立即重传丢失的数据包,尽快恢复传输。

  • 快速恢复:在快速重传之后,TCP 并不立即进入慢启动阶段,而是进入快速恢复,通过减少拥塞窗口的大小,同时加快数据重传,以保持网络性能的稳定。

在这里插入图片描述

2.8.延时应答

在TCP协议中,为了提高网络效率和减少ACK报文的数量,接收方可以使用一种称为“延时应答”的机制。
延时应答是一种优化手段,它允许接收方在收到数据包后不立即发送ACK,而是等待一段时间(通常为40~200毫秒)。在这段时间内,接收方可能会接收到更多的数据包,这样可以将多个ACK合并为一个,从而减少ACK的总数量。

当接收方收到一个数据包时,它启动一个计时器,并暂时不发送ACK。在这段等待时间内,接收方可以执行以下操作:

  • 接收更多数据:如果在计时器时间内接收到更多数据包,接收方可以在一个ACK报文中确认所有数据包。
  • 合并ACK:将ACK与数据包一起发送,减少独立的ACK报文数量。
  • 计时器到期:如果计时器到期且没有新数据需要发送,接收方将发送ACK报文确认收到的数据。

3.IP协议解析

3.1.报头解析

在这里插入图片描述

  • 版本 (4位)指示IP协议的版本。对于IPv4,这个字段的值是4。
  • IP头部长度,表示IP头部的长度,单位为32位字(4字节)。最小值为5,表示20字节。
  • 服务类型 (8位),用于指示数据包的优先级和服务质量。
  • IP数据包的总长度,包括头部和数据部分,单位为字节。最大值为65535字节。
  • 标识符 (16位)唯一标识符,用于标识数据包的分片。用于将分片的报文重新组装成完整的报文。
  • 标志 (3位)用于指示数据包是否可以分片及是否还有更多的分片:
  • 分片偏移 (13位)数据包的分片偏移量,表示当前分片在原始数据包中的位置。单位为8字节。
  • 生存时间 (8位),表示数据包在网络中能够存在的最大跳数。每经过一个路由器,该值会减少1,当TTL值减至0时,数据包将被丢弃。
  • 协议 (8位)指示数据包中的有效负载所使用的上层协议。例如,TCP协议的值为6,UDP协议的值为17。
  • 头部校验和 (16位)用于验证IP头部是否有错误。发送端计算并填入这个字段,接收端进行校验。
  • 源地址 (32位)发送数据包的设备的IP地址。
  • 目标地址 (32位)接收数据包的设备的IP地址
  • 选项 (0-40字节可选)可选字段,用于扩展功能,如时间戳、路由记录等。如果没有选项,这部分的长度为0。

3.2.网段划分

  • 网络号 : 这是用于识别网络的部分。例如,192.168.1.0 是网络号,它标识了一个特定的子网。
  • 主机号 : 这是用于识别网络内具体设备的部分。例如,192.168.1.1192.168.1.254 是可用的主机地址范围。

通过这种划分方式,可以在同一网络中管理多个子网,并有效利用IP地址资源。

3.3.子网掩码

在计算机网络中,子网掩码是一个用于定义IP地址中网络部分和主机部分的工具。它通过与IP地址进行按位与操作来帮助确定网络的范围。

  1. 子网掩码的基本概念
    子网掩码是一个32位的二进制数,通常以点分十进制表示。例如,常见的子网掩码有 255.255.255.0。在子网掩码中,前面的1表示网络部分,后面的0表示主机部分。这个掩码用于将IP地址划分为网络地址和主机地址两个部分。

  2. 子网掩码的作用
    确定网络地址:子网掩码帮助确定一个IP地址所属于的网络。通过与IP地址进行按位与操作,可以得到网络地址。
    划分子网:在较大的网络中,子网掩码可以帮助将网络划分为多个子网,以提高网络管理的灵活性和安全性。

  3. 子网掩码的计算
    假设有一个IP地址 192.168.1.10 和子网掩码 255.255.255.0。我们可以按以下步骤计算网络地址:

怎么用ip地址和子网掩码计算子网地址范围

1. 确定 IP 地址和子网掩码

假设你有以下 IP 地址和子网掩码:

  • IP 地址: 192.168.1.10
  • 子网掩码: 255.255.255.0

2. 将 IP 地址和子网掩码转换为二进制格式

  • IP 地址: 192.168.1.10

    • 二进制: 11000000.10101000.00000001.00001010
  • 子网掩码: 255.255.255.0

    • 二进制: 11111111.11111111.11111111.00000000

3. 计算网络号

将 IP 地址和子网掩码按位进行与操作(AND 操作):

  • IP 地址: 11000000.10101000.00000001.00001010
  • 子网掩码: 11111111.11111111.11111111.00000000
  • 网络号: 11000000.10101000.00000001.00000000

转换回十进制,网络号是:192.168.1.0

4. 计算广播地址

广播地址是将网络号的主机部分(即子网掩码中为0的部分)全部设置为1。

  • 网络号: 11000000.10101000.00000001.00000000
  • 广播地址: 11000000.10101000.00000001.11111111

转换回十进制,广播地址是:192.168.1.255

5. 计算子网地址范围

  • 子网起始地址(网络号 + 1):192.168.1.1
  • 子网结束地址(广播地址 - 1):192.168.1.254

总结

对于 IP 地址 192.168.1.10 和子网掩码 255.255.255.0:

  • 网络号: 192.168.1.0
  • 广播地址: 192.168.1.255
  • 子网地址范围: 从 192.168.1.1 到 192.168.1.254

3.4.私有和公网IP

在网络技术中,IP 地址是设备在网络中进行通信的基础。IP 地址可以分为公网 IP 和私有 IP。
公网 IP 地址(公网 IP 地址可以被互联网上的任何设备访问

  • 特点
    • 唯一性:每个公网 IP 地址在全球范围内是唯一的。
    • 可被外部访问:公网 IP 地址可以被互联网上的其他设备直接访问。

私有 IP 地址是用于局部网络中的设备识别和通信的地址。私有 IP 地址只能在同一局域网(LAN)内有效,不会在互联网上直接使用。私有 IP 地址通常由网络管理员手动分配或通过 DHCP 自动分配,用于家庭、公司或校园网络中的设备。

  • 特点

    • 非唯一性:同一私有 IP 地址可以在不同的局域网中重复使用。
    • 内部使用:私有 IP 地址不可被外部互联网直接访问,需要通过网络地址转换(NAT)技术进行互联网访问。
  • 私有 IP 地址范围

    • 10.0.0.0 到 10.255.255.255(/8 子网)
    • 172.16.0.0 到 172.31.255.255(/12 子网)
    • 192.168.0.0 到 192.168.255.255(/16 子网)

为了连接到互联网,私有 IP 地址的设备需要通过 NAT 技术将内部网络的私有 IP 地址映射到公网 IP 地址。

  • NAT 技术:网络地址转换(NAT)是一种允许多个设备通过一个公网 IP 地址访问互联网的技术。NAT 设备(如路由器)在数据包中修改源地址和目标地址,从而实现内部网络与互联网之间的通信。

3.5.路由

在这里插入图片描述
模拟一下一台主机是怎么访问到公网内的一个服务器的:
在这里插入图片描述
私有ip是不允许暴露在公网中的,所以需要根据路由不断转换。这种私有IP不断准换的过程就是NAT技术(为了结局ip地址不足问题)

路由表

在路由表中,各个字段的解析可以帮助我们更好地理解网络流量的路由方式。以下是路由表的一些关键字段及其解析:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
  • Destination: 目标网络地址。
  • Gateway: 网关地址,数据包应送往的地址。
  • Genmask: 子网掩码,用于确定目标地址的网络部分。
  • Flags: 路由标志,表明路由的状态和类型。
  • Metric: 路由的优先级,值越小优先级越高。
  • Ref: 路由的引用次数。
  • Use: 路由被使用的次数。

3.6.IP分片

在这里插入图片描述
上图中16位标识符标识主机发送的报文,如果ip报文在网络层被分片了,那每一个分片的标识符是相同的。
3位标志:

  • 第0位(保留位):这个位是保留位,通常设置为0,未来可能用于新的扩展或协议更新。
  • 第1位(DF位 - Don’t Fragment):该位用于指示数据报是否可以被分段。若DF位为1,则表示该数据报不能被分段;若为0,则允许分段。
  • 第2位(MF位 - More Fragments):该位指示数据报是否还有后续的片段。如果MF位为1,表示数据报有更多的片段;若为0,则说明这是最后一个片段或数据报不需要分段。

片偏移
片偏移字段占13位,用于指示数据报中某一片段的起始位置。该字段的单位是8字节(64位),即片偏移值的实际字节位置是该值乘以8。片偏移值:该值表示当前片段相对于原始数据报开始的偏移量。例如,如果片偏移字段的值为1000,则表示该片段在原始数据报中的偏移量为1000 * 8 = 8000字节。

IP分片是为了应对不同网络传输介质的**最大传输单元(MTU)**的限制。当一个IP数据报的大小超过网络的MTU时,就需要进行分片,将数据报切割成多个较小的片段以便传输,直到到达目的地后再由接收端进行重组。
即使这样我们依旧不建议分片,因为将一个报文分成多片增加丢失的概率。任何一个分片丢失都需要重新发送。

4.数据链路层

数据链路层是计算机网络体系结构中的第二层,负责在直接连接的网络节点之间提供可靠的数据传输服务。它的主要任务是将网络层传送的数据封装成帧,并在物理网络上进行传输。数据链路层不仅处理数据的封装和解封装,还负责错误检测、流量控制以及帧的顺序管理。

4.1.以太网

太网是最广泛使用的局域网(LAN)技术之一,它提供了在局域网内进行数据通信的基础框架。以太网在数据链路层工作,通过物理层的介质将数据帧从一个设备传输到另一个设备。

以太网的基本架构

  • 网帧:数据在以太网上传输的基本单位,包含头部、数据和尾部。
  • MAC地址:每个以太网设备都有一个唯一的MAC地址,用于标识设备。
  • 物理层:以太网通过物理介质(如双绞线、光纤)传输信号。

4.2.mac帧格式

| Preamble       | SFD            | 目的MAC地址        | 源MAC地址         | 类型/长度       | 数据           | 填充(可选)   | FCS            |
| (7字节)        | (1字节)        | (6字节)            | (6字节)            | (2字节)        | (46-1500字节)  | (0-46字节)     | (4字节)        |
+----------------+----------------+-------------------+-------------------+----------------+----------------+----------------+----------------+

其中源目的MAC地址不必多说,类型字段可代码IP报文/ARP/RARP请求应答。帧校验序列(FCS, 4字节):包含循环冗余校验(CRC)值,用于确保数据帧在传输过程中未发生错误。如果校验不通过,帧将被丢弃。

4.3.mac地址和ip地址

在计算机网络中,MAC地址IP地址是两个至关重要的概念,它们用于标识网络中的设备,但作用、层级和特点有所不同。通过理解它们的差异,可以更好地掌握网络的工作原理。

1. MAC地址

  • 全称:媒体访问控制地址(Media Access Control Address)
  • 层次:数据链路层(第二层)
  • 长度:48位(二进制),通常表示为12位十六进制(如:00:1A:2B:3C:4D:5E
  • 作用:标识设备的物理地址。每个网络接口卡(NIC)在生产时都会被分配一个唯一的MAC地址,通常不会发生改变,类似设备的“硬件身份证”。
  • 使用范围:MAC地址仅在局域网内有效,用于在同一个网络中进行设备之间的通信。
  • 特点:唯一性和不可更改性。由于是硬件固化的,MAC地址不随设备的网络位置而变化。

2. IP地址

  • 全称:互联网协议地址(Internet Protocol Address)
  • 层次:网络层(第三层)
  • 长度:IPv4为32位(如:192.168.0.1),IPv6为128位(如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
  • 作用:标识设备在网络中的逻辑位置,通常与网络位置相关联。IP地址可以随着设备接入不同的网络而变化。
  • 使用范围:全球范围使用。IP地址是设备在网络中的“逻辑地址”,用于跨网络传输数据。
  • 特点:可配置和可变动。设备接入网络时通常由路由器或DHCP服务器分配一个IP地址。

在这里插入图片描述

4.4.MTU

MTU解析

MTU是网络中能够传输的最大数据包大小。它指的是一个网络接口或传输媒介所能传输的单个帧的最大字节数,超过此值的报文将会被分片处理

1. MTU的工作原理

当主机通过网络发送数据时,数据首先会被拆分为多个小的数据块或报文。每个数据块都要通过网络中的某个链路传输,而链路上的MTU决定了每个报文的最大大小。如果报文超过了链路的MTU限制,则该报文将被分片,以适应MTU的要求。

2. 常见MTU值

不同的网络类型有不同的默认MTU值:
在这里插入图片描述

由于MTU的存在对于较大的IP报文需要分片,到达对端后再将小包顺序重组,拼装到一起返回给传输层。

使用ifconfig 可以查看mtu:
在这里插入图片描述

4.5.ARP协议

ARP协议解析

ARP是用于IPv4网络中的一种协议,主要作用是在已知IP地址的情况下获取对应设备的MAC地址。ARP协议工作在OSI模型的网络层数据链路层之间,确保数据链路层能够根据IP地址找到设备的物理地址,以便在局域网内实现数据通信。

1. ARP的工作原理

当主机需要向同一局域网中的另一个设备发送数据时,它需要知道对方的MAC地址,但通常只有对方的IP地址。此时,ARP协议通过广播机制,帮助主机找到目标设备的MAC地址:

  • 主机发送ARP请求:主机向局域网中广播一个ARP请求帧,询问“谁是这个IP地址的拥有者?”。
  • 目标主机响应ARP请求:具有该IP地址的设备接收到广播后,向请求方发送ARP响应,告知自己的MAC地址。
  • 缓存结果:主机收到响应后,将IP地址和MAC地址的映射关系存储在本地的ARP缓存中,避免频繁的ARP查询。

2. ARP报文结构

ARP协议使用特定的格式来封装请求和响应报文,ARP报文包含以下字段:
在这里插入图片描述

** 字段详细解析**

  1. 硬件类型
    指定使用的链路层协议类型。以太网的硬件类型值为1,代表以太网标准。

  2. 协议类型
    指定要解析的协议类型,ARP通常用于IPv4,因此其值为0x0800,表示IP协议。

  3. 硬件地址长度
    表示硬件地址(MAC地址)的长度,通常为6字节(以太网MAC地址的长度)。

  4. 协议地址长度
    表示协议地址(IP地址)的长度,IPv4地址长度为4字节。

  5. 操作码
    表示ARP报文的类型,有两个常见操作码:

    • 1 表示ARP请求(ARP Request)
    • 2 表示ARP响应(ARP Reply)
  6. 发送方MAC地址(Sender Hardware Address, 6字节)
    在ARP请求中,指发送请求的设备的MAC地址。在ARP响应中,指发送响应设备的MAC地址。

  7. 发送方IP地址(Sender Protocol Address, 4字节)
    表示ARP报文的发送方IP地址,在请求和响应中都有这个字段。

  8. 目标MAC地址(Target Hardware Address, 6字节)
    在ARP请求中,这个字段通常为空(未填充),因为请求方还不知道目标设备的MAC地址。在ARP响应中,该字段包含请求方希望获取的目标设备的MAC地址。

  9. 目标IP地址(Target Protocol Address, 4字节)
    表示ARP请求或响应报文的目标设备IP地址。请求方希望找到该IP地址对应的MAC地址。

ARP协议工作流程图

以下是ARP协议的工作流程,展示了设备如何通过ARP协议将IP地址解析为MAC地址。

+-------------------------------+
|  主机A有目标IP地址,但没有MAC地址 |
+-------------------------------+|v
+-------------------------------+
|   主机A在局域网内发送ARP请求    |
| 广播消息:“谁拥有此IP地址?”    |
+-------------------------------+|v
+-------------------------------------------------+
|  所有主机收到广播请求,检查自己的IP地址是否匹配  |
+-------------------------------------------------+|v
+------------------------------------+
| 如果某主机B的IP地址与请求匹配,则  |
|    主机B发送ARP响应给主机A         |
|  包含自己的MAC地址                 |
+------------------------------------+|v
+------------------------------------+
|     主机A接收到主机B的ARP响应       |
|     将主机B的IP地址和MAC地址映射   |
|     存储在ARP缓存中                 |
+------------------------------------+|v
+------------------------------+
|   主机A使用获取的MAC地址      |
|  向主机B发送数据帧            |
+------------------------------+

在这里插入图片描述
arp补充知识
主机的ip和mac地址以及通信过的主机地址都会被临时缓存起来,arp只有在缓存失效的时候才会进行,可以通过ip和子网掩码的到网络号后,广播所有主机获得他的ip和mac地址,如果收到多次相同的arp会以最新的为准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428687.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加速开发体验:为 Android Studio 设置国内镜像源

Android Studio 是由 JetBrains 开发的一个官方 IDE&#xff0c;用于 Android 应用开发。由于网络原因&#xff0c;直接从 Google 的服务器下载可能会比较慢或者不稳定。幸运的是&#xff0c;我们可以通过配置国内镜像源来加速下载和更新。 文章目录 &#x1f4af; 修改 Gradle…

Python 从入门到实战23(属性property)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要&#xff1a;本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性&#xff0c;着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究&#xff0c;强调了针对社群用户量身定制活动时机的必要性&#xff0c…

GD32F103单片机-EXTI外部中断

GD32F103单片机-EXTI外部中断 一、EXTI及NVIC介绍二、编程实验2.1 相关库函数2.2 实验代码 一、EXTI及NVIC介绍 GD32和STM32的EXTI基本相似&#xff0c;具体见STM32F1单片机-外部中断GD32的EXTI包括20个相互独立的边沿检测电路请求产生中断或事件&#xff0c;4位优先级配置寄存…

C++中的new与delete

目录 1.简介 2.底层 1.简介 new是升级版的malloc&#xff0c;它会先开空间再去调用构造函数。 delete是升级版的free&#xff0c;它会先调用析构函数再free掉空间。 class A { public:A(int a10, int b10){a a1;b b1;}private:int a;int b; };int main() {//new会先开空间…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计0. 前言1. XXE代码审计【有1处】1.1. 搜索JRXmlLoader1.1.1. JRAntApiWriteTask1.1.2. JRAntUpdateTask1.1.3. TableReportContextXmlRule1.1.4. JasperCompileManager【存在漏洞】 1.2. 搜索XMLReader1.2…

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…

Qt (19)【Qt 线程安全 | 互斥锁QMutex QMutexLocker | 条件变量 | 信号量】

阅读导航 引言一、互斥锁1. QMutex&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;使用示例基本需求⭕thread.h⭕thread.cpp⭕widget.h⭕widget.cpp 2. QMutexLocker&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;使用示例 3. QReadWriteLocker、QR…

string类(C++)

哈喽各位&#xff01;&#xff0c;久违了&#xff0c;最近怎么样捏&#xff0c;本次进入C的string类&#xff0c;加油加油呀&#xff01; 随记&#xff1a;鼓励创新&#xff0c;宽容失败&#xff01; 1.标准库的string类 1.1string类的了解 string的文献参考链接-->strin…

Buck变换器闭环控制,simulink仿真模型(适合初学者学习)

Buck变换器&#xff0c;又称为降压斩波器&#xff0c;是一种常见的DC-DC转换器&#xff0c;广泛应用于电源管理领域。它通过开关元件&#xff08;通常是MOSFET或BJT&#xff09;的导通与截止&#xff0c;改变输入电压到负载的平均电压&#xff0c;从而实现电压的降低。在实际应…

828华为云征文——使用Flexus云服务器X实例CentOS镜像下创建MySQL服务器教程

一、概述 1.1 前言 当前正值华为云盛大的828 B2B企业庆典&#xff0c;其中Flexus X实例的特惠活动尤为吸引人眼球。对于追求极致算力表现&#xff0c;并期望在自建MySQL数据库、Redis缓存系统及Nginx服务器部署上获得卓越性能的企业用户而言&#xff0c;这无疑是一个不可多得的…

SpringCloud (1) 服务拆解

1 服务拆解和治理 1.1 服务拆解 微服务的核心就是服务拆分,将传统的大项目拆分为多个微型服务(服务或微服务),实现服务之间"高内聚(微服务职责单一),低耦合(微服务功能相对独立)"的目的 (1) 水平(横向)拆分:先搭出拆分框架,比如【公共服务】(比如:common服务,client…

Python数据分析与可视化(Python绘图详解)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

轻量级流密码算法Trivium

轻量级流密码算法Trivium 0x0 Trivium算法简介 Trivium算法是由C&#xff0e;D Canniere和B&#xff0e;Preneel共同设计的一套对称加密算法&#xff0c;Trivium密码算法采用了分组密码和非线性反馈移位寄存器的设计思路。该密码算法总共288比特的内部状态&#xff0c;其中有…

数据篇| 关于Selenium反爬杂谈

友情提示:本章节只做相关技术讨论, 爬虫触犯法律责任与作者无关。 LLM虽然如火如荼进行着, 但是没有数据支撑, 都是纸上谈兵, 人工智能的三辆马车:算法-数据-算力,缺一不可。之前写过关于LLM微调文章《微调入门篇:大模型微调的理论学习》、《微调实操一: 增量预训练(Pretrai…

【手撕算法】快速排序(递归分治法)Python实现

一、算法 class Solution:def Partition(self, nums, low, high):pivotkey nums[low] # 元素copied, nums[low]空了出来while low < high:while low < high and nums[high] > pivotkey:high high - 1 # 直到找到一个nums[high]<pivotkey位置nums[low] nums[h…

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注&#xff1a;每个版本的补充离散库不一定相同&#xff0c;也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…

学生护眼台灯哪个品牌比较好?五款性价比高的学生护眼台灯

现在的孩子学习压力很大&#xff0c;在学校课程已经塞满了大半天&#xff0c;课后的作业更是不少&#xff0c;空闲时间还需要去课后补习班的数不胜数。用眼的次数非常的高&#xff0c;眼睛很容易感到疲惫&#xff0c;这时候我们一个宝贝大有作用&#xff0c;就是我们的护眼台灯…

软件测试 BUG 篇

目录 一、软件测试的生命周期 二、BUG 1. bug的概念 2. 描述bug的要素 3. bug的级别 4. bug的生命周期 5. 与开发产生争执怎么办&#xff1f;&#xff08;面试高频考题&#xff09; 5.1 先检查自身&#xff0c;是否bug描述不清楚 5.2 站在用户角度考虑并抛出问题 5.3 …

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一&#xff1a;子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二&#xff1a;显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…