【javaWeb】网络原理__传输层重点协议---UDP协议


程序员在应用层这里,最主要的工作就是自定义协议。下四层都是在操作系统内核/驱动程序/硬件中已经实现好了。咱们只能去了解不能去修改。应用层协议,则是咱们可以自定义的。
明确自定义协议主要做两件事:

  1. 明确协议数据主要传递那些信息(根据需求来的)
  2. 明确数据的组织格式,比如可以按照纯文本的方式。也可以使用xml,json,protobuffer.

除了上述自定义的协议之外,也有一些大佬已经设计好了的,现成的协议,最典型的就是 HTTP/HTTPS 协议。HTTP及HTTPS是应用层重点协议,我们会在Web开发中学习。

传输层虽然是操作系统内核已经实现好了,但是程序员写代码,要调用系统提供的 socket api 完成网络编程的。socket 就属于传输层的部分。我们程序员也需要了解这些协议。

UDP协议

端口号

端口号起到的效果就是区分一个主机上具体的应用程序的。要求在同一个主机上,一个端口不能被多个进程绑定。数据库 MySQL 默认的端口号是 3306,此时要是另一个进程B 也要尝试绑定 3306,进程 B 绑定操作就会出现失败。(抛出异常了)

端口号是传输层协议的概念。TCP 和 UDP 协议报头中都会包含 源端口 和目的端口。这两个协议的端口号都是使用 2 个字节,16 个 bit 位来表示的。一个端口号的取值范围,0 -> 65535.

在最初学习C语言的时候就知道不同字节的长度,表示的数据范围。
在这里插入图片描述

咱们自己写的程序,绑定的端口,得是从 1024 起得
0 -> 1023 这个范围的端口,称为”知名端口/具名端口“,这些端口号是属于已经分配给了一些知名的广泛使用的应用程序了。
我写一个代码就非要指定一个在1024以内的端口行不行?

  1. 先确定你使用的这个端口确实没有程序在绑定。
  2. 确定你要有管理员权限

1023以下的端口,也不是完全不能用的,只是不建议。这些端口虽然被分配给了特定的应用程序,但是这个程序具体在你的电脑上是否还在运行着,电脑上是否安装了这些程序,都是不一定的。
这个就好像是飞机的头等舱和经济舱。如果你是经济舱的乘客,头等舱这里还没有满,是否可以坐到头等舱去?很明显,是不行的。想去头等舱的厕所,头等舱厕所没人空姐也不让你上。

UDP协议端格式

udp协议的特特点: 无连接,不可靠传输,面向数据报,全双工。
UDP 协议报文结构:
在这里插入图片描述
这张图,任何一个计算机网络的教科书上都有,而且都是这样画的,但实际上这么画不够严谨(为了书排版方便,变形了)

真正的UDP协议报文结构:
在这里插入图片描述
UDP 就会把载荷数据(就是通过 UDP socker,也就是 send 方法拿来的数据)基础上再在前面拼装(类似于字符串拼接,注意此时是二进制,不是文本的)上几个字节的报头
UDP报头里就包含了一些特定的属性,就写代理一些重要的信息。
不同的协议,功能不同,报头中带有的属性信息就不同。对于 UDP 来说,报头一共八个字节,分成四个部分(每个部分两个字节)

报文长度

UDP 报文长度:
也是用两个字节来表示的。两个字节表示的范围只 0 -> 65535, 换算单位就是表示64K的一个数据,所以一个UDP 数据报,最大只能传输 64K 的数据。我们手机随便拍一张照片就要几个MB,这个传输数据最大值实在是太小了。
如果应用层数据报,超过了64KB 怎么办呢?

  1. 就需要在应用层,通过代码的方式针对应用层数据报进行手动拆包,拆成多个UDP 数据报进行传输(本来send 一次,现在需要 send 多次了)。
  2. 不用UDP,换成 TCP(TCP 没有这样的限制)

这两种解决方式,方案二更好一些。因为使用方案1,就会多写很多的代码,还得进行测试,还得处理很多BUG —> 工作量变多了 --> 工作时长变长了,多加班,幸福感降低了。

校验和

校验和:作用是验证传输的数据是否正确的。网络传输的过程中,可能会遇到一些干扰会出现”比特反转“的情况。就像是0 -> 1,1 -> 0
网络传输本质上就是光信号/电信号,这些信号可能会受到一些物理环境的影响。电厂/磁场/高能射线。
比如: 1111 0000 -> 1111 0001.
一旦数据变了,对于数据的含义可能是致命的。典型的例子,程序中经常使用 1 表示某个功能的打开,0 表示关闭。本来网络数据报是想开启功能,结果因为翻转,导致变成了关闭。
因此就引入了校验和来进行鉴别。校验和是针对数据内容进行的一系列的数学运算,得到一个比较短的结果(比如两个字节)。
如果数据内容一定,得到的校验和结果就一定。如果数据变了,得到的校验和也就变了。
在这里插入图片描述
假设数据传输过程出错了,但是计算得到的校验和 与 之前的校验和恰好一样。是否可能会出现这种情况?
这种情况理论上存在,工程上出现这种情况的概率极小,忽略不计了。如果内容相同,得到的校验和一定相同。检验和相同,原始内容,不一定相同(存在极小概率事件)。但是在工程实践中,这种情况忽略不计了,一般认为 校验和相同,原始内容也相同。

网络传输过程中,往往会把数据中的所有字节都参与生成校验和的运算中,这样任何一个字节出现问题,都能及时发现。
针对网络传输的几个数据来说,生成校验和的算法有很多种。其中比较知名的几个:

  1. CRC

    • 循环冗余校验,简单粗暴,把数据每个字节,循环往上累加。如果累加溢出了,高位就不要了。 优点是容易计算,但是检验结果不是特别理想。万一你的数据同时变动了两个bit 位(前一个字节少1,后一个字节多1 这种)。就会出现内容变了,CRC 没变的这种情况。
  2. MD5

MD5不是简单的相加,有一系列公式,来进行复杂的数学运算。(数学问题)
MD5 算法的特点:

    1. 定长。 无论你的原始数据有多长,得到的MD5 值都是固定长度(4 字节版本,也有 8 字节版本……)
    1. 冲突概率很小。原始数据哪怕只动一个地方,算出来的 MD5 的值会差别很大。(让MD5 结果更分散了。)
    1. 不可逆。通过原始数据计算 MD5 很容易,但是通过 MD5 值还原成 原始数据(找到哪个数据生成了这个 MD5 的) 很难,理论上是不可实现的(计算量极大)。

MD5的解密,本质上是打标。也就是把一些常见字符串的MD5 值算好了保存起来。然后进行查表。本质上MD5是不可逆的,通过打表的方式能够解密一部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值