名词解释
分类
以太网帧头可以分为以下三个部分:
优势
应用场景
以太网帧头在以下场景中得到了广泛应用:
推荐的腾讯云产品
产品介绍链接
---- Linux 网络协议栈 我们可以把自己的身体比作应用层中的数据,打底衣服比作传输层中的 TCP 头,外套比作网络层中 IP 头,帽子和鞋子分别比作网络接口层的帧头和帧尾。...,这每一层都增加了各自的协议头,那自然网络包的大小就增大了,但物理链路并不能传输任意大小的数据包,所以在以太网中,规定了最大传输单元(MTU)是 1500 字节,也就是规定了单次传输的最大 IP 包大小...如果使用的是 TCP 传输协议发送数据,那么先拷贝一个新的 sk_buff 副本 ,这是因为 sk_buff 后续在调用网络层,最后到达网卡发送完成的时候,这个 sk_buff 会被释放掉。...网络接口层会通过 ARP 协议获得下一跳的 MAC 地址,然后对 sk_buff 填充帧头和帧尾,接着将 sk_buff 放到网卡的发送队列中。...第二次,在使用 TCP 传输协议的情况下,从传输层进入网络层的时候,每一个 sk_buff 都会被克隆一个新的副本出来。
在《在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP》里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以太网帧的帧头14...注: 在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum...网卡芯片对MAC包,再次封装成物理帧,添加头部同步信息和CRC校验。然后丢到网线上,就完成一个IP报文的发送。所有挂接到本网线的网卡都可以看到该物理帧。...网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触发中断。 驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff。告诉上层。 上层去掉MAC包头,得到需要的IP包。 ...网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触发中断。 驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff。告诉上层。 上层去掉MAC包头,得到需要的IP包。
基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是没有意义的...它是能为网络设备和协议所能理解的最小单位 协议头(header)是在数据包中的一系列字节,它将通过网络子系统的不同层 连接到内核 loopback.c、plip.c和e100.c 设备注冊 驱动程序对每一个新检測到的接口...dev_kfree_skb_any(struct sk_buff *skb); 不使用接收中断 为了能提高Linux在宽带系统上的性能。...在以太网中使用ARP ARP由内核维护,而以太网接口不须要做不论什么特殊工作就能支持ARP 重载ARP 假设设备希望使用经常使用的硬件头,而不执行ARP,则须要重载默认的dev->hard_header...函数 非以太网头 硬件头中除目标地址之外,还包括其它一些信息。
1、思路使用Python+Opencv,从摄像头的实时视频流中逐帧读取图片,保存到本地2、工具安装Python安装Opencv3、分类目前测试的过程中遇到了三种类型的摄像头数据读取,分别是:USB普通摄像机...:直接使用Python+Opencv,进行数据采集self.cap = cv2.VideoCapture(0);0是本地摄像头USB工业摄像头:使用厂家自带的SDK进行二次开发,例如某厂家的SDK如下:...图片网络摄像头:从RTSP流中读取数据,读取方法,以大华普通网络摄像头为例:图片4、示例# -*- coding: cp936 -*-"""Author:xxxxxxDate:2019-09-23Discription...image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) #逐帧读取数据并保存图片到本地制定位置...i = 0 while(1): """ ret:True或者False,代表有没有读取到图片 frame:表示截取到一帧的图片
一、环境介绍 操作系统介绍:ubuntu 18.04 FFMPEG版本: 4.4.2 摄像头: USB摄像头、虚拟机挂载本机自带摄像头 二、FFMPEG与X264编译下载 参考链接: https://...blog.csdn.net/xiaolong1126626497/article/details/104919095 三、编译FFMPEG 3.1 ffmpeg水印滤镜 如果需要使用ffmpeg的水印功能...enable-libx264 --enable-gpl --enable-libfreetype --enable-libfontconfig --enable-libfribidi 3.4 加水印测试: 使用...ffmpeg命令 在图片的左上角(横坐标10.纵坐标100)添加水印: wbyq@wbyq:/mnt/hgfs/linux-share-dir$ ffmpeg -i 123.mp4 -vf "drawtext...shadowy=2" output.mp4 参数说明 fontfile:字体类型 --simhei.ttf如果没有找到,可以在windows下的Fonts目录下拷贝过来,放到程序执行目录下- text:要添加的文字内容
Linux发送HTTP网络包图像 图像解析 写入套接字缓冲区(添加TcpHeader) 用户态进程通过write()系统调用切到内核态将用户进程缓冲区中的HTTP报文数据通过Tcp Process处理程序为...2. sk_buff数据结构解析 通过对sk_buff数据结构解析,窥见Linux中的一些设计思想; 进行协议头的增添 我们知道,按照网络栈的设定,发送网络包时,每经过一层,都会增加对应协议层的协议首部...中的data指针指向最外层的协议头; 网络包的大小占用 考虑一个包含2bytes的网络包,需要包括 预留头(64 bytes) + Mac头(14bytes) + IP头(20bytes) + Tcp头...网卡发送网络包:当sk_buff已经在内核空间被写入完成时,网卡的DMA Engine检测到Tx.ring有数据包完成时,触发DMA Copy将数据传输到网卡内存中,并封装MAC帧。...进行 DMA Copy 到网卡的内存中,并将IP包封装为帧并对外发送。
我们平常浏览各个网站时,不免有时候就需要填写一些信息,比如注册时,登录时,这些信息一般都是通过GET请求或者POST(敏感信息一般使用POST,数据隐藏,相对来说更安全)请求提交到后台,经过后台的一系列处理...根据带参数的URI对象构建GET请求对象 HttpGet httpGet = new HttpGet(uriBuilder.build()); /* * 添加请求头信息...构造带参数的URI使用URIBuilder类。 上面添加请求参数的方法有两种,建议后者,后者操作更加灵活。...POST请求携带请求参数和请求头: @Test public void postParams() { // 获取连接客户端工具 CloseableHttpClient httpClient...UrlEncodedFormEntity(list, "UTF-8"); httpPost.setEntity(entityParam); /* * 添加请求头信息
Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。...网络设备接口既包括软件虚拟的网络设备接口,如环路设备,也包括了网络硬件设备,如以太网卡。 Linux内核有一个dev_base的全局指针,指向一个设备链表,包括了系统内的所有网络设备。...二、与网络有关的数据结构 内核对网络数据包的处理都是基于sk_buff结构的,该结构是内核网络部分最重要的数据结构。 网络协议栈中各层协议都可以通过对该结构的操作实现本层协议数据的添加或者删除。...使用sk_buff结构避免了网络协议栈各层来回复制数据导致的效率低下。...对于一个TCP数据包为例,sk_buff还提供了几个指针直接指向各层协议头。
举个例子,我们在 WiFi 设备驱动做修改(如,打补丁、添加新的 WiFi 驱动等),这些变更并不会影响到 mac80211 模块, 所以我们根本不用改动 mac80211 的代码。...再如,添加一个新的网络协议理论上是不用修改套接字层以及设备无关层代码。一般情况下,内核通过一系列的函数指针实现各层之间相互透明。...在套接字创建时,我们需要指明将要使用的协议族,这将在内核中起作用。...这一层透明的连接着各种各样的硬件设备(如以太网设备、 WiFi 设备等)。 设备无关层一个重要的结构是: net_device 。...设备驱动使用到的在 ieee80211_hw 中的私有结构 void *priv 。
例如: 以太网帧能够承载不超过1500字节的数据,而某些广域网链路的帧可承载不超过576字节的数据 我们将一个链路层帧能承载的最大数据量叫做最大传送单元(MTU),因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器...如果遇到MTU更小的链路层协议,则将现有分片分成两个或多个更小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,然后通过输出链路发送这些帧 使用IPV4协议的路由器才会执行再分片操作,使用IPV6...在Linux 1.2.13的net模块中,使用ipfrag结构来描述一个ip分片信息,使用ipq结构来描述一个完整的传输层数据包信息: ip.h: /* Describe an IP fragment....device *dev; /* Device - for icmp replies -- 重组失败后通过该接口发送ICMP包 */ }; ---- ip.c: ip_create ip_create函数用于添加一个新的...received fragments at their respective positions. */ // 创建一个队列用于重组分片 // 参数: 承载当前分片数据信息,ip首部,从哪个链路层设备上接收到的以太网帧
当打开GSO时,GSO会在xmit那块做GSO分片时调用TCP/UDP的回调函数自动添加TCP/UDP头(不使用GSO的只有第一个分片有TCP/UDP头,后面接着的分片是没有的,这也是为什么在虚机里打开...TSO/GSO时对于隧道会多出一块数据的原因),然后再调IP层回调函数为每个分片添加IP头。...TSO与GSO的重要区别 1, TSO只有第一个分片有TCP头和IP头,接着的分段只有IP头。意味着第一个分段丢失,所有分段得重传。...4, host上的vxlan driver在原GSO大帧上添加vxlan帧头,从(payload, inner-tcp, inner-ip, inner-ethernet)变成(payload, inner-tcp...5, 如果host不支持GSO,那么在host的IP层直接对外层的UDP分片,注意:只有第1个分片有UDP头,接下来的分片没有UDP头。
数据包并非没有进入内核,而是在进入内核后直接跳过了内核中三层/四层的协议栈,直达套接字接口,被应用层的tcpdump所使用。...以最常见的以太网网卡,当网卡接口接收到了一个帧,那么接受者知道它一定包含了一个Ethernet报头。封包在协议栈向上传递过程中,一定会在报头中包含一个字段,指出下一阶段的处理应该使用哪一个协议。 ...以太网卡拥有特定的MAC地址,在监听数据帧的时候,当看到帧的目的MAC地址与自己的地址或者链路层广播地址(FF:FF:FF:FF:FF:FF)相匹配,就会通过DMA把该帧读取到内存中的ring buffer...poll方法会分配一个sk_buff数据结构(include/linux/skbuff.h),表示该数据包的内核视图。...然后将数据从缓冲区提取到新建的sk_buff中,并对其中的protocol字段做初始化,该字段用以识别特定的协议。
#define ETH_ALEN 6 //定义了以太网接口的MAC地址的长度为6个字节 #define ETH_HLAN 14 //定义了以太网帧的头长度为14个字节 #define ETH_ZLEN...60 //定义了以太网帧的最小长度为 ETH_ZLEN + ETH_FCS_LEN = 64个字节 #define ETH_DATA_LEN 1500 //定义了以太网帧的最大负载为1500个字节...4 //定义了以太网帧的CRC值占4个字节 使用网卡发送数据时,如何发现发送的实际数据小于以太网规定的最小长度,需要进行补齐: static netdev_tx_t tiny4412_ndo_start_xmit...len = skb->len; /*获取将要发送出去的数据长度*/ if(len < ETH_ZLEN) { /* 如果帧长小于以太网帧最小长度.../ len = skb->len; /*获取将要发送出去的数据长度*/ if(len < ETH_ZLEN) { /* 如果帧长小于以太网帧最小长度
struct sk_buff 是专门存放各种网络传输数据包的内存接口,在收到数据存放到 NIC 专用内核内存区域后,sk_buff 内有个 data 指针会指向这块内存。...sk_buff结构或skb结构代表一个数据包,它们也变得更复杂了。 sk_buff_structure 包含数据和元数据 ? 一些必要的信息比如头和内容长度被保存在元数据区。...例如,在图6中,mac_header、network_header和transport_header都有相应的指针,指向链路头、IP头和TCP头的起始地址。这种方式让TCP协议处理过程变得简单。...如何增加或删除头 数据包在网络栈的各层中上升或下降时会增加或删除数据头。为了更有效率的处理而使用了指针。例如,要删除链路头只需要修改head pointer的值。...比如,如果数据通过10Gb的以太网传输,每秒会有超过一百万个对象被创建和销毁。
没错,那就是以太网交换机。同一网络内的多台物理机通过交换机连在一起,然后它们就可以相互通信了。 在我们的网络虚拟化环境里,和物理网络中的交换机一样,也需要这样的一个软件实现的设备。...一、如何使用 bridge 在分析它的工作原理之前,很有必要先来看一看网桥是如何使用的。...并把其中的一头 veth1 放到这个新的 netns 中。...创建一个 bridge 设备, 把刚刚创建的两对儿 veth 中剩下的两头“插”到 bridge 上来。...三、添加设备 调用 brctl addif br0 veth0 给网桥添加设备的时候,会将 veth 设备以虚拟的方式连到网桥上。当添加了若干个 veth 以后,内核中对象的大概逻辑图如下。
比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。...数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作....有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层. 网络层: 负责地址管理和路由选择....UDP使用报头定长8字节来解决。 2.UDP协议是如何解决有效载荷向上交付的问题?...sk_buff内部还有一个指针指向的下一个结构体,此时对UDP报文的管理就转化成了对链表的增删查改。 3.4 UDP的缓冲区 UDP没有真正意义上的 发送缓冲区.
首先很重要的一点,目标缓存条目是以多种不同方式添加的。到目前为止,我们已经在代码中看到的一种方法是从 udp_sendmsg 调用ip_route_output_flow。...在这种情况下,可以使用 IP_PMTUDISC_PROBE 选项告诉内核设置“Do not Fragment”位,这就会允许发送大于 PMTU 的数据。...接下来,确保 skb 结构有足够的空间容纳需要添加的任何链路层头。...dev_hard_header 为 skb 创建以太网头时将读取该字段。...dev_queue_xmit(skb); else goto out_kfree_skb; } 如果以太网头写入成功
在上一小节中关于在链表中头部添加元素与在其他位置添加元素在逻辑上有所差别,这是由于我们在给链表添加元素时需要找到待添加元素位置的前一个元素所在的位置,但对于链表头来说,没有前置节点,因此在逻辑上就特殊一些...为了针对头结点的操作方式与其他方式一致:接下来我们就一步一步引入今天的主题--使用虚拟头结点。 首先来看看之前的节点结构--第一个是头结点 ? ...则dummyHead节点变为了0这个节点(头结点)的前置节点,则现在所有节点都有了前置节点,在逻辑可以使用统一的操作方式。...size = 0; } (3)改进之前的add(int index,E e)方法,之前对在头结点添加元素单独做了处理(if-else判断),如下: 1 //在链表的index(0--based...void addLast(E e) { 86 add(size, e); 87 } 88 } 本小节着重介绍了虚拟头节点的使用,若您觉得本文还行、还过得去,麻烦给个推荐吧,谢谢
应用协议 HTTP 报文头添加到 HTML 数据之前,报文头信息包括:服务器所使用的 HTTP 版本,以及表明它包含发给网络客户端信息的状态编码。...以太网协议添加到 IP 报文的两端之后,就形成了数据链路帧,上述帧发送至通向网络客户端的路径上的最近的一个路由器。...客户端接收到包含数据的数据链路帧,处理各层协议头,之后以添加时相反的顺序移除协议头。首先处理并移除以太网信息,之后是 IP 协议信息,接下来是 TCP 信息,最后是 HTTP 信息。...IP 头包括源和目的地址,以及发送报文到目的地址所必须的信息。 之后,IP 报文发送到接入层,封装以帧头和帧尾。每个帧头都包含源和目的物理地址。物理地址唯一指定来本地网络上的设备。...源和目的 MAC 地址添加到以太网帧中。 ? MAC 与 IP 地址 发送方必须知道接收方的物理和逻辑地址。
IP 传给数据链路层的数据单元称作 IP 数据报(IP datagram),最后通过以太网传输的比特流称作帧(Frame)。...分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用。...sk_buff:描述一个帧结构的属性,包含 socket、到达时间、到达设备、各层首部大小、下一站路由入口、帧长度、校验和等等。 sk_buff_head:数据包队列结构。...packet_type:以太网数据帧的结构,包括了以太网帧类型、处理方法等。 rtable:路由表结构,描述一个路由表的完整形态。 rt_hash_bucket:路由表缓存。...该函数会根据 IP 首部中使用的传输层协议来调用相应协议的处理函数。
领取专属 10元无门槛券
手把手带您无忧上云