目录
前言:
再谈协议
UDP协议
比较知名的校验和
小结:
前言:
UDP和TCP作为传输层非常知名的两个协议,那么将数据从应用层到传输层数据是怎样进行打包的?具体都会增加一些什么样的报头,下面内容详细介绍。
再谈协议
所谓协议就是双方约定的一种数据组织的格式。发送方按照约定来将数据进行封装,接收方同样也按照这样的格式进行解析。UDP是传输层协议,而上面的应用层也有相应的协议。一般应用层协议都是自定义的。
应用层业务是错综复杂的,没有办法使用一个大协议去规定所有业务的数据格式(很难有一个通用的协议,满足所有业务需求)。需要根据不同场景,不同业务使用相对适合的协议去约定数据的组织格式。
自定义协议首先要明确两点:
1)结合需求分析清楚,请求响应(客户端,服务器之间)要传递哪些数据。
2)明确数据以什么样的格式组织。客户端按照这样的协议组织数据,服务端同样按照这样格式去解析数据。
典型的数据组织格式:
1)XML标签化的数据组织方式,使用标签来表示键值对,用嵌套的方式表示树形结构。
2)json现在比较流行的数据组织格式。针对XML进行改进,使用大括号的方式来组织。
3)protobuffer谷歌研发的一种数据组织格式。二进制数据表示方式,针对数据通过二进制表示方式进行压缩。直观的不能观察,但是占用空间小,传输的带宽就降低了。
UDP协议
UDP协议针对要发送的数据进行封装,原始数据称为“载荷”(payload)。所封装的一些数据称为“报头”。
这张图在一些技术书籍上很常见,但实际这样画不是很确切。(书上为了排版方便)
解释:
1)
源端口,目的端口是一次通信中的五元组之二。指定发送方端口和接收方端口。
由于只有两个字节,无符号数范围就是0 -- 65535。因此端口号就需要在这个范围内, 0 -- 1023范围内端口号被称为知名端口号,就是比较知名的程序使用的端口号。我们在设置端口号不建议使用知名端口号,虽然知名端口号并没有全部使用完0 -- 1023范围内的所有端口,但是也是很可能产生端口冲突,导致程序抛异常。
2)
UDP报文长度指的是整个报文的长度。由于两个字节最大表示数据是65535,那么UDP报文长度最大也就是64kb。使用UDP一次最大传输64kb大小的报文。
那么如果我们要传输的数据大于64kb呢?将报文进行拆包,控制每个报文大小在64k以内。或者直接将UDP协议改为TCP协议传输。
3)
校验和,验证数据传输是否正确。高电平或者低电平,波长大的光信号或者波长小的光信号表示1和0,由于物理原因可能存在“比特位反转”0变1或者1变0。那么传输的数据就会有很大的差别。
校验和就是针对数据进行一系列数学运算,得到一个数字(如果数据不一致得到的数字也不一致)。在数据发送时也将校验和发送过去,然后得到的数据再进行一次校验和计算,比较这次计算的校验和和发送的校验和,看是否一致。这样就能判断数据是否发送正确。
比较知名的校验和
1)CRC(循环冗余校验)
简单粗暴,把数据的每个字节,循环往上累加。如果累加溢出了,高位就不要了。容易计算,但效果不是很理想。想想如果一位1变0,一位0变1,累加的数据也是不变的,就会出现问题。
2)MD5
MD5通过一系列公式进行数学计算。
特点:
1.定长:无论原始数据多长,得到的MD5值都是固定长度。
2.冲突概率小:原始数据只要变动一小部分,计算的MD5值都会差别很大(MD5结果更加分散)。
3.不可逆:通过MD5值还原成始数据,这个操作很难(计算量非常大)。一些简单的数据通过打表的方式可以还原一些。打表就是把常见的转换记录下来,然后查表转换。
3)SHA1
特点:
1.不可以从消息摘要中复原信息。(不可逆)
2.两个不同的消息不会产生同样的消息摘要,所以可以用摘要来校验信息是否正确。
小结:
理解封装的过程,会对我们进行网络编程有很大促进作用。