当前位置: 首页 > news >正文

计算机网络(3) 字节顺序:网络字节序与IPv4

一.小端与大端

小端(Little endian):低字节保存在内存低地址,高字节保存在内存高地址。

大端(Big endian):低字节保存在内存高地址,高字节保存在内存低地址。

例如(1400(十进制)): 内存地址        0x0000        0x0001

                                             数据(小端)      0x78            0x05              

                                             数据(大端)    0x05            0x78

        可以看出大端符合人类直觉,我们计算Hex时的表示方法其实是大端的表示。但是一般x86架构的计算机CPU使用的是小端。再举一个例子如下:

如果我们将0x1234abcd 写入到以 0x0000 开始的内存中,则Little endian 和 Big endian 模式的存放结果如下: 
地址           0x0000         0x0001        0x0002          0x0003
big-endian   0x12           0x34            0xab            0xcd 
little-endian  0xcd           0xab            0x34            0x12

二.网络字节序

        因为处理器架构的不同CPU内部使用的字节序也不尽相同,例如x86使用小端字节序,ARM使用大端字节序。为了在网络服务中统一字节序,我们规定网络字节序为大端字节序(Big endian)。因而针对不同的处理器架构,可能在进行网络编程时需要进行网络字节序的转换。

        在Linux下inet.h头文件提供了字节序转换相关的辅助函数如下:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);h表示主机序  
n表示网络序
s表示short类型
l表示long类型

        htonl表示将主机字节序转换为网络字节序(大端)且入参为uint32。使用转换函数必须特别小心,需要知道自己的平台架构信息,否则转换将导致错误。详细转换函数如下:

uint32_t htonl(uint32_t hostint32);
功能:将 32 位主机字节序数据转换成网络字节序数据
参数:hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型
返回值:成功:返回网络字节序的值
uint16_t htons(uint16_t hostint16);
功能:将 16 位主机字节序数据转换成网络字节序数据
参数:hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int
返回值:成功:返回网络字节序的值
uint32_t ntohl(uint32_t netint32);
功能:将 32 位网络字节序数据转换成主机字节序数据
参数:netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int
返回值:成功:返回主机字节序的值
uint16_t ntohs(uint16_t netint16);
功能:将 16 位网络字节序数据转换成主机字节序数据
参数:netint16:待转换的 16 位网络字节序数据,uint16_t,unsigned short int
返回值:成功:返回主机字节序的值

 三.IPv4

        IPv4地址用于在命名和识别一个网络设备,IPv4处于TCP/IP4层模型的网络层,它的长度为32Bits,也就是四字节。 格式形如A.B.C.D。

        子网掩码用于分辨两个不同的IP Addr是否处在同一子网段下,通过与子网掩码做与操作判断。如果与操作后得到的结果相同则在同一网段下。例如:192.168.1.111 192.168.1.104子网掩码为255.255.255.0(0xffffff00)与操作后结果都为192.168.1.0故这两个IPV4地址在同一网段下。

三.IPv4分配规则

 目前广泛使用CIDR分配规则,可以指定掩码长度。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Stack详解(含动画演示)
  • Hutool有哪些常用方法
  • 服务架构的设计原则
  • DS1338/PT7C4338串行实时时钟-国产兼容RS4C1338
  • 如何免费用 Qwen2 辅助你翻译与数据分析?
  • Excel根据身份证号提取信息
  • C语言详解(预编译)
  • App推广效果分析,Xinstall助力精准优化
  • 【wiki知识库】06.文档管理页面的添加--前端Vue部分
  • 记录pytest中场景执行的token异常处理问题
  • 加油卡APP开发,汽车加油便捷新方式
  • C++:调整数组顺序使奇数位于偶数前面【面试】
  • 创新共享经济:探索Web3对新商业模式的启迪
  • 【Python入门与进阶】Python函数的定义与使用
  • 随手记:商品信息过多,展开收起功能
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【347天】每日项目总结系列085(2018.01.18)
  • javascript 哈希表
  • jquery cookie
  • js算法-归并排序(merge_sort)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Python socket服务器端、客户端传送信息
  • SQL 难点解决:记录的引用
  • 从PHP迁移至Golang - 基础篇
  • 机器学习 vs. 深度学习
  • 盘点那些不知名却常用的 Git 操作
  • 前端攻城师
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 阿里云API、SDK和CLI应用实践方案
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (C)一些题4
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (实战篇)如何缓存数据
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)视频码率,帧率和分辨率的联系与区别
  • ../depcomp: line 571: exec: g++: not found
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .aanva
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET性能优化(文摘)
  • @test注解_Spring 自定义注解你了解过吗?
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [acm算法学习] 后缀数组SA
  • [AIGC codze] Kafka 的 rebalance 机制
  • [C++] sqlite3_get_table 的使用
  • [C++] 从零实现一个ping服务
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!