网络应用层和传输层

网络中有很多协议这些协议的不同导致了分层这一现象不同层的主要功能不一样。

应用层:应用程序。数据具体如何使用

传输层:关注起点和终点

网络层:关注路径规划

数据链路层:关注相邻节点的转发

物理层:硬件设备

应用层

1.根据需求,明确要传输的信息

2.约定好信息按照什么格式来组织

 (和程序员接触最为密切)应用程序。在应用层中,很多时候程序员会自定义应用层协议的(也有一些现成的应用层协议)。不要神话自定义协议,协议就是规定,其规定了数据如何进行传输。

如日常生活中的点外卖,(会涉及程序和服务器之间进行的网络通信交互)当我们点开外卖软件,我们其程序读取我们的位置信息之后,程序会会发送请求发送我们的位置信息和用户信息(一般会有格式对于请求来说,这里使用文本的方式。三个属性,使用”,“来分隔)假设程序构造出1000,100,30这样一个字符串组成的代码块,将其写入到TCP socket 或者UDP的socket中,

商家就会回复一些响应(格式和上面一样)响应有商家列表,商家的名称,图片,距离,简介,评分。如

李四麻辣烫,图片,地址,1.2KM,麻辣烫性价比之王,4.8

王五麻辣香锅,图片,地址,1.0KM,麻辣香锅中的神,5。等这样的响应类似这样的过程,就是自定义协议。无论使用什么样的格式来进行组织,只要客户端和服务器这边能够对应互相回应就好。

这种通过文本的方式构造的协议,一般不这样使用,开发中常见的几种格式。

1.xml

很早之前组织网络的格式,现在很少应用于网络通信(maven,会使用其管理项目配置),是通过标签来组织数据。并且其是一个通用的数据格式,有什么标签,标签的作用都可以自己定义。

请求:

<request>

    <userld>10000</userld>

    <position>100,30</position>

</request>

优势

让数据的可读性变得更好。

劣性

标签写起来非常繁琐,传输的时候也占用更多的网络带宽。

2.json(当下最流行的一种数据组织格式)

{

        userld:"1000",

        position:"20,23"

}

这种键值对结构{}将所有的键值对包裹起来。键值对之间使用”,“来进行分隔,键和值之间,使用”:“来进行分隔,键的格式固定为String类型,值无所谓。键得分号可以省略。

优势

可读性比较好;比xml简洁

劣势

会消耗额外得带宽(需要传输键得值),

虽然如此,json在网络通信中仍然非常流行,除非是一些对于性能要求比较高得场景不使用jspn之外其余很多地方都可以使用json.

3.protobuffer

于前两个相比,其(简称pb)使用二进制的方式来组织数据。可以保证带宽占用最低(将信息以二进制的形式压缩)

优势

占用带宽最低,传输效率最高,适合高性能场景

劣势

可读性差(二进制无法直接阅读),影响开发效率  

应用层也有一些现成的协议。最知名的,广泛使用的HTTP协议(超文本传输协议超文本不仅是文本还有图片视频音频等)

传输层

UDP:无连接,不可靠传输,面向数据报,全双工

TCP:连接,可靠传输,面向字节流,全双工

端口号

写一个服务器,必修手动指定一个端口号,通过端口号来区分当前这个主机的不同的应用程序

写一个客户端,客户端在通信的时候也会有一个端口号(代码感知不到),系统自动分配的

端口号固定2个字节表示的范围0~65535,一般情况下0不可用。1~1023称为”知名端口号“,给比较知名的一些服务器预留的(现在大部分当时知名的服务器已经不适用了,仍然在使用的22:ssh端口号,80:http服务器端口号443:https服务器端口号,使用服务器时也可以不使用这个端口号只是建议),1024~65535普通的端口号

UDP协议

前面分成四个部分,每个部分占2个字节。报头和载荷之间,可以认为是一个“字符串拼接”,这里是二进制的数据。

源IP目的IP不在这里,在网络层的IP协议中。

目的端口号后面是UDP报文长度:范围是0-65535 是64kb,因此使用UDP时很难表示一个较大的数据报。当一个业务的数据报已经接近64kb就需要要么将数据分成多个包,然后多个UDP传输但是开发成本和测试成本比较大()拆包以及如何进行组包,要么就直接使用TCP,TCP没有包的大小限制。

注:那么能否对其进行升级将两个字节变为4个字节,不行技术上可以实现,但是如果升级需要将世界上的所有设备一起升级才可以,因为一边升级不行,数据无法处理,无法进行通信。

UDP报文长度后面是UDP的校验和:检验和是什么?在网络传输中,由于一些外部的干扰,可能会导致数据传输出错的情况。光信号/电信号  磁场,电场,高能离子的干扰下,会导致某个地方本来是传输低电平,在干扰下会变成高电平,造成比特翻转,所以就需要来验证数据是否传输错误。校验和就诞生了。

检验和本质上是一个字符串,其体积比原始数据更小,又通过原始数据生产的,原始数据相同得到的校验和一定相同,反之,校验和相同原始数据大概率相同(不同的概论很低)。

怎样基于校验和来完成数据校验?

1.发送方将要发送的数据整理好(data1),通过一定的算法,计算校验和(checksum1)

2.发送方将data1和checksum1一起通过网络发送过去

3.接受方收到数据,收到的数据称为(data2)可能与数据1不同了,收到checksum1

4接收方根据data2重写计算检验和(根据相同的算法),得到checksum2

5对比checksum1和checksum2是否相同。不同data1和data2一定不同

如果相同,data1和data2大概率相同(不相同概率很小忽略不计)

如果checksum1过来的是错误的那么检查是否和checksum2更不可能相同了


通过这样的方式,就能发现数据传输出错

校验和的计算也有很多算法,此处UDP使用的是CRC(循环冗余算法)

把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这两个字节变量中,累加过程中出现溢出没事。如果中间的某个数据,出现传输错误,第二次计算的校验和和第一次就会不一样。这种不是非常靠谱的,导致两个不同的数据,得到相同的校验和的概率比较大 。前面的字节少1后面的字节多一。

所以有更厉害的MD5算法和sha1算法这里只介绍MD5算法

MD5算法是需要一系列的公式来将其转化为md5的。

1.MD5定义:无论你的数据多长,计算得到的MD5都是固定长度。校验和本身就应该不长,要不然不方便网络传输。

2.分散:给定两个原始数据,哪怕绝大部分一样只有一个字节不同,得到的MD5值差距都会很大。因为这样的特性其也非常适用于hash算法。

3.不可逆:给原始数据计算MD5简单,反过来理论不可行,反过来计算的话计算量很庞大,超出算力极限

UDP特点在代码中感知的到 

1.无连接。UDP本身不会存储对端的信息,要在发送数据的时候,显示指定要传输给谁

 DatagramPacket requestPack = new DatagramPacket(request.getBytes(),request.length(),
                    InetAddress.getByName(sereveIp),serverPort);//创建一个数据报来传输用户的内容
            socket.send(requestPack);//向客户端传输

2.不可靠性(代码看不出来)

3.面向数据报。通过DatagramPacket类的对象构成的数据报进行传输

DatagramPacket requestPack = new DatagramPacket(request.getBytes(),request.length(),
                    InetAddress.getByName(sereveIp),serverPort);//创建一个数据报来传输用户的内容
            socket.send(requestPack);//向客户端传输

4.全双工  socket既能传送又能接收

            socket.send(requestPack);//向客户端传输
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);//接收客户端返回的响应

基于UDP的应用层协议

NFS:网络文件系统

TETP:简单文件传输协议

DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议

并且包含自己定义实现的。

有一些应用层协议,基于UDP来实现的.其实并不算很多.
相比于UDP来说,TCP在更多的情况下,是具有优势的.很多时候,都是优先考虑使用TCP

 

  • 36
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值