千兆以太网@——帧格式

千兆以太网@------帧格式

一、以太网帧格式

前导码 :实现同步,7个0x55;

帧起始界定符(SFD,Start Frame Delinmiter):固定0xD5,表明一帧的起始;

1、以太网帧头

以太网帧头固定14字节,包含6字节目的MAC地址、6字节源目的MAC地址和2字节长度/类型。

目的MAC地址 :分为单播、组播、广播。单播地址:第一个字节的最低位为0;组播地址:第一个字节最低为为1;广播地址:48bit全为1

源MAC地址 :发送端的物理MAC地址;

长度/类型:两个字节小于1536(0x0600)时,表示以太网中数据段的长度;两个字节大于1536时,表示以太网中的数据数据哪个长层协议,如0x0800表示IP协议IPv4:,0x0806表示ARP协议;IPv6: 0x86DD;

2、数据段

数据:以太网中数据最小46个字节,最大1500个字节。

3、FCS

帧检验序列(FCS,Frame Check Sequence):4个字节的循环冗余校验(CRC),校验的数据不包含前导码和帧起始界定符,采用CRC32。

在线计算工具: CRC在线计算,算法选中CRC-32.

4、帧间隙

帧间隙(IFG,Interpacket Gap):以太网相邻之间的时间间隔,网络设备和组件在接收一帧之后,需要短暂的时间恢复并为接收下一帧做准备的时间。IFG最小时间为96bit time,即在媒介中发送96位数据所需要的时间;不同速率下IFG的最小间隔如下:

10Mbit/s最小时间:96100ns = 9600ns;
100Mbit/s最小时间:96
10ns = 960ns;

1000Mbit/s最小时间:96*1ns = 96ns;

二、ARP

长度/类型为0x0806表示ARP协议;

ARP(Address Resolution Protocol,地址解析协议)是一种用于将网络层地址(如 IP 地址)解析为数据链路层地址(如 MAC 地址)的协议。

ARP 在局域网(LAN)中广泛使用,帮助设备在通信时确定目标设备的物理地址。

1、ARP 请求

当设备需要与目标设备通信时,如果不知道目标设备的 MAC 地址,它会发送一个 ARP 请求广播包,询问"谁拥有这个 IP 地址?"。

发送方广播 ARP 请求包,询问目标 IP 地址对应的 MAC 地址。局域网中的所有设备都会收到该请求。

2、ARP 响应

如果某个设备发现自己的 IP 地址与 ARP 请求中的目标 IP 地址匹配,它会发送一个 ARP 响应包,告知自己的 MAC 地址。

接收方发送 ARP 响应包,告知自己的 MAC 地址。

ARP 响应包是单播的,只发送给请求方。

3、ARP 缓存

发送方在收到 ARP 响应后,会将 IP 地址和 MAC 地址的映射关系存储在本地 ARP 缓存中,以便后续通信时直接使用

ARP 缓存会定期更新或过期,以确保映射关系的准确性。

4、ARP 的关键特性

IP 地址到 MAC 地址的映射 :将网络层地址解析为数据链路层地址。

广播请求和单播响应 :使用广播发送 ARP 请求,使用单播发送 ARP 响应。

ARP 缓存 :存储 IP 地址和 MAC 地址的映射关系,减少重复的 ARP 请求。

局域网内使用:ARP 主要用于局域网中,不适用于跨网络通信。

三、IP协议

1、IP协议帧


版本 :IPv4 or IPv6;IPv4的地址是4个字节,即为0100,IPv6是6个字节,即0110;

首部长度 :指的是IP首部一共有多少个4个字节(以4个字节为单位),如果不包含可选字段,这里就填写5,5 * 4byte = 20 byte;

服务类型 :一般设置为0,表示一般的服务;

总长度 :IP首部和IP数据一共多长,最大的值为65535,但是实际上传送不了那么多,因为还要考虑以太网的帧格式长度,也就是只能传输1千多;

标识 :初始值为0,每发送一个UDP数据包,这个值就累加1

标志 :3bit,表示如有10000个数据,但是一次传输不了那么多,用于表示分片,需要对数据包进行分片;位号表示2 1 0,位号2为保留位为0,位号1为禁止分片位(不需要分片置为1,需要分片置为0),位号0表示需要更多的分片(在位号1使能的情况下使用),一般使用值为0。一般设为:010,表示不分片;

片偏移 :分片的时候才有意义,当前的数据包位于整个数据包哪一个位置,方便后面解析的时候对其进行拼接;

生存时间 :防止数据被无止境的复制下去,数据每经过1次路由器,生存时间就会减1;一般设置为64或者128;

协议 :如果是UDP协议的时候就是17

首部校验和 :IP首部校验和

源IP地址 :发送端的IP地址;

目的IP地址 :接收端的IP地址;

可选字段:也是按照4个字节为单位;

2、IP首部校验和计算方式

四、常用的网际协议编号

IP协议的协议字段。

1、ICMP协议

ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议族中的一种网络层协议,用于在 IP 网络中传递控制消息和错误报告。

ICMP 主要用于诊断网络问题、检测网络可达性和报告错误条件。

ICMP 是网络管理和故障排除的重要工具,常见的工具如 ping 和traceroute都依赖于 ICMP。

(1) 一个完整的ICMP回显请求/应答报文(即Ping报文)

  • 类型 (Type),1字节,其中回显请求为8,回显应答为0; -
  • 代码 (Code),1字节,对于回显请求和应答,此值为0;
  • 校验和 (Checksum),2字节,对整个ICMP报文(从类型字段开始)的校验和;
  • 标识符(Identifier),2字节,帮助匹配请求与应答,通常用于标识特定的进程或会话;
  • 序列号 (Sequence Number),2字节,帮助匹配请求与应答,特别是当发送多个请求时,用于区分不同的请求;
  • 数据 (Data),可变可选的负载数据,在回显应答中会被原样返回。

校验和是对整个ICMP报文进行校验和,包含数据段,校验方式同IP首部检验和。

(2) 抓ping数据

2、UDP

3、TCP

TCP(Transmission Control Protocol,传输控制协议)是互联网协议套件中的核心协议之一,位于传输层。它提供了一种可靠的、面向连接的、基于字节流的数据传输服务。TCP 的主要特点是确保数据在传输过程中不丢失、不重复,并且按顺序到达。以下是 TCP 的工作原理和关键特性的详细解释。

TCP 的工作原理

TCP 通过"三次握手"建立连接,通过"四次挥手"终止连接,并在数据传输过程中使用确认机制、重传机制和流量控制来保证可靠性。

TCP 的关键特性

  • 可靠性:
    1.通过确认机制和重传机制,确保数据不丢失、不重复。
    2.通过校验和检查数据完整性。
  • 面向连接:
    1.在数据传输前需要建立连接,传输结束后需要关闭连接。
  • 有序性:
    1.数据按发送顺序到达接收方。
  • 流量控制:
    1.通过滑动窗口机制,动态调整发送速率。
  • 拥塞控制:
    1.通过慢启动、拥塞避免等算法,避免网络拥塞。

(1) 协议帧

  1. **源端口号(Source Port) **

    16位的源端口字段包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。

  2. 目的端口号(Destination Port)

    16位的目的端口字段定义传输的目的。这个端口指明接收方计算机上的应用程序接口。

  3. 序列号(Sequence Number)

    该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。序列号是一个32位的数。

  4. 确认号(Acknowledge Number)

    TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。

  5. 首部长度

    长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5。

  6. 保留位(Reserved)

    长度为6位,必须是0,它是为将来定义新用途保留的。

  7. 标志(Code Bits)

    长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:

    URG :紧急标志位,说明紧急指针有效;

    ACK :确认标志位,多数情况下空,说明确认序号有效; 取1时表示应答字段有效,也即TCP应答号将包含在TCP段中,为0则反之。

    PSH :推标志位,置位时表示接收方应立即请求将报文交给应用层;

    RST :复位标志,用于重建一个已经混乱的连接,用来复位产生错误的连接,也会用来拒绝错误和非法的数据包。

    SYN :同步标志,该标志仅在三次握手建立TCP连接时有效

    FIN:结束标志,表示发送端已经发送到数据末尾,数据传送完成,发送FIN标志位的TCP段,连接将被断开。

  8. 窗口大小(Window Size)

    长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。

  9. 检验和(Checksum)

    长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。

  10. 紧急指针(Urgent Pointer)

    长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。

  11. 选项(Options)

    长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等
    12. 数据

    可选报文段数据部分。

(2) 三次握手建立连接


SYN :客户端发送一个 SYN 包(同步请求)给服务器,表示请求建立连接。
SYN-ACK :服务器收到 SYN 包后,回复一个 SYN-ACK 包(同步确认),表示同意建立连接。
ACK :客户端收到 SYN-ACK 包后,发送一个 ACK 包(确认),表示连接已建立。

在首次握手时需要协商最大报文段长度(MSS)、窗口缩放因子、选择性确认 等功能,客户端发起SYN后,服务器同时也需要将自己的MSS等信息告知给服务器,通过回读SYN+ACK,并带有可选字段。在通信过程中MSS最为重要

完整的三次握手

客户端发起的SYN

服务器回复SYN+ACK

主机收到SYN并回复ACK

(3)数据传输

在连接建立后,TCP 通过以下机制确保数据的可靠传输:

  • 序列号和确认号:每个数据包都有一个序列号,接收方通过确认号告知发送方哪些数据已成功接收。
  • 重传机制:如果发送方未收到确认,会重新发送数据包。
  • 流量控制:通过滑动窗口机制,动态调整发送速率,避免接收方缓冲区溢出。
  • 拥塞控制 :通过慢启动、拥塞避免等算法,动态调整发送速率,避免网络拥塞。
    数据传输过程TCP字段可不用包含可选字段,直接传输数据即可,传输数据时需要将PSH和ACK置高。

完整的数据通信

客户端发送数据到服务器

客户端发送数据到服务器

服务器收到数据并回复ACK

服务器发送数据到客户端

客户端收到数据,并回复ACK

(4)四次挥手终止连接

  • FIN:客户端发送一个 FIN 包,表示请求关闭连接。
  • ACK:服务器收到 FIN 包后,回复一个 ACK 包,表示确认。
  • FIN:服务器发送一个 FIN 包,表示服务器也准备关闭连接。
  • ACK:客户端收到 FIN 包后,回复一个 ACK 包,表示确认。连接正式关闭。

完整的四次挥手

主机发起FIN+ACK

服务器做出应答,回读ACK

客户端发起FIN+ACK

客户端做出应答回复ACK

(5) TCP校验和计算方法

TCP首部校验需要校验伪首部+TCP首部+TCP数据
伪首部

源IP地址

目的IP地址

0+协议(6)

TCP长度:总长度减去IP首部长度
校验方法
伪首部+TCP首部+TCP数据,每两个组成一个16bit数据,使用32bit作为累加和,用所有16bit的数据进行累加,最后将高16bit数据与低16bit数据进行相加,再按位取反,得到一个校验和数据,该值作为TCP校验和数据。

IP首部校验和与TCP校验和计算方法相同。

*收到的首部校验和计算过程

将伪首部,TCP首部+TCP数据,包含接收到的首部校验和,所有数据组成16bit数据进行累加,然后高16bit与低16bit数据相加,最后得到的结果为0xFFFF则认为接收到的数据校验成功。

(6) TCP 通信过程中序列号和确认号的确认方法

规则:

  1. 三次握手时随机生成自己的序列号;
  2. 序列号本地自行维护,发送的序列号=当前序列号+发送的数据字节数+可变长度(SYN/FIN时为1,其他为0);
  3. 回复的确认号=收到的序列号+收到的数据长度+可变长度(SYN/FIN时为1,其他为0);
相关推荐
handler0111 小时前
【Linux 网络】一文读懂 HTTP 协议
linux·c语言·网络·c++·笔记·网络协议·http
真恋寄语枫秋11 小时前
【Java零基础入门20】Java Stream流超全详解:中间操作、终结操作、集合数据处理
java
我还记得那天11 小时前
用C语言实现一个简易扫雷小游戏
c语言·开发语言
段ヤシ.11 小时前
回顾Java知识点,面试题汇总Day10(持续更新)
java·开发语言·spring
小明同学0111 小时前
C++后端项目:统一大模型接入 SDK(二)
开发语言·c++
Dicky-_-zhang11 小时前
Elasticsearch聚合查询优化实战
java·jvm
淼淼爱喝水11 小时前
【Ansible 入门实战】三种变量详解
java·linux·数据库·ansible·playbook
我不是懒洋洋11 小时前
【C++】类和对象( 类的定义、实例化、 this指针、 C++和C语言实现Stack对比)
c语言·开发语言·数据结构·c++·经验分享·算法·visual studio