1.应用层
很多时候这一层的协议是程序员自定义的应用层协议(相当于一种约定,约定数据如何进行传输)。
eg:
实现登录的场景:
此时前端就需要与后端约定请求(假设约定使用ajax请求)中的一些参数(比如type,url,data等),响应为用户是否登录成功(返回true/false)。这个过程就是自定义协议,是可以根据实际情况灵活变通。
2.传输层
传输层主要是UDP和TCP协议,这里也只介绍这两种。
2.1 UDP
UDP是无连接,不可靠传输,面向数据报,全双工的传输层协议。格式如下:
UDP报头中包含四个信息:源端口号,目的端口号,UDP报文长度,UDP校验和,且每个部分都是两个字节(但是单位可能不同)。
(1)源/目的端口号:
两个字节大小:0~65535(0一般不用),1~1023:“知名端口号”(上古时期知名的,但是现在可能已经有很多不用了),剩下的随便进行自定义。
(2)UDP报文长度:
也是两个字节大小:0~65535(单位为字节),也就是64KB(其实64KB-8字节,因为报头占8字节,但由于与64KB差距甚微,所以就近似取的64KB)大小,这代表UDP所能承载的数据报的最大长度为64KB,超过就需要考虑使用TCP了。
(3)UDP校验和:
其本质就是字符串,体积比原始数据要小,由原始数据生成,是用来校验原始数据的正确性的。校验和相同,则原始数据相同;校验和不同,则原始数据一定不同。
1)为什么会有校验和?
网络环境错综复杂,数据在传输过程中就可能出现错误,因此就需要一个东西来校验数据的正确性,校验和由此而生。
2)校验和计算方法:
a.循环冗余算法(CRC):把当前要计算校验和的数据,每个字节都进行累加,把得到的结果保存在两个字节中,如果中间某个数据不一样的话,那么第二次计算校验和(接收方计算)的时候就会和第一次(发送方计算)的不一样。
b.md5算法(更多采用):
有三个特性:
定长:无论原始数据有多长,经过此算法计算出来的校验和都是定长的(32位/16位)
不可逆:原始数据经过md5算法可以很轻松得到校验和,但是想通过校验和解析原始数据是困难的(数据长度较少是可以实现的,一但比较长就会很困难了)
分散:即使大部分原始数据都是相同,只要有一个不一样,得到的校验和都会相差甚大。
2.2 TCP
TCP是有连接,可靠传输(要想进行TCP协议,得先保证当前网络环境是通畅的,如果出现重大网络故障,那么TCP协议也就进行不下去了,可靠传输也就无从谈起了),面向字节流,全双工的传输层协议,也是优先考虑使用的传输层协议。
2.2.1 TCP格式:
(1)源/目的端口号:
同UDP相同,不在介绍。
(2)4位首部长度:
4位:4bit(0~15,单位为4字节),但首部长度是不定长的,最短20字节(不包含选项),最长60字节(包含选项)。
(3)16位校验和:
同UDP相同,不在介绍。
(4)标志位:
ACK(确认应答报文段),SYN(同步报文段),FIN(结束报文段