网络编程原理进阶
我们的进阶内容比网络编程初始比较深入!我们通过这一章节的学习可以掌握网络编程原理,对网络编程有了初步认识!
我们这里的学习也从五层网络协议逐层进行学习!
我们先来复习一下这五层协议的功能
应用层
应用层协议主要由程序员编写,指定发送的信息和发送的信息的格式
重点学习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协议,我们后面会介绍!
DNS
DNS:域名系统(Domain Name System)
啥是域名呢?
我们知道每台主机设备都有自己的IP地址!通过这个IP地址我们就可以访问该主机!
联系我们实际上网过程,难道我们访问一个网站的服务器是通过IP地址访问的嘛?
显然不是我们那能记得住那些IP地址呀,如果访问一个服务器都要记下一个IP地址那谁还上网对吧!
域名系统就很好的解决了这个问题!我们的IP地址记不住就算了!
DNS通过一串英文单词标记一个IP地址,这一串英文单词就是这个网站的域名,通过这个域名就可以找到这个网站服务器的IP从而访问到服务器!
DNS就是管理域名的
刚开始时这些域名和IP地址的映射关系,保存在我们主机的系统文件中,通过这个文件,主机就可以根据域名找到IP地址!
系统中的这个hosts文件就保存着域名和IP地址的映射!
可以看到文件中这里IP127.0.0.1 通过域名local.id.seewo.com和 activate.navicat.com就可以访问.不过现在这种方式已经不用了!
DNS系统管理服务器
现在有一个专门管理域名的机构,通过这个机构,就可以申请登记域名和IP地址的映射关系,然后这个机构将这个映射关系保存在他的服务器上,在你的主机需要访问一个域名时,通过访问这个域名服务器就可以拿到这个域名对应的IP地址从而访问到服务器!
我们又想到一个问题,全世界这么多设备需要上网,如果都访问这个域名服务器那这个服务器不得挂!
确实如此,所以这个机构的域名服务器为根域名服务器,不同的区域还有响应的镜像域名管理系统服务器,不同的地方通过访问这个镜像服务器就可以获取到域名对应的IP.
我们的域名解析服务器有很多,我们的主机可以自己设置选择通过那个域名解析服务器解析域名!
我们通过这个设置就可以对域名解析器服务器进行选择!
默认是自动获取DNS也就是从运营商哪里获取!
也可以手动更改其他的域名解析服务器!
当我们浏览器查询一次域名解析服务器后,就会将这个结果保存在浏览器一段时间,下次访问就不用通过域名解析访问,可以直接访问了!