以太网数据包TCP、IP、ICMP、UDP、…

2023-05-16

以太网首部

目地MAC地址(8字节)

源MAC地址(8字节)

类型(2字节)

 

 

1、IP头的结构

版本(4位)

头长度(4位)

服务类型(8位)

封包总长度(16位)

封包标识(16位)

标志(3位)

片断偏移地址(13位)

存活时间(8位)

协议(8位)

校验和(16位)

来源IP地址(32位)

目的IP地址(32位)

选项(可选)

填充(可选)

数据

(1)字节和数字的存储顺序是从右到左,依次是从低位到高位,而网络存储顺序是从左到右,依次从低位到高位。

(2)版本:占第一个字节的高四位。头长度:占第一个字节的低四位。

(3)服务类型:前3位为优先字段权,现在已经被忽略。接着4位用来表示最小延迟、最大吞吐量、最高可靠性和最小费用。

(4)封包总长度:整个IP报的长度,单位为字节。

(5)存活时间:就是封包的生存时间。通常用通过的路由器的个数来衡量,比如初始值设置为32,则每通过一个路由器处理就会被减一,当这个值为0的时候就会丢掉这个包,并用ICMP消息通知源主机。

(6)协议:定义了数据的协议,分别为:TCP、UDP、ICMP和IGMP。定义为:

#define PROTOCOL_TCP    0x06

#define PROTOCOL_UDP    0x11

#define PROTOCOL_ICMP   0x06

#define PROTOCOL_IGMP   0x06

(7)检验和:校验的首先将该字段设置为0,然后将IP头的每16位进行二进制取反求和,将结果保存在校验和字段。

(8)来源IP地址:将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。

(9)目的IP地址:转换方法和来源IP地址一样。

在网络协议中,IP是面向非连接的,所谓的非连接就是传递数据的时候,不检测网络是否连通。所以是不可靠的数据报协议,IP协议主要负责在主机之间寻址和选择数据包路由。

2、ICMP协议的头结构

类型(8位)

代码(8位)

校验和(8位)

类型或者代码

 

(1)类型:一个8位类型字段,表示ICMP数据包类型。

(2)代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为0。

(3)检验和:数据包中ICMP部分上的一个16位检验和。

 

 

3、TCP协议的头结构

来源端口(2字节)

目的端口(2字节)

序号(4字节)

确认序号(4字节)

头长度(4位)

保留(6位)

URG

ACK

PSH

RST

SYN

PIN

窗口大小(2字节)

校验和(16位)

紧急指针(16位)

选项(可选)

数据

(1)TCP源端口(Source Port):16位的源端口包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。

(2)TCP目的端口(Destination Port):16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

(3)序列号(Sequence Number):TCP连线发送方向接收方的封包顺序号。

(4)确认序号(Acknowledge Number):接收方回发的应答顺序号。

(5)头长度(Header Length):表示TCP头的双四字节数,如果转化为字节个数需要乘以4。

(6)URG:是否使用紧急指针,0为不使用,1为使用。

(7)ACK:请求/应答状态。0为请求,1为应答。

(8)PSH:以最快的速度传输数据。

(9)RST:连线复位,首先断开连接,然后重建。

(10)SYN:同步连线序号,用来建立连线。

(11)FIN:结束连线。如果FIN为0是结束连线请求,FIN为1表示结束连线。

(12)窗口大小(Window):目的机使用16位的域告诉源主机,它想收到的每个TCP数据段大小。

(13)校验和(Check Sum):这个校验和和IP的校验和有所不同,不仅对头数据进行校验还对封包内容校验。

(14)紧急指针(Urgent Pointer):当URG为1的时候才有效。TCP的紧急方式是发送紧急数据的一种方式。

4、UDP协议的头结构

源端口(2字节)

目的端口(2字节)

封报长度(2字节)

校验和(2字节)

数据

(1)源端口(Source Port):16位的源端口域包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。

(2)目的端口(Destination Port):6位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

(3)封包长度(Length):UDP头和数据的总长度。

(4)校验和(Check Sum):和TCP和校验和一样,不仅对头数据进行校验,还对包的内容进行校验。

 

5、ARP报头结构

硬件类型

协议类型

硬件地址长度

协议长度

操作类型

发送方的硬件地址(0-3字节)

源物理地址(4-5字节)

源IP地址(0-1字节)

源IP地址(2-3字节)

目标硬件地址(0-1字节)

目标硬件地址(2-5字节)

目标IP地址(0-3字节)

(1)硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1;

(2)协议类型字段指明了发送方提供的高层协议类型,IP为0800(16进制);

(3)硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;

(4)操作字段用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;

(5)发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;

(6)发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;

(7)发送方IP(0-1字节):源主机硬件地址的前2个字节;

(8)发送方IP(2-3字节):源主机硬件地址的后2个字节;

(9)目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;

(10)目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;

(11)目的IP(0-3字节):目的主机的IP地址。

 

ARP的工作原理如下:

1.   首先,每台主机都会在自己的ARP缓冲区(ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。

2.   当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

3.   网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;

4.   源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太网数据包TCP、IP、ICMP、UDP、… 的相关文章

  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 是否可以通过互联网在两个移动设备 (iPhone) 之间连接套接字?

    是否可以通过互联网在两个移动设备 iPhone 之间连接套接字 我正在尝试发现每个设备的IP并直接连接 我知道可以使用 Bonjour 来完成 但这只适用于本地网络 我需要通过互联网在两个设备之间建立高速连接 Thanks 如果你有两个 I
  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

    我正在使用以下命令打开 TAP 设备 p gt fd open dev net tun O RDWR skipping error handling code ifr ifr flags IFF TAP IFF ONE QUEUE IFF
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • 使用 Boost.Asio 进行广播的问题

    如果问题之前已得到解答 我提前表示歉意 但我已经搜索并没有找到任何对我有帮助的东西 正如问题标题所示 我正在尝试将包从服务器广播到一组侦听任何消息的客户端 客户端将计算一秒钟内收到的消息数 服务器端的事情是这样的 class Server
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 如何使用 Nmap 检索 TCP 和 UDP 端口? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要在使用 Nmap 的同一扫描中以尽可能最快的方式检索 TCP 和 UDP 端口 我会尽力解释得更好 如果我使用最常用的命令 nmap 192 1
  • 如何知道哪个本地应用程序连接到我的套接字(Windows)

    我有一个绑定到某个 TCP 端口的 Windows 服务 该端口用于我的应用程序之间的 IPC 有没有一种编程 WinAPI WinSocket 等 方法可以知道哪个应用程序连接到我的端口 即在我的 Windows 服务中 我想获取连接到我
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 错误号:11,资源暂时不可用

    我正在使用 c 套接字来实现可靠的 UDP 协议 我正在使用以下代码在等待确认的套接字上设置超时 我不确定为什么会收到 errno 11 资源暂时不可用 set timer for recv socket struct timeval tv

随机推荐

  • 让人混淆的Person p=new Person();和Person p=null;

    一 对 Person p 61 new Person 的理解 要理解这个问题 xff0c 首先要知道整个过程中内存中发生了什么 xff01 我们知道 xff0c 内存中我们最常用的就是三个 xff1a 栈 堆 方法区 其中对于基本值类型和引
  • mybatis中显示Type interface com.javacto.dao.UserMapper is not known to the MapperRegistry.

    一 报错 二 问题描述 在使用mapper代理的方式实现开发的时候 xff0c 要注意这个问题 xff1a 这个说明是资源文件中的配置出现了问题 sqlMapConfig xml文件中的中的配置出现了问题 就是说在mybatis的全局配置文
  • Idea中通过逆向工程的方式创建p

    文章目录 一 最终的效果二 为什么要使用逆向工程三 如何在工程中使用逆向工程1 前期准备2 创建generatorConfig xml文件3 运行逆向工程 xff0c 生成相关文件 一 最终的效果 上图中dao层 pojo层以及mapper
  • 解决Python调用dll错误:Could not find module ‘xxx‘ (or one of its dependencies). Try using the full path...

    该问题有两种情况 xff1a python的dll保护机制造成确实是调用的dll依赖缺失造成的 情况1 对于第一种情况 xff0c 参考 xff1a python dll加载 情况2 对于dll丢失 xff0c 只需要找到该dll的依赖的其
  • Docker 更改MTU大小

    docker 更改MTU大小 更改docker host的MTULinux环境Windows或者MacOS 更改自定义网络MTU清除旧网络建立新网络 更改docker host的MTU 为了优化网络传输能力 xff0c 有时候我们需要更改M
  • 如何释放dataframe使用的内存

    如何释放熊猫数据框使用的内存 xff1f 我在熊猫中打开了一个非常大的csv文件 xff0c 如下所示 import pandas df 61 pandas read csv 39 large txt file txt 39 完成此操作后
  • Vmware vSphere client手动更改mac地址

    公司有集群搭建 xff0c 需要添加license xff0c 需要修改虚拟机MAC地址 xff0c 但是直接修改后启动虚拟机报错 xff0c 还需要配置mac取消检查 第一步 xff1a 在虚拟机关机状态下 xff0c 选择 编辑虚拟机设
  • 跳转微信小程序和支付宝小程序

    跳转微信小程序和支付宝小程序 1 微信小程序 参考链接 获取微信小程序 URL Scheme 1 1 获取小程序连接 这里需要获取长期有效的 Scheme xff0c 方式如下 xff1a 联系小程序开发者其他渠道 示例 小程序 Schem
  • 字符串、列表、元组 索引和切片(1)

    字符串下标索引和切片 str 61 39 abcdefg 39 print str 0 打印结果a print str 0 2 打印结果ab print str 2 打印结果cdefg print str 1 打印结果g print str
  • (网易2018校招笔试)[编程题] 字符串碎片

    一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的 例如 aaabbaaac 是由下面碎片组成的 aaa bb c 牛牛现在给定一个字符串 请你帮助计算这个字符串的所有碎片的平均长度是多少 输入描述 输入包括一个字符串s 字符串
  • 将pip或pip3更换至国内镜像源,解决下载速度缓慢的问题

    执行 pip3 config set global index url https pypi tuna tsinghua edu cn simple 清华大学的镜像源 再次pip3下载结果如下 xff1a xff08 速度真的很快呀 xff
  • android使用串口

    本篇分为新建串口项目与在原有项目添加串口功能 基于android studio 4 1 2 串口文档基于google官方文件 文件下载 需要配置CMAKE 1 新建串口项目 新建c 43 43 项目 复制串口的文件到cpp文件夹 3 复制j
  • 学校网络(有向图的强连通分量)

    题目描述 一些学校连接在一个计算机网络上 xff0c 学校之间存在软件支援协议 xff0c 每个学校都有它应支援的学校名单 xff08 学校A支援学校B xff0c 并不表示学校B一定要支援学校A xff09 当某校获得一个新软件时 xff
  • uwsgi+nginx结构下的nginx日志异常

    我的小项目是django 43 uwsgi 43 nginx这样的结构 xff0c nginx的配置如下 xff1a upstream myapp span class hljs built in span test span class
  • 定时器T0赋初值的计算方式

    定时中断初值计算方法是 xff1a 1 确定定时时间化为微妙t 2 晶振频率以MHZ为单位f 3 计算初值 xff1a s 61 65536 tf 12 比如16MHZ晶振 xff0c 定时1毫秒 t 61 11000 61 1000us
  • Ubuntu 17.04更改鼠标移动速度

    升级ubuntu 17 04后发现下面命令不能用来更改鼠标移动速度了 xinput span class hljs subst span span class hljs built in set span span class hljs a
  • 使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

    简介 这里不对 langchain 和 chatGPT 进行介绍 xff0c 仅对实现过程进行整理 环境 Python gt 61 3 8 Flask2 2 3 Jinja23 1 2 langchain0 0 143 openai0 27
  • 汇编语言实现两个任意大的数相加

    实现了输入 xff0c 相加 xff0c 输出功能 xff0c 可在此基础上做出自己的修改 xff0c 代码如下 xff1a DATA SEGMENT MSG1 DB 34 Please Input The First Number 34
  • 十六进制ASCII码表

    xff21 xff33 xff23 xff29 xff29 与 xff11 xff16 进制转换 ASCII 16 进制 ASCII 16 进制 ASCII 16 进制 ASCII 16 进制 NUL 00H DLE 10H SP 20H
  • 以太网数据包TCP、IP、ICMP、UDP、…

    以太网首部 目地MAC地址 xff08 8字节 xff09 源MAC地址 xff08 8字节 xff09 类型 xff08 2字节 xff09 1 IP头的结构 版本 xff08 4位 xff09 头长度 xff08 4位 xff09 服务