一:应用层
🌟虽然应用层有很多现成协议,但很多时候也需要程序猿自己去定义协议
(1)自定义协议
1.定义步骤
①明确请求、响应,了解要传递的内容是什么
②商量具体的数据组织形式,约定好数据按照什么样的格式转换成(二进制)字符串
🌟所谓具体的数据组织格式就是看你按照什么样的方式去构造一个字符串,后续这个字符串就可以作为TCP或UDP的载荷(数据)进行传输;接收方也可以根据这个字符串进行解析!
序列化:发送方在最后发送数据时,将程序中的对象转换成(二进制)字符串
反序列化:接收方在接收数据时,将(二进制)字符串转换回程序中的对象
序列化:就是我把房子拆成一个个的砖块放到车子里,然后留下一张房子原来结构的图纸
反序列化:就是我们把砖块运输到了目的地以后,根据图纸把一块块砖头还原成房子原来面目的过程
💗其实,具体的数据组织格式是非常灵活的,程序员可以任意组织,只需要保证客户端和服务器使用同样的规则,即客户端与服务器遵守同一个数据组织格式的约定即可
💖一般来说,不同的应用程序,里面的自定义协议数据组织格式都是不一样的
(例如:QQ有属于QQ自己的数据格式;微信也是)
2.数据组织形式
🌟虽然程序员可以任意自定义数据组织形式,但为了避免出现过于"天马行空"的格式,有些大佬们就搞出了一些"通用的协议格式”
(1)xml
💓概念:以成对的标签,来表示“键值对信息”,同时标签可以嵌套,就可以形成一些复杂的树形数据结构
💗优点:xml非常清晰的把结构化数据清晰的表示出来了
💔缺点:xml表示数据需引入大量标签,会很繁琐,同时需要占用不少网络带宽
(1)有开始标签和结束标签(标签:<>;带"/"的就是结束标签)
(2)xml的标签是由我们自行定义的(虽然格式和HTML差不多,但是HTML的标签是固定好的)
(3)键值对:键就是key,表示数据类型;值就是value,表示数据值
(2)json
💓概念:本质上也是表示“键值对信息”
🌟json是当前比较流行的数据组织格式,且json对于换行并不敏感,将内容全部放到一行也是完全合法的;其实一般在网络传输时,会对json进行压缩,去掉不必要的换行和空格,同时把所有数据放到一行去,整体占用的宽带就更低了,虽然影响可读性!
💗优点:json表示的数据简洁,可读性非常好,也方便程序员观察中间结果并调试
💔缺点:终究还是要花费不少网络带宽来传输key
用{ }表示键值对
用[ ]表示数组(数组里的每个元素可以是数字、字符串,或者其它的{ }和[ ])
(3)protobuffer
💓概念:由谷歌提出的一套二进制数据序列化方式,使用二进制的方式,约定某几个字节,表示什么属性
🌟protobuffer主要用于规模复杂的后端服务器或者性能要求更高的场景
💗优点:节省宽带,最大化效率,因为不用传输key,靠位置和长度区分属性
💔缺点:二进制数据无法用肉眼观察,不方便程序猿进行调试,并且用起来很复杂,首先你得需要先编写一个proto文件来描述数据格式是什么样的,而编写这个文件又涉及到一系列的语法规则,编写完后,再进一步通过人家提供的工具把proto文件转换成代码,再嵌入到程序中使用
(2)DNS协议
1.DNS概念
DNS,即Domain Name System,域名解析系统
2.域名
①来源:上网,即需要访问服务器,知道服务器IP地址,但IP地址是一串数字,虽然IP地址已用点分十进制表示,但还是不方便人们记忆,因此这个时候我们就使用单词来表示IP地址,比如百度“baidu”、搜狗"sogou"等等,而这些单词就被称为域名
②概念:网址里面的单词就称为域名
(比如:www.baidu.com,这里面就有三个域名)
③分级:域名分为一级域名、二级域名、三级域名
(分级规则:越往前的域名等级越小)
3.DNS作用
①域名解析系统,顾名思义就是将域名转换为IP地址
②最早的DNS其实是一个名为"hosts"的文件,hosts文件里的每一个域名都对应一个IP地址
③访问域名流程:
4.DNS如何承载高并发量
🌟问题:全世界那么多主机都在上网,DNS能承载那么高的并发量吗?
①两个原则:节流和开源
②节流:每个电脑上在进行域名解析的时候,都会有缓存
(比如我访问10次百度,可能只有第1次是真正访问DNS,后面9次都不一定访问)
③开源:全世界很多大厂或者运营商会搭建出很多“DNS镜像服务器”
💗DNS镜像服务器:就像分身;与根域名DNS服务器一模一样,也从原始服务器中同步数据
💗根域名DNS服务器:老大,所有DNS服务器都得听它的
(好处就在于访问镜像和访问根域名DNS服务器是一样的,分担了DNS服务器的压力)
🌟浅谈根域名服务器的重要性
答:根域名服务器是非常重要的,只要在根域名服务器上动动手脚或者搞破坏,就可以让镜像服务器奔溃直接失效,就会导致我们上不了网,处于断网状态;恐怖的是,根域名服务器是"美丽国"在掌握!
5.Google的DNS镜像服务器
①DNS挂了的表现:比如QQ能打开,网页打不开;可能就是你这个地区的镜像服务器挂了
②Google的DNS镜像服务器:比较稳定,DNS如果挂了的时候可以手动设置
(3)HTTP协议:应用层-详解HTTP协议
二:传输层
🌟传输层这两个重点协议比较重要,单独分专题详细唠嗑唠嗑
(1)UDP协议:传输层—详解UDP协议
(2)TCP协议:传输层—详解TCP协议
三:网络层
🌟网络层重点协议:IP协议
(1)IP协议格式总图
IP协议段格式=IP报头+IP载荷数据
💙IP报头就包含版本号、报头长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、首部检验和、源IP、目的IP
💚IP载荷就是需要传输的数据,即传输层完整数据
(2)IP报头详解
1.IP地址
①源IP:标识发送端的主机位置
(4个字节)
②目的IP:标识接收端的主机位置
(4个字节)
🌟IP协议中最重要的部分,表示数据从哪来到哪去
2.版本号
版本号:指定IP协议的版本
(IPV4就是4位)
(IPV6就是6位)
💚现有的IP协议版本只有IPV4和IPV6
3.报头首部长度
报头首部长度:表示IP报头长度,跟TCP一样是可“变长”的,这里是以4字节为一个单位
(它是4位,即4bit,4bit=2⁴=16,即数据范围是0-15,又因为4字节为一个单位,15*4=60)
🌟因此,IP报头最大长度是60个字节
4.服务类型TOS
服务类型TOS:表示类型模式的切换
(虽然是8位的TOS,但这里只有以下4位可以用)
①最小延时类型:传输一个数据报的时间尽量短
②最大吞吐量类型:一定时间内传输的数据尽量多
③最高可靠性类型:传输过程中不易丢包
④最小成本类型:传输过程消耗的硬件资源最少
🌟这四者相互冲突,只能选择一个类型
5.总长度
总长度:表示IP报头+IP载荷数据的总长度
这里虽然只有16位,也就是限制了IP数据报总长度为64kb,但这里的64kb只是限制了一个IP数据报,且IP协议支持“拆包组包”机制
💜如果需要携带比较长的数据,IP协议会把一个数据拆分成多个数据报,等接收方在进行分用的时候,就将多个数据报合成一个数据
6.标识、标志、片偏移
①标识:唯一的标识主机发送的报文
②标志:3位标志
第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)
第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文
第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0;类似于一个结束标记
③片偏移:表示当前分片在原报文中处在哪个位置;实际偏移的字节数是这个值 * 8 得到的
(除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了)
🌟标识、标志、片偏移就表示了整个IP数据报的拆包组包过程
💙拆包:将大的数据拆为每一个小的IP数据报都包含IP报头+TCP载荷数据的各个部分
(1)拆出的每个包16位标识是相同的
(2)拆出的每个包13位的片偏移是不同的,前一个包片偏移更小,后一个包片偏移更大,这时就可以区分包的先后顺序
(3)拆出的每个包,有一位是现在不用的,另有一位表示是否允许拆包,拆包了这一位是1,最后一位表示结束标志,标识当前包是否为最后一个,这一位为0说明是最后一个包
7.生存时间TTL
①生存时间TTL:数据报到达目的地的最大报文跳数
②报文跳数:有32/64/128,默认一般为64
(每次经过一个路由,TTL就减1,一直减到0还没到达,那么就丢弃了;因为正常来说,TTL足以支持数据报到达网络的任意一个位置,如果真出现0,基本认为目标IP不可到达)
8.协议
协议:表示传输层用了什么协议
9.校验和
校验和:使用CRC进行校验,来鉴别头部是否损坏
(只需要检验IP头部即可,因为IP载荷部分是TCP或UDP的整体数据报,人家TCP/UDP已经自己校验过自己了)
(3)IP协议功能
①地址管理
参考文章:初步认识网络
②路由选择
(1)作用:主要是描述数据报在IP协议下是如何传播的
(2)前提:我们需要知道互联网是很庞大的,任何一个路由器都是无法完全理解网络的全貌
路由器在转发数据时,只能够认识部分的网络环境,即只能够知道和它相邻的一些设备的情况;因此,路由器转发数据的过程就相当于"问路",走一步算一步这种感觉
(3)路由表:每个路由器的内部,都有一个数据结构叫“路由表”
当数据报到达路由器的时候,就需要查询路由表,相当于问路
如果查到了,就按照这个方向继续转发数据,数据便能到达
如果查不到,路由器会给一个默认的方向,继续沿着默认的方向走
四:数据链路层
🌟数据链路层重点协议:以太网协议
(1)以太网协议格式总图
(2)以太网协议格式内容详解
1.目的地址和源地址
①源地址:指的是源MAC地址
(6个字节)
②目的地址:指的是目的MAC地址
(6个字节)
🌟IP地址位于网络层,MAC地址位于数据链路层
💜网络层负责的是数据整体转发过程
💜数据链路层负责的是相邻节点具体转发过程
2.类型
🌟帧协议类型字段有三种值,分别对应IP、ARP、RARP
不同类型就对应了不同的值,例如上面的类型0800就对应了IP数据报
3.载荷
💓以太网数据帧的载荷就是完整的IP数据报
①载荷长度(IP数据报长度):46~1500
(换句话说,一个以太网数据帧的最大长度是1500;这个与硬件设备相关)
②MTU(最大传输单元):发送数据时对数据限制的一个最大值;相当于发快递时对包裹尺寸的限制
(最大值1500称为以太网的MTU,不同的网络类型有不同的MTU,不同的数据链路层标准的MTU是不同的)