2.5 IP v4

本文详细介绍了IPv4数据报的结构及其各字段的功能,包括版本、头部长度、总长度、标识符、标志与片段偏移等关键信息。此外,还探讨了IPv4中的CIDR无类别域间路由的概念及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.5 IPv4

——————————————————————————————————————————————

1Word=4Octet=32Byte=32Bit,1Octet代表8字节(二进制),Word代表多比特的组合,Flag表示1个字节的控制函数,Flag为1是代表被设置,Flag为0时代表是没有用到的干净的clear,这些在IPv4中使用,但也用于IPv6、TCP和UDP以及其他IETF协议。


IPv4包被称为数据报,数据报定义如下,在RFC 1594中,它被定义为一个独立的独立数据实体,它承载足够的信息,而不依赖任何其他较早发送的数据包进行路由,这就是是一个独立的单元,它具有所有的控制特性和功能,并且它可以独立地路由,它们被成功地路由或不成功不是依赖于先前的包。换句话说每个IPv4数据包都可以是个火车头。


IP包被设计成有IPv4包和IPv6包,这是IP v4包的结构:首先它分为有一个报头和一个有效负载,有效载荷部分将包括TCP/UDP报头以及数据部分该数据部分是有效载荷段部分

IPv4的基本功能是互联网络和路由,IPv4分组报头包(IPv4 packet header)含将IPv4包传递到其目的地所需的所有功能,这就是为什么它被称为数据报的原因。


——————————————————————————————————————————————

看下图,一共分为14部分一共占有20octets:


1.版本(version)(IP v 4中有4字节/IP v 6中有6字节)

不同的IP包的版本通过version被用来分辨。


2.因特网报头长度(IHL)(4 bits)

顾名思义,这是一个用Word表示的IP v4 header长度,IHL最小值为5,所以说最小长度是5Words,即20Octets。


3.区分服务字段(DS) 和 显示拥塞通知(ECN) (Lds=6bits,Lecn=2bits)

(1)DS区分服务优先级分配,6字节。

(2)ECN这些用于网络拥塞的显式信令,以减缓在网络中检测到的延迟或拥塞时正在传输的分组的速度。


4.总长度(Total Length)(16bits)

总长度以八位字节为单位的IP数据包的总长度,也就是2的16次方个Octets也就是2的19次方bits的空间,当然,这些空间不会全部用到,because IPv4 packet size is limited by the layer 2 frame size,就是第二层的帧。


这里插一个notion,那就是

4.5.MTU

它是一个IP分组的最大大小,可以在介质上无碎片地传输,即不用分组

比如:

(1)当你使用以太网的时候,基于IEEE 802.3标准,MTU的大小是1500个八位字节,如下图,出来MAC目的地MAC源,802.1Qtag,以及长度,中间一大块有效载荷段(payload)有46到1500Octets的长度,


(2)在遵循IEEE 802.11无线局域网、无线LAN标准的Wi-Fi的情况下,您可以看到2304个八位字节的最大大小MSDU(MAC服务数据单元)MTU和MPDU(即包含了MAC协议数据单元,这将包括帧控制、持续时间ID、地址、FCS,MSDU),在IP v4和IP v6里头MSDU都是2304Octets,


5.标识(Identification)(16bits)

这是唯一鉴别IPv4包的方法,它与源地址,目的地址,和协议领域一起使用下面会说到。


6.标志和片偏移(Flags and Fragment Offset)(Lfl=3bits LFr=13bits)

这个是非常有用的一个功能那就是分组碎片化,即当一个数据包太大不能通过网络的时候需要把它大卸八块才能传输。

1.先来看看这个Flag,其中只有两个字节有被用到

(1.1)0号字节是预留的,设置成0。

(1.2)1号字节是DF表示不用碎片化,1号字节为1时表示真即不用碎片化,为0就是假表示可能要碎片化,当Bit1为1时就跳过了,为0时开始检查Bit2。

(1.3)2号字节是MF表示要去碎片化,2号字节为1时表示碎片化就这样不断循环下去,0时表示这是最后一个碎片了。


2.片段偏移(Fragment Offset)(13 bits)

这表明原始数据报中的这个片段属于哪里,而除了最后一个片段以外的片段必须包含一个数据字段,这是长度为64字节的单位.通俗来说拿2.1~2.4中的书集做例子这就是箱子编号。


7.生存时间(TTL)(8 bits)

它指定数据包允许在Internet中保留的秒的时间长度。IP分组通过的每一个路由器都应该至少减少一个TTL。TTL与该项中的跳数相似,如果TTL字段在到达目的地之前变为零,则该分组将被丢弃,这个在level.1有提到,可以参考level.1的Week 5(part 2)


8.协议(Protocol)(8 bits)

这句话很重要中文翻译不来:This identifies the type of the next header in the packet directly following the IPv4 header.然后这个协议(IP v4型)将会一直指示下去,第三层...第四层...还有最后的载荷段层(下图)。


这是protocol代号,每个号码对应一个协议,其中就有最流行的TCP/UDP,也可以看到ICMP,它是Internet控制消息协议,还有OSPF,用来执行路由路径的建立。


9.报头校验(Header Checksum)(16bits)

报头校验和包括错误检测码,使得IPv4分组报头受到保护,但它不保护IP分组的有效载荷部分,包中的领域确实发生了变化,当它们改变时,重新计算报头校验和每经过一个路由器的时候都需要检查错误,因为这里面的一些领域在路由的过程中会发生变化就比如TTL领域和Flag领域等等。


10.地址(address)(32 bits)

地址分为五ABCDE类而CIDR,这是无类别的域间路由表示法现在使用得更为流行

(1)这是一种有效地分配IP地址和启用IP路由的方法,1993由IETF提出,取代了分类IP地址,因为ABCDE类的子网太大了使得IP的使用效率不高,A lot of IP addresses had unused, reserved, wasted IP addresses,CIDR使得Internet更加的具有可延展性,因为网络可以分配一个合适的子网出来。

(2)CIDR基于其实际网络规模和短期预测需求,使IPv4和IPv6地址块分配给organizations,也可以用于将IPv4和IPv6地址空间分配给因特网服务提供商以及最终用户,可变长度子网掩蔽(VLSM)是CIDR使用的一种技术


拿123.234.100.56/24做例子,我们从中可知子网掩码是255.255.255.0,我们通过原来的IP地址可以知道路由前缀是123.234.100.0,这样,前缀知道了,所需子网也知道了,就可以去分配空间了,前缀参考资料:https://blog.youkuaiyun.com/hrl7752/article/details/78037033

表示示例
例10.2.1:
ip prefix-list 2 permit 2.2.2.0/24 //(匹配前24位:2.2.2.* ,掩码必须为24位)
例10.2.2:
ip prefix-list 2 permit 2.2.2.0/24 ge 25 le 30 //(匹配前24位:2.2.2.* ,掩码必须为25-30    位)
例10.2.3:
ip prefix-list 2 permit 2.2.2.0/24 le 32 //(匹配前24位:2.2.2.* ,掩码必须为24-32位)
例10.2.4:
ip prefix-list 2 permit 2.2.2.0/24 ge 26 //(匹配前24位:2.2.2.* ,掩码必须为26-32位)
例10.2.5:
ip prefix-list 3 permit 0.0.0.0/0 le 32  //(匹配所有)
(3)对于CIDR IPv4和V6地址分配,IANA(Internet指定号码权限)分配区域Internet注册表,即RIR、CIDR块。RIR、CIDR被分配给国家和巨大的领土。RIRS被细分为LIR,LIR是本地互联网注册子网,进一步细分为适合本地网络大小的子网。

11.选项和填充(Options & Padding)(32bits)

选项领域被用来向主机发送请求,在选项的末尾,包括填充,填充是被用来确保IP v4报头的长度是个32bit的倍数(通过填充一些bits,相当于补位),2中的IHL就会被padding拿来考察是否长度上有匹配。


<think>嗯,用户想在RK3568开发板上通过网口实时传输MIPI摄像头(OV8858)的视频流。这个问题看起来需要综合硬件配置、驱动支持、视频采集、编码和网络传输几个方面。首先,我需要确认OV8858是否被RK3568的Linux内核支持。根据引用[2],V2.5Beta3版本的Linux镜像已经包含了OV5640和ADV7180的驱动,但OV8858可能需要另外的驱动支持。用户可能需要确认内核配置或者从厂商获取相应的驱动。 接下来是硬件连接部分。RK3568的MIPI-CSI接口需要正确连接到OV8858,可能需要检查硬件线路是否正确,信号转换是否需要,不过OV8858本身是MIPI接口的话,可能不需要DVP转MIPI转换器,但引用[1]提到如果需要用DVP摄像头则需要转换器,这里用户用的是MIPI的OV8858,所以可能不需要,但需要确认硬件兼容性。 然后是V4L2的应用层开发。根据引用[3],V4L2框架提供了标准的接口,应用程序需要按照这个规范来采集视频。所以用户需要编写V4L2程序来打开摄像头设备,设置格式,获取缓冲区,读取数据。这部分需要详细步骤,比如打开设备、查询能力、设置像素格式(比如YUYV或MJPEG)、申请缓冲区、开始采集等。 编码部分,考虑到实时传输,可能需要使用硬件编码,比如H.264。RK3568的VPU是否支持H.264编码?可能需要检查内核是否启用了相应的编码模块,比如MPP(Media Process Platform)。然后使用库如GStreamer或者ffmpeg来进行编码,或者直接调用MPP的API。 网络传输的话,可以考虑使用RTP协议传输H.264流,或者RTMP推流到服务器。需要选择合适的传输协议和库,比如live555用于RTP,或者librtmp用于RTMP。另外,需要考虑网络带宽和延迟,调整编码参数。 另外,引用[4]提到Debian系统下MIPI摄像头走UVC接口,但这里可能需要确认OV8858是否被识别为V4L2设备。如果驱动正确,应该可以通过/dev/videoX设备节点访问。 步骤可能包括:1. 确认驱动和硬件连接;2. 编写V4L2采集程序;3. 编码视频流;4. 通过网络传输编码后的数据。每个步骤都需要详细配置,比如内核配置、设备树配置、V4L2参数设置、编码参数优化、网络协议选择等。 可能遇到的问题包括:驱动不支持OV8858,需要自己移植;编码延迟过高;网络传输丢包等。需要逐步排查,比如先用v4l2-ctl测试摄像头是否正常工作,再测试编码性能,最后测试网络传输。</think>根据RK3568平台特性和V4L2框架要求,实现MIPI摄像头视频流传输的步骤如下: ### 一、硬件与驱动配置 1. **设备树配置** 在`arch/arm64/boot/dts/rockchip/rk3568.dtsi`中添加OV8858节点: ```dts &csi2_dphy0 { status = "okay"; ports { port@0 { reg = <0>; #address-cells = <1>; #size-cells = <0>; csi_dphy_input0: endpoint@0 { remote-endpoint = <&ov8858_out>; data-lanes = <1 2>; }; }; }; }; &i2c3 { ov8858: camera@10 { compatible = "ovti,ov8858"; reg = <0x10>; clocks = <&cru CLK_CIF_OUT>; clock-names = "xvclk"; pinctrl-names = "default"; pinctrl-0 = <&cif_clk>; reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; port { ov8858_out: endpoint { remote-endpoint = <&csi_dphy_input0>; data-lanes = <1 2>; }; }; }; }; ``` 2. **内核驱动验证** 执行`v4l2-ctl --list-devices`查看是否识别到`/dev/video0`设备[^3] ### 二、V4L2视频采集实现 ```c #include <linux/videodev2.h> int main() { int fd = open("/dev/video0", O_RDWR); struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .fmt.pix = { .width = 1920, .height = 1080, .pixelformat = V4L2_PIX_FMT_YUYV } }; ioctl(fd, VIDIOC_S_FMT, &fmt); // 设置采集格式 struct v4l2_requestbuffers req = {0}; req.count = 4; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; ioctl(fd, VIDIOC_REQBUFS, &req); // 申请缓冲区 // 映射缓冲区并启动采集... } ``` 需实现缓冲区队列管理、DMA内存映射等完整采集流程 ### 三、视频编码处理 推荐使用Rockchip MPP硬件编码: ```bash gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=YUY2 \ ! mpph264enc ! h264parse ! rtph264pay config-interval=1 pt=96 \ ! udpsink host=192.168.1.100 port=5000 ``` 该GStreamer流水线实现H.264硬编码和RTP封装[^4] ### 四、网络传输优化 1. **QoS参数设置** 通过`setsockopt`配置Socket参数: ```c int opt = 0x10; // IPTOS_LOWDELAY setsockopt(sockfd, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); ``` 2. **自适应码率控制** 使用WebRTC拥塞控制算法: $$ B_{n+1} = \begin{cases} 1.05B_n & \text{丢包率} < 2\% \\ 0.85B_n & \text{丢包率} > 10\% \\ B_n & \text{其他} \end{cases} $$ ### 五、系统集成测试 构建完整系统架构: ``` +----------------+ +---------------+ +-------------------+ | OV8858 Sensor | --> | V4L2 Capture | --> | MPP H.264 Encoder | +----------------+ +---------------+ +-------------------+ | v +--------------+ +------------+ | RTP Packager | --> | UDP Socket | +--------------+ +------------+ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值