java基础(十五)计算机网络
网络模型概述
为了使得多种设备能通过网络相互通信,并解决各种不同设备在网络互联中的兼容性问题,国际标准化组织(ISO)制定了开放式系统互联通信参考模型(OSI模型)。与此同时,TCP/IP模型作为实际应用中更为广泛的模型,成为了互联网的基石。本文将详细介绍OSI七层模型和TCP/IP四层模型,并深入探讨HTTP、TCP等核心协议的工作原理、常见问题及优化方法。
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请求方法
- GET:请求获取指定资源,通常用于获取数据
- POST:向服务器提交数据,通常用于提交表单数据或进行资源的创建
- PUT:向服务器更新指定资源,通常用于更新已存在的资源
- DELETE:请求服务器删除指定资源
- HEAD:类似于GET请求,但只返回资源的头部信息
GET与POST的区别
根据RFC规范,GET和POST有以下区别:
- 语义不同:GET用于获取资源,POST用于处理资源
- 参数位置:GET参数在URL中,POST参数在请求体中
- 安全性:GET是安全且幂等的,POST是不安全且不幂等的
- 缓存:GET请求可以被缓存,POST请求不能被缓存
- 数据限制: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算法的握手过程如下:
- 客户端Hello:客户端发送支持的TLS版本、随机数和密码套件列表
- 服务器Hello:服务器确认TLS版本、发送随机数、确认密码套件和数字证书
- 客户端验证:客户端验证证书,发送预主密钥(用服务器公钥加密)
- 服务器确认:服务器使用私钥解密预主密钥,生成会话密钥
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解析过程如下:
- 客户端查询本地DNS缓存
- 本地DNS服务器查询根域名服务器
- 根域名服务器指向顶级域名服务器
- 顶级域名服务器指向权威域名服务器
- 权威域名服务器返回IP地址
- 本地DNS服务器缓存并返回IP地址
DNS使用UDP协议,默认端口53,因为UDP具有低延迟、简单快速和轻量级的特性。
网络攻击与防护
DDoS攻击
分布式拒绝服务(DDoS)攻击通过大量流量淹没目标服务器,使其无法正常服务。防护措施包括:
- 增强网络基础设施
- 使用防火墙和入侵检测系统
- 流量清洗和负载均衡
- 配置访问控制策略
SQL注入
SQL注入发生在应用程序直接将用户输入用作SQL查询时。防护措施包括:
- 输入验证和转义
- 使用参数化查询
- 限制数据库权限
- 实施输入过滤
XSS攻击
跨站脚本(XSS)攻击通过在Web页面插入恶意脚本盗取用户信息。分为存储型、反射型和DOM型。防护措施包括:
- 输入验证
- 输出编码
- 使用Content Security Policy(CSP)
- 设置HttpOnly标记
CSRF攻击
跨站请求伪造(CSRF)攻击诱导用户执行恶意操作。防护措施包括:
- 验证用户会话
- 使用双重验证
- 防止跨站请求
- 避免自动提交表单
网络故障排查
网页加载慢的排查思路
- 确定是服务端还是客户端问题
- 检查DNS解析是否正常
- 检查TCP连接是否建立
- 查看HTTP响应状态码
- 检查网络带宽和流量
服务器连接问题排查
- 检查IP地址和端口是否正确
- 检查防火墙设置
- 检查网络代理设置
- 根据错误状态码进行相应排查
总结
本文详细介绍了网络模型、TCP/IP协议族、HTTP/HTTPS协议、DNS解析过程以及网络安全相关的知识。通过理解这些基础概念和原理,能够更好地进行网络编程、故障排查和安全防护。在实际应用中,需要根据具体场景选择合适的协议和技术方案,确保网络通信的效率和安全性。