当前位置: 首页 > java >正文

java基础(十五)计算机网络

网络模型概述

为了使得多种设备能通过网络相互通信,并解决各种不同设备在网络互联中的兼容性问题,国际标准化组织(ISO)制定了开放式系统互联通信参考模型(OSI模型)。与此同时,TCP/IP模型作为实际应用中更为广泛的模型,成为了互联网的基石。本文将详细介绍OSI七层模型和TCP/IP四层模型,并深入探讨HTTP、TCP等核心协议的工作原理、常见问题及优化方法。

网络模型概述
OSI七层模型
TCP/IP四层模型
应用层: 提供接口
表示层: 数据格式转换
会话层: 管理会话
传输层: 端到端传输
网络层: 路由与转发
数据链路层: 帧传输与MAC
物理层: 物理传输
应用层: HTTP/SMTP等
传输层: TCP/UDP
网络层: IP协议
链路层: 物理传输

OSI七层模型

OSI模型是一个理论上的网络通信模型,由7个层次组成,每一层负责不同的功能:

  • 应用层:负责为应用程序提供统一的接口,使应用程序能够使用网络服务
  • 表示层:负责把数据转换成兼容另一个系统能识别的格式,包括数据加密、压缩等
  • 会话层:负责建立、管理和终止表示层实体之间的通信会话
  • 传输层:负责端到端的数据传输,提供可靠或不可靠的数据传输服务
  • 网络层:负责数据的路由、转发和分片,实现不同网络之间的通信
  • 数据链路层:负责数据的封帧和差错检测,以及MAC寻址
  • 物理层:负责在物理网络中传输数据帧,定义电气特性和物理连接

由于OSI模型过于复杂且仅为理论模型,实际应用中我们更多使用TCP/IP模型。

TCP/IP模型

TCP/IP模型是互联网实际使用的网络模型,由上到下分成4层:

应用层

支持HTTP、SMTP、FTP等最终用户进程的协议,为用户提供网络服务接口。

传输层

处理主机到主机的通信,主要协议有TCP和UDP。

网络层

负责寻址和路由数据包,核心协议是IP协议。

链路层

通过物理媒介(电线、电缆或无线信道)传输数据比特。

TCP与UDP详解

TCP(传输控制协议)

TCP是一种面向连接的、可靠的传输层协议,提供以下特性:

  • 连接管理:通过三次握手建立连接,四次挥手断开连接
  • 可靠性:通过序列号、确认应答和超时重传机制保证数据可靠传输
  • 流量控制:通过滑动窗口机制防止发送方过快地发送数据
  • 拥塞控制:通过慢启动、拥塞避免等算法防止网络拥塞
// Java示例:简单的TCP客户端
import java.net.*;
import java.io.*;public class YA33_TCPClient {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 8080);OutputStream out = socket.getOutputStream();PrintWriter writer = new PrintWriter(out, true);writer.println("Hello from YA33");InputStream in = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));String response = reader.readLine();System.out.println("Server response: " + response);socket.close();} catch (IOException e) {e.printStackTrace();}}
}

UDP(用户数据报协议)

UDP是一种无连接的、不可靠的传输层协议,提供以下特性:

  • 无连接:不需要建立连接即可发送数据
  • 不可靠:不保证数据包的顺序和可靠性
  • 高效:头部开销小,传输效率高
  • 适用场景:实时应用如视频流、语音通话等
// Java示例:简单的UDP客户端
import java.net.*;public class YA33_UDPClient {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket();InetAddress address = InetAddress.getByName("localhost");byte[] sendData = "Hello from YA33".getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 8080);socket.send(sendPacket);byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Server response: " + response);socket.close();} catch (IOException e) {e.printStackTrace();}}
}

HTTP协议详解

HTTP基本概念

HTTP(超文本传输协议)是应用层协议,用于在Web浏览器和服务器之间传输超文本内容。

HTTP报文结构

HTTP报文分为请求报文和响应报文两种类型。

请求报文

请求行:包含请求方法、请求目标(URL或URI)和HTTP协议版本
请求头部:包含关于请求的附加信息,如Host、User-Agent、Content-Type等
空行:请求头部和请求体之间用空行分隔
请求体:可选,包含请求的数据,通常用于POST请求等需要传输数据的情况

响应报文

状态行:包含HTTP协议版本、状态码和状态信息
响应头部:包含关于响应的附加信息,如Content-Type、Content-Length等
空行:响应头部和响应体之间用空行分隔
响应体:包含响应的数据,通常是服务器返回的HTML、JSON等内容

HTTP状态码

HTTP状态码分为5大类,用于表示请求的处理结果:

HTTP状态码
1xx: 信息响应
2xx: 成功响应
3xx: 重定向
4xx: 客户端错误
5xx: 服务器错误
200: 请求成功
301: 永久重定向
302: 临时重定向
404: 页面未找到
405: 方法不允许
500: 服务器内部错误
502: 错误网关
504: 网关超时

HTTP请求方法

  • GET:请求获取指定资源,通常用于获取数据
  • POST:向服务器提交数据,通常用于提交表单数据或进行资源的创建
  • PUT:向服务器更新指定资源,通常用于更新已存在的资源
  • DELETE:请求服务器删除指定资源
  • HEAD:类似于GET请求,但只返回资源的头部信息

GET与POST的区别

根据RFC规范,GET和POST有以下区别:

  1. 语义不同:GET用于获取资源,POST用于处理资源
  2. 参数位置:GET参数在URL中,POST参数在请求体中
  3. 安全性:GET是安全且幂等的,POST是不安全且不幂等的
  4. 缓存:GET请求可以被缓存,POST请求不能被缓存
  5. 数据限制:GET有URL长度限制,POST无长度限制

HTTP长连接

HTTP协议采用"请求-应答"模式。HTTP短连接每次请求都需要建立和断开TCP连接,效率低下。HTTP长连接通过Keep-Alive机制,允许多个HTTP请求/应答使用同一个TCP连接,提高了效率。

HTTP默认端口:80
HTTPS默认端口:443

HTTPS与安全

HTTP为什么不安全

HTTP是明文传输,存在以下安全风险:

  • 窃听风险:通信内容容易被窃取
  • 篡改风险:内容容易被修改
  • 冒充风险:容易伪装成合法网站

HTTPS如何解决安全问题

HTTPS在HTTP与TCP之间加入SSL/TLS协议,通过以下方式解决安全问题:

  • 信息加密:防止数据被窃取
  • 校验机制:防止数据被篡改
  • 身份证书:验证服务器身份

HTTPS握手过程

HTTPS通过TLS握手建立安全连接,传统RSA算法的握手过程如下:

  1. 客户端Hello:客户端发送支持的TLS版本、随机数和密码套件列表
  2. 服务器Hello:服务器确认TLS版本、发送随机数、确认密码套件和数字证书
  3. 客户端验证:客户端验证证书,发送预主密钥(用服务器公钥加密)
  4. 服务器确认:服务器使用私钥解密预主密钥,生成会话密钥

JWT令牌

JSON Web Token(JWT)是一种跨域认证解决方案,由三部分组成:

  • 头部(Header):包含令牌类型和签名算法
  • 载荷(Payload):包含声明(用户信息等)
  • 签名(Signature):用于验证令牌的完整性
// Java示例:简单的JWT生成和验证
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;
import java.util.Date;public class YA33_JWTExample {private static final String SECRET_KEY = "YA33_secret_key";public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 864000000)) // 10天.signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}public static Claims parseToken(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();}
}

DNS解析过程

DNS(域名系统)是将域名转换为IP地址的分布式数据库系统。DNS解析过程如下:

  1. 客户端查询本地DNS缓存
  2. 本地DNS服务器查询根域名服务器
  3. 根域名服务器指向顶级域名服务器
  4. 顶级域名服务器指向权威域名服务器
  5. 权威域名服务器返回IP地址
  6. 本地DNS服务器缓存并返回IP地址

DNS使用UDP协议,默认端口53,因为UDP具有低延迟、简单快速和轻量级的特性。

网络攻击与防护

DDoS攻击

分布式拒绝服务(DDoS)攻击通过大量流量淹没目标服务器,使其无法正常服务。防护措施包括:

  • 增强网络基础设施
  • 使用防火墙和入侵检测系统
  • 流量清洗和负载均衡
  • 配置访问控制策略

SQL注入

SQL注入发生在应用程序直接将用户输入用作SQL查询时。防护措施包括:

  • 输入验证和转义
  • 使用参数化查询
  • 限制数据库权限
  • 实施输入过滤

XSS攻击

跨站脚本(XSS)攻击通过在Web页面插入恶意脚本盗取用户信息。分为存储型、反射型和DOM型。防护措施包括:

  • 输入验证
  • 输出编码
  • 使用Content Security Policy(CSP)
  • 设置HttpOnly标记

CSRF攻击

跨站请求伪造(CSRF)攻击诱导用户执行恶意操作。防护措施包括:

  • 验证用户会话
  • 使用双重验证
  • 防止跨站请求
  • 避免自动提交表单

网络故障排查

网页加载慢的排查思路

  1. 确定是服务端还是客户端问题
  2. 检查DNS解析是否正常
  3. 检查TCP连接是否建立
  4. 查看HTTP响应状态码
  5. 检查网络带宽和流量

服务器连接问题排查

  1. 检查IP地址和端口是否正确
  2. 检查防火墙设置
  3. 检查网络代理设置
  4. 根据错误状态码进行相应排查

总结

本文详细介绍了网络模型、TCP/IP协议族、HTTP/HTTPS协议、DNS解析过程以及网络安全相关的知识。通过理解这些基础概念和原理,能够更好地进行网络编程、故障排查和安全防护。在实际应用中,需要根据具体场景选择合适的协议和技术方案,确保网络通信的效率和安全性。

http://www.xdnf.cn/news/18798.html

相关文章:

  • 利用matlab实现CST超表面阵列的自动建模
  • TCP和UDP的使用场景
  • onnx入门教程(四)——ONNX 模型的修改与调试
  • 借Copilot之力,实现办公效率的跃升
  • Flink 滑动窗口实战:从 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程
  • 交换机是如何同时完成帧统计与 BER/FEC 分析的
  • leetcode LCR 012.寻找数组的中心下标
  • 59 C++ 现代C++编程艺术8-智能指针
  • IO多路转接(select方案)
  • 测试用例如何评审?
  • `mysql_query()` 数据库查询函数
  • 如何监控ElasticSearch的集群状态?
  • THM trypwnme2
  • 【广告系列】流量归因模型
  • LeetCode热题100--102. 二叉树的层序遍历--中等
  • 云计算学习笔记——Linux用户和组的归属权限管理、附加权限、ACL策略管理篇
  • CentOS安装Jenkins全流程指南
  • 【大白话解析】 OpenZeppelin 的 ECDSA 库:以太坊签名验证安全工具箱(附源代码)
  • 零基础也能写博客:cpolar简化Docsify远程发布流程
  • 自学嵌入式第二十七天:Linux系统编程-进程
  • MQTT 协议模型:客户端、 broker 与主题详解(二)
  • Java 学习笔记(基础篇10)
  • Qwen2-Plus与DeepSeek-V3深度测评:从API成本到场景适配的全面解析
  • Coze用户账号设置修改用户头像-后端源码
  • 大模型的多机多卡训练
  • 09-数据存储与服务开发
  • 深度学习分类网络初篇
  • react+taro打包到不同小程序
  • Nginx与Apache:Web服务器性能大比拼
  • Docker:技巧汇总