写在开篇网上大神有很多写的篇篇都不错但若细细去品味来龙不知是为何我是初学员一个细拆细嚼也不错小马过河慢慢走终有登峰望天阔深水区不怕。一脚一脚踩过去就是了。类型字段能认出来谁是IP包、谁是ARP包、谁是DoIP包——那知道了又怎样IP包肚子里到底装的啥我这个人有个毛病不见棺材不落泪不拆到骨头不罢休。今晚就把IP包这身行头扒个精光。从前往后一个字段一个字段拆每个都告诉你“车上为啥这么选”。一、IP头长什么样先看全貌一个标准的IPv4头通常20字节按传输顺序长这样还是这样看着顺眼符合我这个常人思路后面拆的方式也更方面学习理解自我感觉还不错哦┌─────────────────────────────────────────────────────────────────────────────────────┐ │ IP头20字节按传输顺序 │ ├───────┬───────┬───────┬───────┬───────┬─────┬───────┬─────┬─────┬───────┬─────────────┬─────────────┤ │ 版本 │ 头长 │服务类型│总长度 │ 标识 │标志 │片偏移 │ TTL │协议 │校验和 │ 源IP地址 │ 目标IP地址 │ │ 4位 │ 4位 │ 8位 │ 16位 │ 16位 │ 3位 │ 13位 │ 8位 │ 8位 │ 16位 │ 32位 │ 32位 │ └───────┴───────┴───────┴───────┴───────┴─────┴───────┴─────┴─────┴───────┴────────────下面按顺序从第1个到第12个一个一个拆。字段1版本4位干啥的告诉对方“我是IPv4还是IPv6”。咋干的IPv4填4IPv6填6。车上怎么选填4IPv4。车上为啥这么选IPv6地址长、配置复杂车厂要额外花钱升级网络设备。目前车载以太网主流还是IPv4够用、便宜、稳定。IPv6等以后再说。没有它接收端不知道按什么格式解析IP头。字段2头长度4位干啥的告诉对方“IP头有多长”。因为IP头可以带“选项”长度不固定。咋干的以4字节为单位。标准IP头20字节20÷45填5。车上怎么选填520字节。车上为啥这么选IP选项车上基本不用。多一事不如少一事省得增加复杂度。没有它接收端不知道数据从哪开始。字段3服务类型8位干啥的告诉路由器“这个包优先级高不高要不要插队”。咋干的前6位是DSCP优先级后2位是ECN拥塞通知。车上怎么选一般填0普通优先级。车上为啥这么选车上优先级靠VLAN的PCP字段或TSN机制不走这个老路子。填0不影响功能。没有它不影响基本功能只是没了插队能力。字段4总长度16位干啥的告诉对方“整个IP包头数据有多长”。咋干的单位是字节。IP头20字节 数据长度 总长度。车上怎么选根据实际数据长度填。比如头20字节、数据1480字节总长度填1500。车上为啥这么选必须填对否则接收端不知道包在哪结束。没有它接收端不知道包在哪结束。字段5标识16位干啥的给同一批切出来的片贴同一个单号。咋干的每发一个大包计数器加1填进去。切出来的每一片标识都一样。车上怎么选由IP层自动生成不用手动配。车上为啥这么选摄像头一帧图像可能大于1500字节需要分片。标识让接收端知道“这几片是同一个包”。没有它不同包的片混在一起分不清谁是谁。字段6标志3位干啥的告诉对方“后面还有没有片”和“能不能切”。咋干的3个bit位名字取值bit 2MF还有片1后面还有0最后一片bit 1DF不许切1不许切0可以切bit 0保留必须0车上怎么选需要分片时MF1除了最后一片DF0不需要分片时MF0DF0车上为啥这么选摄像头图像数据一般控制在1500字节以内很少分片。但万一大了MF告诉对方“还有下一片”。没有MF位接收端不知道什么时候收完。字段7片偏移13位干啥的告诉对方“这一片在原包里的位置”。咋干的以8字节为单位。第一片偏移0第二片偏移第一片数据长度÷8。⚠️ 注意每片数据长度必须是8字节的整数倍最后一片除外。车上怎么选IP层自动算不用手动配。车上为啥这么选片偏移让接收端按正确顺序拼回去乱序也不怕。没有它不知道每片拼到哪。字段8TTL生存时间8位干啥的防止数据包在网络里无限瞎转。咋干的发送端设初始值常用64。每过一个路由器减1减到0就丢。车上怎么选常用64。车上为啥这么选车载网络跳数少摄像头→网关→域控制器最多3-5跳64足够。设太小可能半路被丢设太大浪费。没有它路由表配错了包能在网里转圈转到天荒地老。字段9协议8位干啥的告诉接收端“我肚子里装的是TCP还是UDP”。咋干的填数字。6TCP17UDP。车上怎么选摄像头图像填17UDP诊断升级填6TCP车上为啥这么选摄像头图像要快、不怕丢几帧用UDP。诊断升级要可靠、不能丢数据用TCP。没有它操作系统不知道该给TCP还是UDP。字段10头校验和16位干啥的检查IP头有没有被改坏。咋干的发送端校验和字段设0IP头按16位一组相加取反码填进去接收端同样算一遍结果是0说明没坏校验范围只校验IP头20字节不校验数据。车上怎么选IP层自动算不用手动配。车上为啥这么选传输过程可能有电磁干扰校验和能发现头有没有被改坏。数据校验由上层UDP/TCP自己负责各管各的。没有它头坏了也不知道。字段11源IP地址32位干啥的告诉对方“这封信是谁写的”。咋干的填发送设备的IP地址。车上怎么选摄像头填10.0.1.10网关填10.0.1.1。车上为啥这么选域控制器收到后想回复“收到图像”需要知道回给谁。没有源IP回复发不出去。没有它对方没法回。字段12目标IP地址32位干啥的告诉路由器“这封信要寄到哪”。咋干的填接收设备的IP地址。车上怎么选摄像头发给域控制器填10.0.2.20。车上为啥这么选路由器看目标IP决定往哪转发。没有目标IP包直接丢。没有它路由器不知道往哪发。一张表全搞定顺序字段长度干啥的车上怎么选车上为啥这么选1版本4位IPv4还是v6填4IPv6还没普及车厂没必要多花钱2头长度4位IP头有多长填5不带选项20字节够用3服务类型8位优先级填0优先级靠VLAN/TSN不走这4总长度16位整个包长度按实际填告诉接收端包在哪结束5标识16位同一批片的单号IP层自动生成分片时让接收端能拼回去6标志3位还有片吗能切吗MF1有片/0最后告诉对方“还有下一片”7片偏移13位这片在原包的位置IP层自动算按正确顺序拼回去8TTL8位还能活几跳64车载跳数少64足够9协议8位上层是TCP还是UDP图像用17诊断用6图像要快用UDP诊断要可靠用TCP10头校验和16位检查头有没有坏IP层自动算防传输错误数据校验上层负责11源IP地址32位谁发的填发送端IP让对方知道回给谁12目标IP地址32位发给谁填接收端IP路由器知道往哪转发我踩过的坑坑1以为TTL是“超时时间”。后来才明白TTL是“跳数限制”不是时间。坑2以为分片是“随便切”。后来才知道每片数据长度必须是8字节的整数倍最后一片除外。坑3以为IP头校验和能防篡改。后来才知道它只能防随机传输错误防不了人为篡改。坑4以为校验和校验整个IP包。后来才知道只校验IP头数据区由上层自己负责。坑5以为车上会用到IPv6。后来才知道IPv6在车上还没普及车厂没必要多花钱。下步目标IP头拆完了。下期搞TCP/UDP吧这两玩意也不好惹。下期预告TCP/UDP——啥握手不握手的。写在最后这一篇最大的收获IP包拆开了每个字段都知道“车上为啥这么选”。网上大神有很多写的篇篇都不错 / 但若细细去品味模糊不知是为何——所以我选择自己拆细拆细嚼。小马过河慢慢走终有登峰望天阔。慢即是快快即是慢。写完了886。老伙计第十六篇修改完成。