马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
互联网中,主流的是 TCP/IP 五层协议
- 5G/4G 上网,是有自己的协议栈,要比 TCP/IP 更复杂(可以或许把 TCP/IP 的一部门内容给包罗进去了)
应用层
可以代表我们所编写的应用步伐,只要应用步伐内里用到了网络通讯,就可以以为这个代码就是属于应用层的代码
一样寻常开辟中最常用到的一层:
- 使用大佬们已经创建好的应用层协议
- 应用层着名的协议有许多,此中的佼佼者就是 HTTP
- 自己界说应用层协议
- 别的四层都是操纵体系/硬件/驱动已经实现好了的,我们不大概“自界说”,只能使用人家的
协议就是约定
- 按照自己的规则,约定通讯方式——>自界说应用层协议
自界说应用层协议
自界说应用层协议,具体要做什么事变:
明确要通报的信息
举个例子:开辟一个外卖软件,打开软件后,起首必要展示一个“商家列表”
此处就必要先确定通报的信息是什么
- 哀求:用户是谁(用户的 ID),用户所处的位置
- 相应:商家列表,包罗多个商家,每个商家书息中,又有商家的名字、图片、隔断、评分
这里的信息怎样确定,都是根据当前的需求来产生的
明确构造信息的格式
- 明确构造这些信息的格式
针对信息构造格式,也有许多种方式,使用哪种方方式都可以,只要确定前段和后端是同一种方式就可以了
举个例子:使用行文本的方式来构造上述数据
- 哀求:用户id,用户位置\n
- 相应:商家的id,商家名称,商家的图片地点,商家的隔断,商家的评分\n
关于构造数据的格式,尚有一些说法,上述“行文本”简单粗暴的方案,在现实开辟中,很少会如许做
XML 方案
Maven 中就访问到,通过“成对的标签”表现“键值对”信息
- <request>
- <userid>1001</userid>
- <postion>E45N60</postion>
- </request>
复制代码
- 可以通过 XML 来传输网络数据,也可以作为步伐的设置文件
- 不外 XML 举行网络传输的时间,又有一个显着的缺点——会斲丧大量的带宽
- 网络通讯中,带宽是一个非常贵的硬件装备
- 在传输标签的时间,都得传输成对的标签,传入的信息更多
- 以是现在 XMl 一样寻常都是在设置文件,不举行网络传输了
- XMl 内里的标签(键值对)都是步伐员固定的,而 HTMl 内里的标签都是固定的(已经有一套尺度,约定好哪些标签是正当标签,这些标签都是什么寄义)
JSON 方案
当前主流的网络通讯的数据格式,相比 xml 来说,可读性是很好的,同时能节流肯定的带宽
- {
- "userid":1001,
- "postion":""E45N60"
- }
复制代码
- JSON 也是“键值对”格式,
- 键和值之间用 : 分割
- 键值对之间用 , 分割
- 全部的键值对,都使用 {} 括起来
- 这里的标签都只有一份,不必要竣事标签了,节流了通报开销
YML(YAML)方案
欺凌要求了数据构造的格式,欺凌要求写成“可读性非常高”的格式
- 键值对必须独占一行
- “嵌套”结构必须通过缩进来表现
protobuffer方案
前三个方案,都是关注可读性,而 protobuffer 关注性能,断送了可读性(通过二进制的方式构造数据)
- protobuffer 直接通过“位置”约定字段的寄义,不必要传输 key 的名字,也会针对传输的数值,举行二进制的编码,起到一些“压缩”的结果
- 极大地缩减了要传输的数据的体积——>带宽斲丧就越小——>服从越高
- 但二进制数据无法肉眼阅读,调试干系步伐的时间,就会比力贫苦
常见端标语
端标语是一个整数,用来区分差别的进程。
- 同一时间,同一个呆板上,同一个协议,一个端标语只能被一个进绑定
- 一个进程可以绑定多个端标语
- 端标语是通过两个字节的无符号整数表现的,取值范围 0~65535,但现实上 0 比力特别,一样寻常不会使用
- 1~1023 属于已经被预定好的(有一些着名的服务器,已经提前预定了这个端口),如许的端口称为“着名端标语”(着实内里的大部门服务器已经不再使用了,在 80、90 年代是着名的)
- 我们一样寻常开辟的时间,会避开这些端口
业务端口和管理端口
什么时间会涉及到一个进程(服务器)绑定多个端口?
- 编写服务器,肯定必要先绑定至少一个端标语,和客户端举行交互(称为“业务端口”)
- 服务器运行过程中,盼望可以或许对这个服务器的运动,举行一些“控制”
- 比如让服务器重新加载某个数据/某个设置/修改服务器的某个功能
- 也可以通过网络通讯完成上述功能
- 就可以让服务器绑定另一个端口,通过这个端口,编写一个客户端,给服务器发送一些“控制类“哀求
- 上面的“另一个端口”就是“管理端口“
调试端口
当必要针对服务器运行状态举行检测和调试,必要检察服务器运行中某个关键变量的数值的时间,千万不能用调试器来举行调试,一旦使用调试器调试这个服务,就会使服务器的一些线程被壅闭住,无法给客户端精确提供服务了
- 固然可以通过日记举行打印,但是不方便,必要修改代码并重启服务器
- 可以让服务器绑定另一个端口,然后实现一些干系的打印关键变量的逻辑,客户端发送对应的调试哀求
- 这里的“另一个端口”就是“调试端口”
长毗连和短毗连
长毗连
客户端连上服务器之后,一个毗连中,会发起多次哀求,吸收多个相应
- 一个毗连到底举行多少次哀求是不确定的,Echo Client 就是这种模式
短毗连
客户端连上服务器之后,一个毗连只发一个哀求,然后就断开毗连了
UDP 协议报头
学习一个网络协议,紧张就是学习“数据格式”/“报文格式”
源端口/目的端口
- 端标语是属于传输层的概念
- UDP 报头使用两个自己的长度来表现端标语
- 之以是端标语的范围是 0~65535,是由于底层网络协议做出了欺凌要求
- 假如使用一个 10 w 如许的端口,就会在体系底层被“截断”
- UDP 并不关心背面的正文内里是什么数据,只必要关心报头内里是怎么构造的
- 报头内里分为四个部门,每个部门固定是两个字节(16 bit),内里没有分隔符,就是通过固定长度来举行区分的
网络通讯中,涉及到四个关键信息:源 IP/目的 IP,源端口/目的端口
- 源端口:发出数据报谁人步伐使用的端标语——>发件人电话
- 目的端口:继承这个数据报的步伐使用的端标语——>收件人电话
- 源 IP:发出数据报谁人步伐的 IP——>发件人地点
- 目的 IP:继承这个数据报的步伐的 IP——>收件人地点
UDP报文长度
UDP报文长度:报头长度 + 载荷长度
- 长度单元是字节,
- 比如,报文长度 1024,——>整个 UDP 数据报就是 1024 字节;由于是两个字节来表现这个长度,以是最大值 65535——64 KB(65536/1024)
- 64 KB 放在本日,是个很小的数字,以是假如使用 UDP 协议传输一个很大的数据,就会变得很贫苦
UDP 用了许多多少年,不绝挺好用,但随着业务的发展,广告越来越多,越来越复杂,导致一个网络相应数据报的体积越来越大,徐徐迫近 64 KB。一旦数据凌驾了 64 KB,就大概到值数据被截断,如许广告大概就无法正常表现了。对于如许的情况,有两个办理方案:
- 把一个大的数据报,拆分成多个,分别举行传输
- 很快就被否决了;由于实现分包、组包的过程非常复杂,充满了不确定性
- 直接使用 TCP
- TCP 对于长度没有限定,其自身也带有可靠传输如许的机制,对于团体的通讯质量来说也是有利的
- 代码的修改资本比力低
校验和
条件:网络传输过程中,非常轻易出现错误
- 电信号/光信号/电磁波——>收到情况的干扰,使内里传输的信号发生改变
校验和存在的目的,就是为了可以或许“发现”大概“改正”这里的错误。就可以给传输的数据中,引入“额外信息”,用来发现/改正传输数据的错误
- 这里的额外信息就是 checksum
- 假如只是发现错误,必要携带的额外信息,就可以少一些(发现就会抛弃掉,不会让对方重发)
- 假如是想要改正错误,携带的额外信息就要更多(斲丧更多带宽)
举个例子:你妈让你去买菜,西红柿、鸡蛋、茄子、晃过,末了增补一句“一共四样”
- 这里的“一共四样”起到的作用就相当于是“校验和”。通过“一共四样”你可以对手里的菜举行查抄,有没有买多、买少
但如许的“校验和”并不能精确的辨认出题目,而且轻易误判。以是我们盼望校验和可以更严酷地查抄数据的内容,可以联合内容/内容的片断来天生校验和
- 比如你在默写金庸老师的十五部作品的名称,写完后,你可以通过“飞雪连天射白鹿,笑书神侠倚碧鸳”这一幅对联和你写的书名的第一个字对一下,若能对象,就说名此处的名字都是精确的
- 如许的校验和就是基于内容来举行校验的
- 固然堕落的数据恰好没有被校验出来,这可情况也是大概会发生的
- 但是一个精良的校验和算法,可以让上述题目发生的大概性非常低
CRC 校验和(循环冗余校验)
把 UDP 数据报整个数据都举行遍历,分别取出每个字节,往一个两个字节的变量上举行累加
- 由于整个数据大概会许多,以是加着加着大概就结果溢出了,但溢出也没关系
- 我们重点关心的不是终极加和是多少,而是校验和结果是否会在传输中发生改变
比方:我们去传输一个 UDP 数据报
- 发送方整合整个 UDP 数据,基于这些数据,盘算得到一个 checksum1
- 吸收方收到的数据:
- 吸收方就可以根据数据的内容,按照同样的算法,再算一遍校验和,得到 checksum2
- 假如传输的数据在网络通讯过程中,没有发生任何改变,则肯定有 checksum1 == checksum2
MD5 算法
本质上是一个“字符串 hash 算法”
特点:
- 定长:无论输入的字符串长度多长,算出的 MD5 的结果都是固定长度——>得当做校验和算法
- 分散:输入的字符串哪怕只有一点点发生改变,得到的 MD5 的值都会相差很大——>得当做 hash 算法
- 不可逆:根据输入内容,盘算 MD5 非常简单,但是假如想通过 MD5 值还原出原始的内容,理论上是不可行——>得当作为加密算法
|