网络原理与 TCP/IP 协议详解
一、网络通信的本质与基础概念
1.1 什么是网络通信?
网络通信的本质是跨设备的数据交换,其核心目标是让不同物理位置的设备能够共享信息。这种交换需要解决三个核心问题:
- 如何定位设备? → IP地址
- 如何找到具体服务? → 端口号
- 如何保证数据正确传输? → 协议规则
类比快递系统:
- IP地址:收件人所在的城市和街道(如北京市海淀区中关村大街)
- 端口号:具体的门牌号和房间号(如3号楼502室)
- 协议:快递公司的运输规则(如何打包、运输、签收)
1.2 网络通信的核心要素
要素 | 作用 | 示例 |
---|---|---|
IP地址 | 唯一标识网络中的设备 | 192.168.1.1 (IPv4) |
端口号 | 标识设备上的具体服务 | 80(HTTP)、3306(MySQL) |
协议 | 定义数据传输的格式和规则 | TCP(可靠)、UDP(快速) |
数据包 | 信息传输的最小单位 | 包含头部(地址信息)和载荷(数据) |
二、TCP/IP 四层模型详解
TCP/IP 是互联网通信的基础协议族,分为四层,每层负责不同的功能:
2.1 应用层:直接面向用户的服务
- 功能:处理具体应用逻辑(如网页浏览、邮件收发)
- 常见协议:
- HTTP:超文本传输协议(网页)
- FTP:文件传输协议
- SMTP:邮件发送协议
- WebSocket:全双工通信协议(实时聊天)
- JavaEE 实现
@WebServlet("/user")
public class UserServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) {resp.getWriter().write("User Data"); // 通过HTTP响应数据}
}
2.2 传输层:端到端的数据传输管理
- 功能:确保数据可靠或高效地传输
- 核心协议:
- TCP:面向连接、可靠传输(三次握手、流量控制)
- UDP:无连接、快速传输(视频流、实时游戏)
- Java 实现:
// TCP 服务端 ServerSocket server = new ServerSocket(8080); Socket client = server.accept();// UDP 客户端 DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(data, data.length, address, 8080); socket.send(packet);
2.3 网络层:跨网络的寻址与路由
- 功能:通过 IP 地址定位设备,选择最佳传输路径
- 核心协议:
- IP:定义数据包格式和寻址规则
- ICMP:网络诊断(如
ping
命令)
- 路由表示例
目标网络 下一跳地址 接口
192.168.1.0 0.0.0.0 eth0
10.0.0.0 192.168.1.254 eth1
2.4 链路层:物理设备间的数据传输
- 功能:通过物理介质(网线、光纤、WiFi)传输原始比特流
- 核心技术:
- MAC地址:网卡唯一标识(如
00:1A:2B:3C:4D:5E
) - 以太网协议:定义数据帧格式
- MAC地址:网卡唯一标识(如
- 数据帧结构:
| 目标MAC | 源MAC | 类型 | 数据 | CRC校验 |
三、TCP 协议深度解析
3.1 TCP 的核心特性
特性 说明 面向连接 通信前需建立连接(三次握手),结束后断开(四次挥手) 可靠传输 通过确认应答、超时重传、滑动窗口等机制保证数据完整 流量控制 动态调整发送速率,避免接收方缓冲区溢出 拥塞控制 根据网络状况调整发送速率(慢启动、拥塞避免、快速恢复)
3.2 三次握手:建立可靠连接
详细过程:
- SYN(同步请求)
- 客户端发送
SYN=1, SEQ=X
- 进入
SYN_SENT
状态
- 客户端发送
- SYN-ACK(同步确认)
- 服务端回复
SYN=1, ACK=X+1, SEQ=Y
- 进入
SYN_RECEIVED
状态
- 服务端回复
- ACK(最终确认)
- 客户端发送
ACK=Y+1, SEQ=X+1
- 双方进入
ESTABLISHED
状态
- 客户端发送
Java 代码体现:
// 服务端
ServerSocket server = new ServerSocket(8080); // 绑定端口
Socket client = server.accept(); // 阻塞等待连接(完成三次握手)// 客户端
Socket socket = new Socket("localhost", 8080); // 发起连接
3.3 四次挥手:优雅断开连接
详细过程:
- FIN(结束请求)
- 主动方发送
FIN=1, SEQ=X
- 进入
FIN_WAIT_1
状态
- 主动方发送
- ACK(确认应答)
- 被动方回复
ACK=X+1, SEQ=Y
- 进入
CLOSE_WAIT
状态
- 被动方回复
- FIN(被动方关闭)
- 被动方发送
FIN=1, ACK=X+1, SEQ=Z
- 进入
LAST_ACK
状态
- 被动方发送
- ACK(最终确认)
- 主动方回复
ACK=Z+1, SEQ=X+1
- 双方进入
CLOSED
状态
- 主动方回复
Java 代码体现:
socket.close(); // 触发四次挥手
3.4 TCP 可靠传输机制
机制 | 原理说明 | Java 相关配置 |
---|---|---|
确认应答 | 接收方对每个数据包返回 ACK | 自动处理,无需开发者干预 |
超时重传 | 发送方未收到 ACK 时重传数据 | Socket.setSoTimeout(5000) 设置超时时间 |
滑动窗口 | 允许发送方连续发送多个数据包,无需等待单个 ACK | 操作系统内核自动管理 |
流量控制 | 通过接收方的窗口大小(Window Size)限制发送速率 | Socket.setReceiveBufferSize(8192) |
拥塞控制 | 动态调整发送速率以避免网络拥堵(慢启动、拥塞避免、快速重传、快速恢复) | 操作系统内核自动处理 |
四、UDP 协议详解
4.1 UDP 的核心特性
特性 | 说明 |
---|---|
无连接 | 无需建立连接,直接发送数据 |
不可靠传输 | 不保证数据到达顺序和完整性 |
高效性 | 头部开销小(8字节),适合实时应用 |
4.2 UDP 数据包结构
| 源端口(2字节) | 目标端口(2字节) |
| 长度(2字节) | 校验和(2字节) |
| 数据(可变长度) |
4.3 UDP 适用场景
- 实时音视频传输:如 Zoom 视频会议
- 在线游戏:如 MOBA 游戏的玩家位置同步
- DNS 查询:快速获取域名对应的 IP 地址
Java 代码示例:
// UDP 服务端
DatagramSocket serverSocket = new DatagramSocket(8080);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
serverSocket.receive(packet); // 阻塞接收数据// UDP 客户端
DatagramSocket clientSocket = new DatagramSocket();
byte[] data = "Hello UDP".getBytes();
DatagramPacket sendPacket = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 8080);
clientSocket.send(sendPacket);
五、IP 协议与网络层
5.1 IP 地址分类
类别 | 范围 | 用途 |
---|---|---|
A | 1.0.0.1 ~ 126.255.255.254 | 大型网络(如跨国公司) |
B | 128.0.0.1 ~ 191.255.255.254 | 中型网络(如大学校园) |
C | 192.0.0.1 ~ 223.255.255.254 | 小型网络(如家庭网络) |
D | 224.0.0.0 ~ 239.255.255.255 | 组播地址 |
E | 240.0.0.0 ~ 255.255.255.254 | 保留地址 |
5.2 子网划分与 CIDR
- 子网掩码:区分网络号和主机号(如
255.255.255.0
) - CIDR 表示法:
192.168.1.0/24
表示前 24 位是网络号 - 示例:
IP地址192.168.1.100
,子网掩码255.255.255.0
→ 网络号192.168.1.0
,主机号100
5.3 路由选择算法
- 静态路由:管理员手动配置路由表
- 动态路由:通过协议(如 OSPF、BGP)自动更新路由表
六、Java 网络编程实战
6.1 TCP 服务端与客户端
服务端代码:
public class TcpServer {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(8080);System.out.println("服务器启动,等待连接...");while (true) {Socket client = server.accept();new Thread(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));PrintWriter writer = new PrintWriter(client.getOutputStream())) {String request = reader.readLine();System.out.println("收到请求: " + request);writer.println("响应: " + request.toUpperCase());writer.flush();} catch (IOException e) {e.printStackTrace();}}).start();}}
}
客户端代码
public class TcpClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 8080);Scanner scanner = new Scanner(System.in);try (PrintWriter writer = new PrintWriter(socket.getOutputStream());BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {System.out.print("输入消息: ");String message = scanner.nextLine();writer.println(message);writer.flush();String response = reader.readLine();System.out.println("服务器响应: " + response);}}
}
6.2 UDP 服务端与客户端
服务端代码:
public class UdpServer {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(8080);byte[] buffer = new byte[1024];while (true) {DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("收到消息: " + message);}}
}
客户端代码:
public class UdpClient {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket();String message = "Hello UDP";byte[] data = message.getBytes();DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 8080);socket.send(packet);socket.close();}
}
七、JavaEE 中的网络技术
7.1 Servlet 与 HTTP
- HTTP 请求处理
-
@WebServlet("/api/user") public class UserServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String userId = req.getParameter("id");// 查询数据库...resp.getWriter().write("User Info: " + userId);} }
7.2 WebSocket 实时通信
@ServerEndpoint("/chat")
public class ChatEndpoint {@OnOpenpublic void onOpen(Session session) {System.out.println("新连接: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {try {for (Session s : session.getOpenSessions()) {if (s.isOpen()) {s.getBasicRemote().sendText("广播: " + message);}}} catch (IOException e) {e.printStackTrace();}}
}
7.3 RESTful API 设计
@Path("/users")
public class UserResource {@GET@Path("/{id}")@Produces(MediaType.APPLICATION_JSON)public Response getUser(@PathParam("id") String id) {User user = userService.getUserById(id);return Response.ok(user).build();}
}
八、网络诊断与工具
8.1 常用命令行工具
工具 | 用途 | 示例命令 |
---|---|---|
ping | 测试网络连通性 | ping www.baidu.com |
tracert | 追踪数据包路径 | tracert www.google.com |
netstat | 查看网络连接状态 | netstat -ano | findstr 8080 |
nslookup | 查询 DNS 记录 | nslookup www.aliyun.com |
8.2 Wireshark 抓包分析
- 过滤表达式:
tcp.port == 8080
:仅显示 8080 端口的 TCP 流量http.request.method == "GET"
:过滤所有 GET 请求
- 关键字段解析:
- Sequence Number:数据包序号
- Acknowledgment Number:确认序号
- Window Size:接收窗口大小
九、网络安全基础
9.1 常见攻击类型
攻击类型 | 原理 | 防御措施 |
---|---|---|
DDoS | 通过海量请求耗尽服务器资源 | 流量清洗、CDN 分发 |
SQL注入 | 恶意SQL语句破坏数据库 | 参数化查询、ORM 框架 |
XSS | 注入恶意脚本窃取用户信息 | 输入过滤、输出编码 |
中间人攻击 | 窃听或篡改通信数据 | HTTPS 加密、证书验证 |
9.2 HTTPS 加密通信
10.2 进阶学习方向
- 工作原理:
- 客户端请求服务器证书
- 验证证书合法性
- 协商对称加密密钥
- 使用对称加密传输数据
-
// 启用 HTTPS 的 Tomcat 配置 <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/keystore.jks"certificateKeystorePassword="changeit"type="RSA" /></SSLHostConfig> </Connector>
十、总结与进阶学习
10.1 核心知识点回顾
- TCP/IP 四层模型:应用层 → 传输层 → 网络层 → 链路层
- TCP 可靠传输机制:三次握手、滑动窗口、超时重传
- 网络协议分析:深入理解 HTTP/2、QUIC 等新协议
- 高性能网络编程:学习 Netty 框架、NIO 模型
- 云原生网络:掌握 Kubernetes 网络模型、Service Mesh
- 网络安全专家:深入研究渗透测试、漏洞挖掘
- Java 网络编程:Socket、ServerSocket、DatagramSocket
- JavaEE 技术:Servlet、WebSocket、RESTful API
- 网络安全:HTTPS、DDoS 防御、SQL 注入防护
相关文章:
网络原理与 TCP/IP 协议详解
一、网络通信的本质与基础概念 1.1 什么是网络通信? 网络通信的本质是跨设备的数据交换,其核心目标是让不同物理位置的设备能够共享信息。这种交换需要解决三个核心问题: 如何定位设备? → IP地址如何找到具体服务?…...

day022-定时任务-故障案例与发送邮件
文章目录 1. cron定时任务无法识别命令1.1 故障原因1.2 解决方法1.2.1 对命令使用绝对路径1.2.2 在脚本开头定义PATH 2. 发送邮件2.1 安装软件2.2 配置邮件信息2.3 巡检脚本与邮件发送2.3.1 巡检脚本内容2.3.2 制作时任务发送邮件 3. 调取API发送邮件3.1 编写文案脚本3.2 制作定…...

新增 git submodule 子模块
文章目录 1、基本语法2、添加子模块后的操作3、拉取带有submodule的仓库 git submodule add 是 Git 中用于将另一个 Git 仓库作为子模块添加到当前项目中的命令。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录,同时保持它们各自的提交历史独立。 1、基…...

List优雅分组
一、前言 最近小永哥发现,在开发过程中,经常会遇到需要对list进行分组,就是假如有一个RecordTest对象集合,RecordTest对象都有一个type的属性,需要将这个集合按type属性进行分组,转换为一个以type为key&…...

Linux 使用 Docker 安装 Milvus的两种方式
一、使用 Docker Compose 运行 Milvus (Linux) 安装并启动 Milvus Milvus 在 Milvus 资源库中提供了 Docker Compose 配置文件。要使用 Docker Compose 安装 Milvus,只需运行 wget https://github.com/milvus-io/milvus/releases/download/v2.5.10/milvus-standa…...

AR眼镜+AI视频盒子+视频监控联网平台:消防救援的智能革命
在火灾现场,每一秒都关乎生死。传统消防救援方式面临信息滞后、指挥盲区、环境复杂等挑战。今天,一套融合AR智能眼镜AI视频分析盒子智能监控管理平台的"三位一体"解决方案,正在彻底改变消防救援的作业模式,为消防员装上…...

编程技能:字符串函数10,strchr
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:字符串函数09,strncmp 回到目录…...

使用tunasync部署企业内部开源软件镜像站-Centos Stream 9
使用tunasync部署企业内部开源软件镜像站 tunasync 是清华大学 TUNA 镜像源目前使用的镜像方案,本文将介绍如何使用 tunasync 部署企业内部开源软件镜像站。 基于tunasync mirror-web nginx进行镜像站点搭建。 1. tunasync设计 tunasync架构如下: …...
c/c++的opencv像素级操作二值化
图像级操作:使用 C/C 进行二值化 在数字图像处理中,图像级操作 (Image-Level Operations) 是指直接在图像的像素级别上进行处理,以改变图像的视觉特性或提取有用信息。这些操作通常不依赖于图像的全局结构,而是关注每个像素及其邻…...

C++----Vector的模拟实现
上一节讲了string的模拟实现,string的出现时间比vector靠前,所以一些函数给的也比较冗余,而后来的vector、list等在此基础上做了优化。这节讲一讲vector的模拟实现,vector与模板具有联系,而string的底层就是vector的一…...

Mac redis下载和安装
目录 1、官网:https://redis.io/ 2、滑到最底下 3、下载资源 4、安装: 5、输入 sudo make test 进行编译测试 会提示 编辑 6、sudo make install 继续 7、输入 src/redis-server 启动服务器 8、输入 src/redis-cli 启动测试端 1、官网ÿ…...

[25-cv-05718]BSF律所代理潮流品牌KAWS公仔(商标+版权)
潮流品牌KAWS公仔 案件号:25-cv-05718 立案时间:2025年5月21日 原告:KAWS, INC. 代理律所:Boies Schiller Flexner LLP 原告介绍 原告是一家由美国街头艺术家Brian Donnelly创立的公司,成立于2002年2月25日&…...
【PhysUnits】9 取负重载(negation.rs)
一、源码 这段代码是类型级二进制数(包括正数和负数)的取反和取负操作。它使用了类型系统来表示二进制数,并通过特质(trait)和泛型来实现递归操作。 use super::basic::{B0, B1, Z0, N1}; use core::ops::Neg;// 反…...

深度思考、弹性实施,业务流程自动化的实践指南
随着市场环境愈发复杂化,各类型企业的业务步伐为了跟得上市场节奏也逐步变得紧张,似乎只有保持极强的竞争力、削减成本、提升抗压能力才能在市场洪流中博得一席之位。此刻企业需要制定更明智的解决方案,以更快、更准确地优化决策流程。与简单…...

UWB:litepoint获取txquality里面的NRMSE
在使用litepoint测试UWB,获取txquality里面的NRMSE时,网页端可以正常获取NRMSE。但是通过SCPI 命令来获取NRMSE一直出错。 NRMSE数据类型和pyvisa问题: 参考了user guide,发现NRMSE的数值是ARBITRARY_BLOCK FLOAT,非string。 pyvisa无法解析会返回错误。 查询了各种办法…...

VUE npm ERR! code ERESOLVE, npm ERR! ERESOLVE could not resolve, 错误有效解决
VUE : npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve 错误有效解决 npm install 安装组件的时候出现以上问题,npm版本问题报错解决方法:用上述方法安装完成之后又出现其他的问题 npm install 安装组件的时候出现以上问题&…...

IoT/HCIP实验-1/物联网开发平台实验Part1(快速入门,MQTT.fx对接IoTDA)
文章目录 实验介绍设备接入IoTDA进入IoTDA平台什么是IoTDA 开通服务创建产品和设备定义产品模型(Profile)设备注册简思(实例-产品-设备) 模拟.与平台通信虚拟设备/MQTT.fx应用 Web 控制台QA用户或密码错误QA证书导致的连接失败设备与平台连接成功 上报数…...

DMA STM32H7 Domains and space distrubution
DMA这个数据搬运工,对谁都好,任劳任怨,接受雇主设备的数据搬运业务。每天都忙碌着!哈哈哈。 1. DMA 不可能单独工作,必须接收其他雇主的业务,所以数据搬运业务的参与者是DMA本身和业务需求发起者。 2. 一…...

洪水危险性评价与风险防控全攻略:从HEC-RAS数值模拟到ArcGIS水文分析,一键式自动化工具实战,助力防洪减灾与应急管理
🔍 洪水淹没危险性是洪水损失评估、风险评估及洪水应急和管理规划等工作的重要基础。当前,我国正在开展的自然灾害风险普查工作,对洪水灾害给予了重点关注,提出了对洪水灾害危险性及风险评估的明确要求。洪水危险性及风险评估通常…...
Gemini Pro 2.5 输出
好的,我已经按照您的要求,将顶部横幅提示消息修改为右下角的 Toast 样式通知。 以下是涉及更改的文件及其内容: 1. my/src/html-ui.js 移除了旧的 #message-area div。在 <body> 底部添加了新的 #toast-container div 用于存放 Toas…...
SQL Server 和 MySQL 对比
下面是 SQL Server 和 MySQL 的详细对比,从功能、性能、成本、生态等多个维度展开,帮助你判断在什么情况下该选择哪一个。 ✅ 总览对比表 维度SQL ServerMySQL开发公司微软(Microsoft)Oracle(2008年起)是否…...

Leetcode 3269. 构建两个递增数组
1.题目基本信息 1.1.题目描述 给定两个只包含 0 和 1 的整数数组 nums1 和 nums2,你的任务是执行下面操作后使数组 nums1 和 nums2 中 最大 可达数字 尽可能小。 将每个 0 替换为正偶数,将每个 1 替换为正奇数。在替换后,两个数组都应该 递…...

三轴云台之积分分离PID控制算法篇
一、核心原理 积分分离PID控制的核心在于动态调整积分项的作用,以解决传统PID在三轴云台应用中的超调、振荡问题: 大误差阶段(如云台启动或快速调整时): 关闭积分项,仅使用比例(P)…...
【Elasticsearch】scripted_upsert
在 Elasticsearch 中,scripted_upsert 是一个用于更新操作的参数,它允许在文档不存在时通过脚本初始化文档内容,而不是直接使用 upsert 部分的内容。这种方式提供了更灵活的文档创建和更新逻辑。 scripted_upsert 的工作原理 当设置 scripte…...

uv - 一个现代化的项目+环境管理工具
参考: 【uv】Python迄今最好的项目管理环境管理工具(吧?)_哔哩哔哩_bilibili 项目需求 想象,每次创建一个项目的时候,我们需要去写 README. md, .git 仓库, .gitignore,你会感觉很头大 对于 …...

经典密码学和现代密码学的结构及其主要区别(2)维吉尼亚密码—附py代码
Vigenre cipher 维吉尼亚密码 维吉尼亚密码由布莱斯德维吉尼亚在 16 世纪发明,是凯撒密码的一个更复杂的扩展。它是一种多字母替换密码,使用一个关键字来确定明文中不同字母的多个移位值。 与凯撒密码不同,凯撒密码对所有字母都有固定的偏移…...
Elasticsearch 节点角色详解及协调节点请求策略
引言 Elasticsearch 集群中的节点可以承担多种角色,如主节点、数据节点、预处理节点和协调节点。合理配置和理解这些节点角色,对于保障集群的高可用性、性能优化以及请求调度至关重要。本文将深入解析各类节点的职责与配置方式,并介绍如何通…...

视频逐帧提取图片的工具
软件功能:可以将视频逐帧提取图片,可以设置每秒提取多少帧,选择提取图片质量测试环境:Windows 10软件设置:由于软件需要通过FFmpeg提取图片,运行软件前请先设置FFmpeg,具体步骤 1. 请将…...

数据结构第1章编程基础 (竟成)
第 1 章 编程基础 1.1 前言 因为数据结构的代码大多采用 C 语言进行描述。而且,408 考试每年都有一道分值为 13 - 15 的编程题,要求使用 C/C 语言编写代码。所以,本书专门用一章来介绍 408 考试所需的 C/C 基础知识。有基础的考生可以快速浏览…...
互联网大厂Java求职面试:AI大模型与云原生架构融合中的挑战
互联网大厂Java求职面试:AI大模型与云原生架构融合中的挑战 在互联网大厂的Java求职面试中,面试官往往以技术总监的身份,针对候选人对AI、大模型应用集成、云原生和低代码等新兴技术的理解与实践能力进行考察。以下是一个典型的面试场景&…...