持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug..
- 掘金LV3用户 juejin.cn/user/bug..
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
- 华为云云享专家 bbs.huaweicloud.com/bug..
本章重点
- 了解应用层协议
- 了解传输层
UDP/TCP网络传输协议! - 重点了解
TCP可靠传输背后的机制 - 重点掌握三次握手和四次挥手
- 重点掌握网络层
IP协议
网络编程原理进阶
我们的进阶内容比网络编程初始比较深入!我们通过这一章节的学习可以掌握网络编程原理,对网络编程有了初步认识! 我们这里的学习也从五层网络协议逐层进行学习! 我们先来复习一下这五层协议的功能
- 应用层
应用层协议主要由程序员编写,指定发送的信息和发送的信息的格式
重点学习
htttp协议 - 传输层
传输层协议报头保存了源端口和目的端口,用来明确两台主机交换的服务器
重点学习
TCP/UDP协议 - 网络层 网络层协议报头保存了源IP和目的IP,明确了网络传输的主机位置
- 数据链路层 数据链路层是由一些路由器/交换机,保证了相邻设备的传输,并且数据链路层,帧头保存了每次相邻设备的位置信息会不断的更新数据!
- 物理层 物理层就是硬件设备
我们重点掌握 应用层和传输层协议! 像其他3层协议身为搬砖程序员不需要了解,这是操作系统内核,除非是系统开发工程师,驱动开发工程师!
应用层
我们知道应用层协议得我们程序员自己编写! 突然就一整个头大了,这咋编写呀,不要慌问题不大! 我们只需要明确需求,根据需求确定需要传输的信息,还有传输信息的格式! 我们根据传输的信息和传输的格式就可以完成了一个应用层协议的组织! 就是我们发送的请求,另一台主机可以根据这个应用层协议,获取到请求信息,然后发送响应! 就好比前端有一个需求请求,请求发送的后端,后端根据应用层协议就可以获取到请求内容给出具体响应,完成强后端的交互过程!
传输的信息
例如:我们有一个图书馆借阅查询的请求!
我们就要明确传输的信息!
(前端发送的请求)
1.用户id
2.查询的起始时间
3.查询的结束时间
这就是我们要传输的信息,明确了请求信息,我们后端就要根据请求给出响应信息!
(后端返回的响应)
1.查询成功(成功标志)
2.查询失败(失败原因)
3.结果数组(查询成功)
这里的结果数组就包含了响应信息
书籍名称
书籍借阅天数
是否已还
....
数据的组织格式 我们上面明确了传输的信息,当时还不够,我们需要约束数据的组织格式! 我们通过那种格式将数据进行传输,就好比你发送一个文件给好友,你要明确是用QQ发还是用微信发!而这里传输层协议也一样,我们需要约定数据的格式!
例如:我们以下面的格式进行传输!
请求格式形如: bug郭/t20220506/t20220611 响应格式: OK 三国演义/t29/t已还 水浒传/t3/t未还
上面的格式只是随便编写的一个格式,我们可以自行决定用那种格式进行传输,可以自行编写,只要保证请求和响应格式类型一样就可以!
这样自己编写格式,显然有点人编写的协议格式很拉垮,有点大佬写的格式很好!
而不同的数据组织格式 可读性和传输效率不同! 这时就有大佬发明了协议模板,我们只需要根据协议模板往上套即可! 协议模板
- xml
//xml格式
<标签名>内容</标签名>
可以看到xml数据组织格式和html相同由标签和内容构成,可读性好!
--xml格式请求
<request>
<id>bug郭</id>
<startTime>20220511</startTime>
<endTime>20220611</endTime>
</request>
--xml格式响应
<response>
<result>
<book>
<name>三国演义</name>
....
</book>
</result>
</response>
这里的xml虽然可读性很好,但是标签太多,用这种方式组织数据,传输时,传输效率不高,有很多无效数据,很吃带宽!所以xml一般用于编写配置文件,已经渐渐淡出应用层协议数据组织格式的舞台!
- json
json格式
{
键:值,
键:值,
键:值,
...
}
json格式数据组织格式!
由
{}保存一个json数据 键值对之间用,分割 键和值之间用:分割 最后一个键值对的,可有可无,json语法比较宽松,但是语法是不用的! 然后值可以是多种数据类型(数字,字符串,数字,json对象...) 这里的键默认是字符串,不需要用引号,但如果键中包含了特殊符号如空格,-就需要用分号保存! 这里的值字符串由引号保存,单引号和双引号都可(一般没有区分字符和字符串类型通用)
//json格式请求
{
name:'bug郭',
startTime:'20220506',
endTime:'20220611'
}
//json格式响应
{
ok:true,
reson:"",
data:[
{
bookname:"三国演义",
time:12,
state:"已还"
},
{
bookname:"水浒传",
time:3,
state:"未还"
}
]
}
可以看到json相较于xml可读性也很好而且比较简洁,这是如今主流的一种应用层协议数据组织的格式!
可读性好,效率高!
- protobuf
protobuf格式是纯二进制数据格式!
通过数据的顺序或者一些特殊符号来区分每个字段!
十分简洁,传输效率高!
我们会疑惑,二进制文件,那我们咱看得懂,怎样组织数据呀!
protobuf通过一个文件IDL请求方和响应方通过这个文件就可以知道每个数据是什么意思,用来描述数据格式,是一个辅助开发的工具!类似于C语言结构体!
这里就不做举例了!
显然这中格式的传输效率高,但是可读性差,不利于开发!
开发效率会下降!没有json主流!
通过上述对传输信息的学习和数据组织格式的学习我们可以知道应用层协议的设计也并不是很困难!
- 只要我们明确传输的信息(根据需求)
- 明确数据组织格式(参考现有模板xml,json,protobuf..)
除此之外,业界还有一些现成的,已经设计好的协议
我们并不是任何时候,都要自己从0开始设计一个应用层协议,我们也可以基于现有的协议稍加修改,进行二次开发!
最知名应用层协议就是http协议,我们后面会介绍!