第一部分:IP地址

理解IP地址在网络通信中的核心作用

学习目标

掌握IPv4与IPv6的区别、IP地址分类及子网掩码的作用

IPv4地址

32位地址,通常表示为点分十进制格式

// IPv4地址示例 192.168.1.1 10.0.0.1 172.16.0.1

特点: 4个8位组,范围0-255

IPv6地址

128位地址,通常表示为冒号分隔的十六进制格式

// IPv6地址示例 2001:0db8:85a3:0000:0000:8a2e:0370:7334 fe80::1

特点: 解决IPv4地址耗尽问题

IP地址分类

  • A类:1.0.0.0 - 126.255.255.255
  • B类:128.0.0.0 - 191.255.255.255
  • C类:192.0.0.0 - 223.255.255.255
  • D类:224.0.0.0 - 239.255.255.255(组播)
  • E类:240.0.0.0 - 255.255.255.255(保留)
IP地址结构示意图

IPv4地址结构:网络部分 + 主机部分

特殊IP地址

1. 127.0.0.1:本地回环地址
2. 192.168.x.x:私有地址
3. 169.254.x.x:自动配置地址
4. 0.0.0.0:默认路由
5. 255.255.255.255:广播地址

第二部分:端口

理解端口在网络通信中的作用

学习目标

掌握端口分类、常见端口号及端口扫描原理

系统端口:0-1023
用户端口:1024-49151
动态端口:49152-65535
端口号 协议 服务 描述
21 FTP 文件传输 文件传输协议
22 SSH 安全Shell 安全远程登录
80 HTTP Web服务 超文本传输协议
443 HTTPS 安全Web服务 安全HTTP
3306 MySQL 数据库 MySQL数据库服务
import java.net.ServerSocket; import java.io.IOException; public class PortScanner { public static void main(String[] args) { String host = "localhost"; int startPort = 1; int endPort = 1024; System.out.println("扫描 " + host + " 的端口范围: " + startPort + "-" + endPort); for (int port = startPort; port <= endPort; port++) { try (ServerSocket serverSocket = new ServerSocket(port)) { // 端口未被使用 } catch (IOException e) { System.out.println("端口 " + port + " 已被使用"); } } } }

注意事项

1. 不要使用低于1024的端口,除非有管理员权限
2. 避免使用已知服务端口(如80、443)
3. 动态端口范围是49152-65535
4. 端口扫描可能违反安全策略

第三部分:网络协议

理解网络通信的核心协议

学习目标

掌握TCP/IP协议栈及各层协议功能

应用层

HTTP, FTP, SMTP, DNS

传输层

TCP, UDP

网络层

IP, ICMP, ARP

物理层

电缆, 光纤, 无线电

TCP/IP协议栈

  • 应用层:提供应用程序接口
  • 传输层:提供端到端通信
  • 网络层:处理数据包路由
  • 链路层:处理物理网络连接

OSI模型

  • 应用层(7)
  • 表示层(6)
  • 会话层(5)
  • 传输层(4)
  • 网络层(3)
  • 数据链路层(2)
  • 物理层(1)

协议选择建议

1. 需要可靠传输:使用TCP
2. 需要快速传输:使用UDP
3. 文件传输:使用FTP或SFTP
4. Web服务:使用HTTP/HTTPS
5. 实时通信:使用WebSocket

第四部分:TCP与UDP

掌握两种核心传输层协议

学习目标

理解TCP与UDP的区别、适用场景及Java实现

TCP协议

传输控制协议(可靠连接)

  • 面向连接
  • 可靠传输
  • 流量控制
  • 拥塞控制
  • 顺序传输

适用场景: Web浏览、文件传输、邮件

UDP协议

用户数据报协议(无连接)

  • 无连接
  • 不可靠传输
  • 低延迟
  • 无流量控制
  • 无拥塞控制

适用场景: 视频流、在线游戏、DNS查询

特性 TCP UDP
连接类型 面向连接 无连接
可靠性
速度 较慢 较快
数据顺序 保证顺序 不保证顺序
头部大小 20-60字节 8字节
流量控制

选择建议

1. 需要可靠传输:选择TCP
2. 需要低延迟:选择UDP
3. 大数据量传输:选择TCP
4. 实时应用:选择UDP
5. 简单查询:选择UDP

第五部分:InetAddress类

掌握Java中处理IP地址的核心类

学习目标

理解InetAddress类的使用及常见方法

InetAddress基本使用

import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressExample { public static void main(String[] args) { try { // 获取本地主机地址 InetAddress localHost = InetAddress.getLocalHost(); System.out.println("本地主机地址: " + localHost.getHostAddress()); System.out.println("本地主机名称: " + localHost.getHostName()); // 通过主机名获取地址 InetAddress googleAddress = InetAddress.getByName("www.google.com"); System.out.println("Google IP地址: " + googleAddress.getHostAddress()); // 获取所有地址 InetAddress[] allAddresses = InetAddress.getAllByName("www.google.com"); System.out.println("Google所有IP地址:"); for (InetAddress addr : allAddresses) { System.out.println(" - " + addr.getHostAddress()); } // 检查可达性 System.out.println("Google可达性: " + googleAddress.isReachable(3000)); } catch (UnknownHostException e) { System.err.println("无法解析主机名: " + e.getMessage()); } catch (IOException e) { System.err.println("网络错误: " + e.getMessage()); } } }
本地主机地址: 192.168.1.100
本地主机名称: MyComputer
Google IP地址: 172.217.160.100
Google所有IP地址:
- 172.217.160.100
- 2607:f8b0:4009:80e::2004
Google可达性: true

InetAddress核心方法

  • getLocalHost():获取本地主机地址
  • getByName():通过主机名获取地址
  • getAllByName():获取主机所有地址
  • getHostAddress():获取IP地址字符串
  • getHostName():获取主机名
  • isReachable():检查主机可达性

常见错误

  • UnknownHostException:主机名无法解析
  • SecurityException:安全管理器限制
  • IOException:网络连接问题
  • IPv4与IPv6兼容性问题

第六部分:常见错误与解决方案

避免网络编程中的常见问题

1. 主机名解析失败

UnknownHostException异常

try { InetAddress address = InetAddress.getByName("invalidhostname"); } catch (UnknownHostException e) { System.err.println("无法解析主机名: " + e.getMessage()); }

解决方案:检查主机名拼写、DNS配置或使用IP地址

2. 端口已被占用

BindException异常

try { ServerSocket serverSocket = new ServerSocket(8080); } catch (IOException e) { System.err.println("端口已被占用: " + e.getMessage()); }

解决方案:选择其他端口或释放被占用的端口

3. 连接超时

ConnectException或SocketTimeoutException

try { Socket socket = new Socket(); socket.connect(new InetSocketAddress("example.com", 8080), 5000); } catch (SocketTimeoutException e) { System.err.println("连接超时: " + e.getMessage()); } catch (IOException e) { System.err.println("连接错误: " + e.getMessage()); }

解决方案:检查网络连接、防火墙设置或增加超时时间

4. 防火墙阻止

无法建立连接

// 客户端无法连接服务器 try { Socket socket = new Socket("server-ip", 8080); } catch (IOException e) { System.err.println("连接被拒绝: " + e.getMessage()); }

解决方案:检查服务器防火墙设置,确保端口开放

5. IPv4/IPv6兼容问题

连接失败或性能下降

// 优先使用IPv4 System.setProperty("java.net.preferIPv4Stack", "true"); // 或优先使用IPv6 System.setProperty("java.net.preferIPv6Addresses", "true");

解决方案:明确指定协议栈偏好

6. 资源未关闭

资源泄漏导致性能下降

// 错误示例:未关闭Socket Socket socket = new Socket("example.com", 80); // 使用后忘记关闭

解决方案:使用try-with-resources确保资源关闭

// 正确示例:使用try-with-resources try (Socket socket = new Socket("example.com", 80)) { // 使用socket } catch (IOException e) { e.printStackTrace(); }

第七部分:练习与测验

通过练习巩固网络基础知识

动手练习

  • 实现一个简单的端口扫描器
  • 编写程序获取本机所有网络接口信息
  • 创建一个简单的TCP客户端/服务器
  • 实现主机可达性检测工具
1

网络知识测验

IPv4地址由多少位组成?
以下哪个端口通常用于HTTPS协议?

学习资源推荐

1. 《Java网络编程》- Elliotte Rusty Harold
2. Oracle官方文档:java.net包
3. Wireshark网络协议分析工具
4. TCP/IP详解 卷1:协议