网络原理 TCP/IP

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服务器,内容最全

相关推荐
chirrupy_hamal4 小时前
IntelliJ IDEA 保姆级使用教程
java·intellij idea
D_aniel_4 小时前
Leetcode:回文链表
java·算法·leetcode·链表
软件2056 小时前
【登录流程图】
java·前端·流程图
后藤十八里6 小时前
Python格式化字符串的四种方法
开发语言·python·学习
深度物联网7 小时前
Spring Boot多模块划分设计
java·spring boot·后端
一 乐7 小时前
宿舍报修|宿舍报修小程序|基于Java微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·宿舍报修小程序
球求了8 小时前
Linux 入门:操作系统&&进程详解
linux·运维·服务器·开发语言·学习
李匠20248 小时前
C++负载均衡远程调用学习之负载均衡算法与实现
运维·c++·学习·负载均衡
CodeCipher8 小时前
Java后端程序员学习前端之CSS
前端·css·学习