二进制与UDP协议


前言

提示:本文主要针对java的代码讲解:

学过计算机的人都清楚的一件事,那就是计算机的底层组成就是有二进制组成;所有的都可以用零和一来组成,也就是是和否。


一、二进制与udp基本概念

二进制:(来自百度百科)
二进制(binary),发现者莱布尼茨,是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。数字电子电路中,逻辑门的实现直接应用了二进制,现代的计算机和依赖计算机的设备里都使用二进制。每个数字称为一个比特(Bit,Binary digit的缩写) 。

udp(User Datagram Protocol):(来自百度百科)
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 描述了 UDP。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。

以下介绍来源均来自:https://pdai.tech/md/develop/protocol/dev-protocol-udp.html
图片来源:https://pdai.tech/_images/develop/network/dev-network-udp-1.png

UDP的首部格式
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
图片来源:https://pdai.tech/_images/develop/network/dev-network-udp-2.png

源端口: 占16位、源端口号。在需要对方回信时选用。不需要时可用全0。
目的端口: 占16位、目的端口号。这在终点交付报文时必须使用。
长度: 占16位、UDP用户数据报的长度,其最小值是8(仅有首部)。
检验和: 占16位、检测UDP用户数据报在传输中是否有错。有错就丢弃。

请注意,虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字

-------------------------------------------------------------分割线-------------------------------------------------------------------

字节(bit):
计算机中最小的单元单位,一个字节在计算机中占8位,一位能存放的最大数字为1最小为0,所以这也是计算机只认识0和1的原因,为什么是0和1大家可以将一个字节理解为8个并联的灯泡,每个灯泡上都有开关,当灯泡亮起时表示1,灯泡熄灭时表示0,那么一个灯泡就有两种状态;那么理所当然8个灯泡的组合状态就可以用数学来表示,即2^8 =256种状态,但全部关闭也是一种状态,即0表示全部关闭可得出一个字节的最大值为0~255。
在这里插入图片描述

java中

在java中有基本常量属性byte占一个字节,但是学过java的应该都知道byte最大的取值范围为-128~127,区分正负数,但是表示状态的还是256种,并且java中没有无符号的概念。
正数计算:
在这里插入图片描述
负数计算:
在这里插入图片描述

C语言中

上面说到java中不存在无符号的概念,但是在c语言中他是有类型用来区分有无符号的,即在原本的首位不参与运算变成首位参与运算,并且无符号时只能为正数。

提示:IP属于个人题外话,刚好讲到了计算机中一个字节的最大取值范围为255,就拓展讲解一下:
IPV4:
相信自己设置过IP的值的大家,看到255这个数字就可以联想到一个和电脑息息相关的东西,那就是IP地址;自己设置过IP地址的应该也知道IP分4段每一段最大的设置值就为255。

二、java代码二进制

byte的实际最大存储

虽然java中没有区分的无符号的类型,但是一个字节大的存储值为255(示例):

public void  testDemo(){
        byte b = (byte)255;
        System.out.println(b);
        System.out.println(Integer.toBinaryString(b));
    }

打印截图如下:
由于这里使用的是Integer的方法所以会超出一个字节原本的长度,大家只需要关心后8位即可
在这里插入图片描述

当我们把方法中的255转换为256时,这个时候256就超出了一个字节所能存储的最大值,这个时候我们再来看看打印结果:

public void  testDemo(){
        byte b = (byte)256;
        System.out.println(b);
        System.out.println(Integer.toBinaryString(b));
    }

打印截图如下:
在这里插入图片描述
总结:上图我们可以看出当把256强转进byte时最后打印的结果为0,这是因为256存放需要占9位,而byte最大只有8位,超出即为0

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值