网络协议全景: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 - 15 | 16 - 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.三次握手四次挥手
三次握手是建立 TCP 连接的过程。它确保了客户端和服务器之间的连接是可靠的,并且可以开始传输数据。以下是三次握手的步骤:
- SYN:客户端向服务器发送一个带有 SYN(同步)标志的包,请求建立连接。
- SYN-ACK:服务器接收到 SYN 包后,回应一个带有 SYN 和 ACK(确认)标志的包(捎带应答),以确认客户端的请求。
- ACK:客户端收到服务器的 SYN-ACK 包后,发送一个带有 ACK 标志的包,以确认服务器的回应。
其中三次握手也可以看成四次握手,在客户端向服务器发送SYN后 服务器将SYN和ACK捎带应答给了客户端。设定为三次握手的原因有:可以验证通信双方是否全双工,奇数次的握手将握手失败的成本嫁接到客户端,不对服务器产生影响。
四次挥手示意图
四次挥手是断开 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
状态的作用
- 确保数据完整性: 通过等待,确保任何可能的重传的旧数据包被丢弃,避免数据混淆。
- 处理重传: 确保所有的
FIN
报文都被处理,并确保连接的正常终止。 - 避免端口重用问题: 避免在短时间内重新使用相同的端口号,防止新连接与旧连接数据混淆。也就是服务器主动关闭后,无法立即重启的原因
使用 setsockopt
实现服务器快速重启
- 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 引入了快速重传机制。
快速重传的工作机制
- 三次重复 ACK 的概念
当接收方检测到一个数据包丢失时,它不能立即发送该丢失数据包的确认,而是会重复发送前一个已经成功接收的 ACK(称为“重复确认”)。例如:
- 发送方发送了数据包 1、2、3 和 4;
- 接收方成功接收到数据包 1,但数据包 2 丢失;
- 当接收方接收到数据包 3 时,它会重复发送数据包 1 的 ACK(也就是 ACK 2),表明仍然在等待数据包 2。
如果发送方收到连续三个重复的 ACK(总共四个相同的 ACK),它就会意识到某个数据包可能已经丢失,而无需等待超时。此时,发送方会立即重新传输丢失的数据包,而不是等待超时事件。
- 工作流程
以发送方发送多个数据包为例,展示快速重传的流程:
发送方: [发送数据包 1][发送数据包 2][发送数据包 3]...[发送数据包 N]
接收方: [收到数据包 1]...[收到数据包 3][发现数据包 2 丢失] -> [发送ACK 1][发送ACK 1][发送ACK 1]
发送方收到三个相同的 ACK 1
后 -> [快速重传数据包 2]
2.6.流量控制
流量控制的工作原理
- 初始传输:TCP 连接建立后,接收方会通过窗口大小告知发送方自己当前能够接收的数据量。发送方在传输数据时,会根据这个窗口大小控制传输速率。
- 动态调整:在传输过程中,接收方会根据自身的缓冲区情况不断调整接收窗口。当接收方缓冲区逐渐被填满,窗口大小会逐渐减小,直到降为零,发送方就会停止发送数据,等待窗口重新打开。
- 暂停与恢复:当接收方处理了已接收的数据并释放了缓冲区空间,窗口大小会增加,发送方收到新的 ACK 后,就可以继续发送新的数据包。
接受和发送缓冲区有限,根据实际情况,控制发送速度的大小就是流量控制。
2.7.拥塞控制
TCP 拥塞控制是 TCP 协议中的一项重要机制,用于防止网络因数据流量过大而发生拥塞。
- 拥塞窗口(Congestion Window, cwnd)
拥塞控制的核心是拥塞窗口,它限制了发送方在未经确认的情况下可以发送的最大数据量。与流量控制中的接收窗口不同,拥塞窗口是根据网络状况动态调整的。
- 拥塞控制的四个阶段
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.1
到192.168.1.254
是可用的主机地址范围。
通过这种划分方式,可以在同一网络中管理多个子网,并有效利用IP地址资源。
3.3.子网掩码
在计算机网络中,子网掩码是一个用于定义IP地址中网络部分和主机部分的工具。它通过与IP地址进行按位与操作来帮助确定网络的范围。
-
子网掩码的基本概念
子网掩码是一个32位的二进制数,通常以点分十进制表示。例如,常见的子网掩码有 255.255.255.0。在子网掩码中,前面的1表示网络部分,后面的0表示主机部分。这个掩码用于将IP地址划分为网络地址和主机地址两个部分。 -
子网掩码的作用
确定网络地址:子网掩码帮助确定一个IP地址所属于的网络。通过与IP地址进行按位与操作,可以得到网络地址。
划分子网:在较大的网络中,子网掩码可以帮助将网络划分为多个子网,以提高网络管理的灵活性和安全性。 -
子网掩码的计算
假设有一个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
,代表以太网标准。 -
协议类型
指定要解析的协议类型,ARP通常用于IPv4,因此其值为0x0800
,表示IP协议。 -
硬件地址长度
表示硬件地址(MAC地址)的长度,通常为6字节(以太网MAC地址的长度)。 -
协议地址长度
表示协议地址(IP地址)的长度,IPv4地址长度为4字节。 -
操作码
表示ARP报文的类型,有两个常见操作码:1
表示ARP请求(ARP Request)2
表示ARP响应(ARP Reply)
-
发送方MAC地址(Sender Hardware Address, 6字节)
在ARP请求中,指发送请求的设备的MAC地址。在ARP响应中,指发送响应设备的MAC地址。 -
发送方IP地址(Sender Protocol Address, 4字节)
表示ARP报文的发送方IP地址,在请求和响应中都有这个字段。 -
目标MAC地址(Target Hardware Address, 6字节)
在ARP请求中,这个字段通常为空(未填充),因为请求方还不知道目标设备的MAC地址。在ARP响应中,该字段包含请求方希望获取的目标设备的MAC地址。 -
目标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会以最新的为准。