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

相关推荐
一定要AK21 分钟前
Spring 入门核心笔记
java·笔记·spring
A__tao22 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
AI成长日志26 分钟前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
KevinCyao35 分钟前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏49442 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
_李小白1 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
wuxinyan1232 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书2 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队2 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
杨云龙UP2 小时前
从0到1快速学会Linux操作系统(基础),这一篇就够了!
linux·运维·服务器·学习·ubuntu·centos·ssh