目录
端口号
在认识Udp协议之前,我们要先知道什么是端口号.
在TCP和UDP 协议报头中都会包含源端口和目的端口,这两个协议中的端口号都是使用两个字节来表示的.
2个字节,16 个bit位,所以一个端口号的取值范围是0->65535.
端口号起到的效果就是区分一个主机上的具体的应用程序的,要求就是在同一个主机上,一个端口号不能被多个进程绑定.
端口号也是传输层协议的概念.
我们自己在写程序的时候,绑定的端口号,得是从1024起的.
0->1023范围的端口,称之为是"知名端口号"或者是"具名端口号",因为这些端口号是已经分配给了一些知名的广泛使用的应用程序.
那么再写代码的时候如果非要指定一个1023以内的端口号就必须满足两个条件:
1.先确定要绑定的端口号确实没有程序在绑定.
2.确保你有管理员权限.
1023以下的端口,也不是完全不能用,只是不建议去用,这些端口虽然被分配给了特定程序,但是这个程序在你的电脑上是否在运行着,电脑上是否安装了这些程序,都是不确定的.
UDP协议
特点
无连接,不可靠传输,面向数据报,全双工.
无连接
知道对端的IP和端口号就直接进行传输,不需要建立连接.
不可靠传输
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息
面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并.
全双工
UDP的socket既能读,也能写,可以双向传输.
UDP协议的报文结构
教科书上的结构都是这样画的,但是实际上的结构不是这样的,因为排版所以变形了.
真正的报文结构应该是这样的:
结构是由报头部分+载荷部分构成.
2字节的源端口 发送方的端口
2字节的目的端口 接收方的端口
2字节的UDP报文长度
2字节的校验和
UDP会把载荷数据(就是通过 UDP Socket,也就是send方法拿来的数据,基础上再在前面拼接上几个字节的报头,此处类似于字符串的拼接,但此处是二进制的,不是文本的)
报头一共4个部分,一共8个字节,每个部分两个字节.
16位UDP长度,2个字节,最大能够表示64KB,那就说明了一个UDP数据报最大只能传输64KB的数据.
那如果应用层数据报,超过了64KB,怎么办?
1.需要在应用层,通过代码的方式针对应用层数据报进行手动的分包,拆包成多个包,通过多个UDP数据报进行传输.(本来 send一次,现在需要多次了)
2.不用UDP,换成TCP,TCP没有这样的限制.
校验和
作用是验证传输的数据是否是正常的.
校验和存在的意义
网络传输过程中,可能会受到一些干扰(网络传输本质上就是光信号/电信号的传输,这些可能会收到物理环境的影响,像电场/磁场/高能射线等等),在这些干扰下就有可能会出现"比特翻转"的情况.(0->1,1->0)
一旦数据发生改变,对于数据的含义,可能会产生极大的影响.
这些现象都是客观存在的,不可避免的,我们能做的就是,及时识别出当前的数据是否出现了问题.
所以,我们就引入了校验和来进行鉴定.
校验和原理
针对传输的数据内容进行一系列的数学运算,得到一个比较短的结果(比如两个字节),如果数据内容一定,得到的校验和就是一定的,如果数据变了,那么校验和也就变了.
如果数据内容相同,那么得到的校验和一定相同;校验和相同,原始内容不相同,出现这种情况的概率是极小的.所以在工程实践中,这种情况就忽略不计了,一般认为,校验和相同,数据内容就是相同的.
知名校验和算法
对于网络数据传输来说,生成校验和的算法有很多种.
其中比较知名的:
1.CRC
循环冗余校验,简单粗暴,把数据的每个字节,循环往上累加,如果累加溢出,那就舍弃高位.
这种算法比较好算,但是校验的效果不是特别的理想,万一数据同时变动了两个bit位(前一个字节少1,后一个字节多1),就会出现内容变了,CRC没变这样的情况.
2.MD5
MD5不是简单相加,而是有一系列的公式,来进行更为复杂的数学运算.
此算法的特点:
1)定长
无论你原始的数据有多长,得到的MD5的值都是固定长度(有4字节版本,8字节版本)
2)冲突概率很小
原始数据哪怕只变动一个地方,算出来的MD5的值都会差别很大.
3)不可逆
通过原始数据计算MD5,很容易,但是通过MD5还原成原始数据(找到是哪个数据生成了这个MD5)是非常困难的,理论上是不可实现的,计算量非常之大.
MD5这样的特点,就使MD5诞生了一下的作用:
a.校验和
b.作为计算hash值的方式
c.加密