1.应用层
1.1自定义协议
客户端和服务器之间往往进行交互的是"结构化"数据,网络传输的数据是"字符串""二进制bit流",约定协议的过程就是把结构化"数据转成"字符串"或"二进制bit流"的过程.
序列化:把结构化"数据转成"字符串"或"二进制bit流"的过程
反序列化:"字符串"或"二进制bit流"还原成结构化"数据
约定这两件事的过程就是自定义协议的过程
1.2 xml

里面的标签/格式/值都是自定义的
1.3 json(当下主流的数据组织格式)

键值对结构,比1.2更节省带宽
1.4 protobuffer
更节省带宽,效率最高的方式
只是在开发阶段定义出这里有哪些资源,描述每个字段的含义,程序真正运行的时候,实际传输的数据是不包含这样的描述信息
2.传输层
2.1 端口号
2个字节的整数,1-1024系统保留自用的端口号
2.2 UDP协议
无连接,不可靠传输,面向数据报,全双工
UDP效率会比TCP高
报文格式:
UDP数据报=报头(重点)+载荷(应用层数据报)


UDP报头中有4个字段,每个字段2个字节
由于协议报头中使用2个字节表示端口号,端口号的取值范围0-65535,最大值64kb,所以一个数据报的最大值就是64kb
校验和/检验和:验证数据在传输的过程中是否正确,可能受电磁波,电信号,光信号等干扰
2.3 TCP协议(常用且考频高)

TCP报头中前20个字节是固定长度的,选项可以有可以没有
保留位给后续需要扩展功能,避免因为扩展引起不兼容问题
六位标志位,TCP非常核心的部分
有连接,可靠传输 ,面向字节流,全双工
2.3.1确认应答
确保"可靠性"最核心的机制是"确认应答" ,TCP的序号 和确认序号是按照字节来进行编号的

2.3.2 超时重传
发送方认为没有收到ack就判定为丢包会重新传送一次,所以存在两种情况,一个是数据丢包,一个是ack丢包(会收到2次数据)。针对这个问题,TCP socket在内核中存在接受缓冲区,发送方发来的数据先放到接收缓冲区中,然后应用程序调用read/scanner.next才能读到数据,这里的读操作读的是接收缓冲区。
接收方通过数据的序号来判断这个数据是否是"重复数据",应用程序读取数据的时候是按照序号的先后顺序连续读取的
重传不是无限的,重传到一定程度还没有ack就会尝试重置连接,如果重置也失败就会直接放弃连接,重传的频率越来越低
针对上述ack,重传,保证顺序,自动去重,都是TCP内置的,咱们使用TCP内置的api时outputStream.write()只需要调用一个这个代码即可
2.3.3连接管理
建立连接和断开连接
2.3.3.1 建立连接
TCP有连接,客户端执行socket=new Socket(severlp,severPort);//这个操作就是在建立连接
三次握手:内核建立连接的过程,让通信双方都能保存对方的相关的信息,syn不带有应用层载荷,但是会有ip报头。中间两次合并为一次握手

握手的意义:
1.初步确认通信链路是否畅通
2.验证通信双方发送能力和接受能力是否正常
3.协商一些必要的参数
2.3.3.2 断开连接
四次挥手: 不一定是客户端先发起,调用socket.close和进程直接结束都会触发fin

中间的ack,fin不一定可以合并,因为它们之间的时间间隔比较长
谁被动断开连接,谁进入CLOSE_WAIT, 谁主动 断开连接,谁进入TIME_WAIT
2.3.4 滑动窗口
提高效率,批量传输
如果出现丢包,滑动窗口会怎么样?
1.ack丢了,不会影响可靠性,所以不用进行任何处理
2.数据丢了,会影响可靠性,要重传
2.3.5 流量控制
接收方 影响发送方的速度,接收方按照自己的接收缓冲区剩余空间的大小作为ack中的窗口大小的数值,前提就是为了保证可靠性
2.3.6 拥塞控制
限制发送方 发送数据的速率,流量控制和拥塞控制谁产生的窗口大小更小,谁就说了算

2.3.7 延时应答
再提高一点效率,接收方收到数据之后,不会直接返回ack,而是等一会再返回ack
2.3.8 捎带应答
提升传输效率,ack和应答的响应数据合并成一个tcp数据报

2.3.9 面向字节流
"粘包问题"解决方案:
1.分隔符,见到分隔符就可以视为一个包结束了
2.指定出包的长度
2.3.10 异常情况
1.其中一方出现进程崩溃
触发回收文件资源,关闭文件这样的效果,就会触发四次挥手,TCP连接的生命周期可以比进程更长一些,虽然进程已经退出,但是TCP连接还在,仍然可以继续进行四次挥手,所以和正常的四次挥手结束没有什么区别
2.其中一方出现了正常关机
强制结束所有进程,如果四次挥手完成的快就和正常的一样,如果完成的慢,则会触发超时重传,超时重传失败后会触发单方面删除连接信息
3.其中一方突然断电
来不及发送fin,TCP会尝试"复位"连接且单方面释放连接
4.网线断开
TCP会尝试"复位"连接且单方面释放连接
3.网络层
3.1 IP协议

3.1.地址管理
使用一套地址体系(IP地址)来描述互联网上每个设备所在的位置
IP地址在NAT机制下,分成了两大类:私网IP:10.* 172.16-172.31.* 192.168.*
公网IP:除了私网IP,剩下的都是
一个IP地址分为两部分:网络号+主机号
IP地址通常是动态分配的

3.2. 路由选择
一个数据包,如何从网络中的某个地址传输到另一个地址
4. 数据链路层
4.1 以太网
数据帧格式:

mac地址是静态分配的
5.DNS
域名解析系统
使用IP地址来描述网络设备的位置,域名一串可读性更好的单词,把域名自动转换为对应的IP地址

DNS服务器并非只有一份,有多份
根域名服务器:最开始的这一套DNS服务器,内容最全