理解网络字节序与主机字节序

 

主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:

  a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

  b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。

所以:在将一个地址绑定到socket的时候,请先将主机字节序转换成为网络字节序,而不要假定主机字节序跟网络字节序一样使用的是Big-Endian。由于这个问题曾引发过血案!公司项目代码中由于存在这个问题,导致了很多莫名其妙的问题,所以请谨记对主机字节序不要做任何假定,务必将其转化为网络字节序再赋给socket。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. ICMP协议报文格式 ICMP协议的报文格式如下: ``` +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | type | code | checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | identifier | sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data (variable length) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` 其中,各字段的含义如下: - Type:报文类型,占1个字节,表示ICMP报文的类型。 - Code:报文代码,占1个字节,表示具体的错误类型。 - Checksum:校验和,占2个字节,校验ICMP报文是否损坏。 - Identifier:标识符,占2个字节,用于在请求和响应报文之间进行匹配。 - Sequence number:序列号,占2个字节,用于标识请求和响应报文之间的顺序。 - Data:数据,可变长度,可以是原始报文或者错误信息等。 2. 不同类型ICMP报文的具体意义 ICMP报文包含多种类型,常见的有以下几种: - Echo Request和Echo Reply:用于Ping测试,通过发送Echo Request报文到目的主机,然后等待目的主机的Echo Reply报文,来检测网络是否正常。 - Destination Unreachable:表示目的主机不可达。 - Source Quench:表示发送方发送数据过快,导致网络拥塞,需要发送方减缓发送速度。 - Time Exceeded:表示数据包在路由器上转发时TTL值为0,导致数据包被丢弃。 - Redirect:表示需要更改路由器的默认路由,以便更好地到达目的主机。 - Router Advertisement和Router Solicitation:用于IPv6网络,用于路由器自动配置。 3. 常见的网络故障 常见的网络故障有以下几种: - 网络连接故障:包括物理连接故障、IP地址冲突等。 - 路由问题:包括路由器设置错误、路由器故障等。 - DNS问题:包括DNS服务器故障、DNS缓存问题等。 - 网络安全问题:包括黑客攻击、病毒攻击等。 4. TraceRoute的工作机制 TraceRoute是一种网络诊断工具,用于检测数据包从本地主机到目的主机经过的路径。它的工作原理是发送UDP数据包到目的主机,并在每个路由器上增加TTL值,这样每个路由器都会丢弃TTL值为0的数据包,并发送一个ICMP Time Exceeded报文给源主机。通过分析这些ICMP报文,TraceRoute可以确定数据包的路径。 5. 基于Python的ICMP报文的编辑与发送 可以使用Python的socket库来编辑和发送ICMP报文。具体步骤如下: - 创建socket:使用socket.socket()函数创建一个socket对象,指定socket类型为SOCK_RAW。 - 构建ICMP报文:使用struct.pack()函数将ICMP报文的各字段打包成二进制字符串。 - 计算校验和:对整个ICMP报文计算校验和,使用Python的checksum函数可以快速计算校验和。 - 发送报文:使用socket.sendto()函数将ICMP报文发送到目的主机。 6. 基于Python的ICMP活动主机扫描 可以使用Python的socket库和ICMP协议来实现活动主机扫描。具体步骤如下: - 遍历IP地址:使用Python的ipaddress模块遍历指定网段内的所有IP地址。 - 构建ICMP Echo Request报文:按照ICMP报文格式构建ICMP Echo Request报文。 - 发送报文:使用socket.sendto()函数将ICMP Echo Request报文发送到目标主机。 - 接收响应:使用socket.recvfrom()函数接收目标主机的响应报文。 - 解析响应:对接收到的ICMP Echo Reply报文进行解析,判断目标主机是否在线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值