JAVAEE|JAVAEE---网络编程3 针对面试

TCP/IP五层协议栈

我们先说应用层: 应用层中最重要的事情就是---->"设计并实现一个应用层协议"

什么叫"设计并实现一个应用层协议"?
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


举一个例子:
公司让开发一个点外卖的软件,当前要开发一个功能,叫做获取用户订单历史,这样的功能需要涉及到前端(客户端)和后端(服务器)彼此之间的交互.
在这个交互过程中就需要约定好前端发什么样的数据,后端就回对应的数据,即需要规划请求和响应之间要传递的信息
下面这个图中的工作就是在进行第一个---->明确传输的信息
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


除此之外,我们还需要--->明确数据的组织格式
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片




JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

【JAVAEE|JAVAEE---网络编程3 针对面试】
我们来介绍下这几种数据的组织格式 1.xml: JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

xml的特点是:
虽然xml提高了可读性,但是又引入了太多的辅助信息(标签名) ,因为要表示这些辅助信息,就导致传输相同数目的请求的时候,占用的网络带宽就更高(网络带块很贵的!)

2.json: JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

json的特点:
相比于xml,json同样能保证可读性,同时json又没有xml那么繁琐,占用的宽带也要比xml少


json虽然传输效率比xml高,但是json仍然会多传递一些冗余信息(key),这一点在表示数组的时候尤为明显,如下图: JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

那有没有比json更好的数据的组织格式呢? protobuffer应运而生~~~

3.protobuffer protobuffer是一种二进制格式的数据,在protobuffer的数据中不再包括像上面json里面的key,而是通过顺序以及一些特殊符号来区分每个字段的含义,同时再通过一个IDL文件来描述这个数据格式(每个部分是什么意思),IDL只起到一个辅助开发的效果,并不真正的进行传输,传输的只是二进制的纯粹的数据
protobuffer格式:
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

protobuffer的特点:
传输效率更高,但是可读性不是很多高

以上三个数据的组织格式都介绍完了
但在实际应用中,我们需要知道 其实json的应用范围要比protobuffer更广(因为开发效率>运行效率) 为什么呢,因为开发效率实际上是包含了开发和调试,光论开发的话,protobuffer有IDL,但调试部分,如果线上环境出问题,用json的话,出问题的请求和响应一目了然; 但如果用protobuffer就没法肉眼看,就得自己开发一个专门的程序来解析这个数据,分析这里的问题



下面介绍一个应用层的特殊协议--------->DNS(域名解析)
IP地址不太好记,即使写成了点分十进制的形式,对我们来说也不太友好.因此就使用一串英文单词(就称为域名)来表示这个IP地址.像www.sogou.com就是域名
域名和IP地址之间是一一对应的关系

JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


像下图这样一行就是描述了IP地址和域名的对应关系,后续其他程序(浏览器)中使用这个域名,就会被自动转换成IP地址
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


但现在hosts文件已经不再使用了,因为全世界的域名太多了,hosts改不过来啊
因此现在就是专门设立一个域名解析服务器,负责维护域名和IP的对应关系
然后全世界各个国家,城市,地区有各自的网络运营商,他们会就近假设域名解析镜像服务器定期和上面说的设立的域名解析服务器进行同步

说完应用层,下面说传输层:虽然传输层是操作系统内核实现,和程序员不直接打交道,但是程序员进行网络编程都要用到socket,一旦调用了socket代码就进入到传输层的范畴了~
如果一切顺利还好,但是一旦代码出现bug,我们就需要解决这些bug,因此我们需要知道传输层的知识
另外传输层的协议也是面试中非常爱考的--->TCP协议 (下面一会儿就会讲哦)

传输层的协议有很多,最常用的是UDP和TCP 我们先讲UDP协议:

把应用层数据报分装成UDP数据报,本质上就是在应用层数据包的基础上添加8个字节的报头 (如下图)
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


解释下上图中的校验和,校验和是用来验证网络传输的数据是否正确的
进一步解释一下:
网络上传递的数据本质是光信号和电信号,但如果有一些外界干扰,比如磁场,就可能导致原有的一些传递的信息发生了改变.正常一组连续的高频信号,如果遇到一个强磁场就可能导致其中的某些高频信号变成低频,因此我们需要尽可能的识别出数据是不是错了,不能将错就错

JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

JAVAEE|JAVAEE---网络编程3 针对面试
文章图片


问个问题:能不能把UDP这里的端口改成4个字节之类的? 回答:不能改
我们看到UDP的报文长度是2个字节,范围是0-65535(也就是0-64k)---->(这里补充一下怎么算呢,1k*1024=65536) 64k在现代的互联网程序中太小喽,这是UDP使用中一个非常致命的缺陷,无法比较一个比较大的数据报
那我们怎么解决UDP这一大缺陷呢? 下面这个方法可以,但太麻烦,这是下策
JAVAEE|JAVAEE---网络编程3 针对面试
文章图片

我们还有一个上策,就是--->改用TCP,TCP没有这样的长度限制
接下来的内容请移步下一节--->JAVAEE---网络原理1


    推荐阅读