初识网络
-
- 引言
- 零、协议--独立计算机到万物互联
- [一、 OSI七层模型:网络通信的"理想国"](#一、 OSI七层模型:网络通信的“理想国”)
- 二、Socket:程序与网络的"插座"
- 三、TCP:传输层的"定海神针"
- [四、 HTTP:应用层的"对话语言"](#四、 HTTP:应用层的“对话语言”)
- 五、总结------一次网页请求的全过程
那么接下来我们Java进阶之路的这一篇则带大家细致的过一遍网络的知识,由浅入深讲清楚网络通信的底层机制,好的,话不多说,我们来开始正题!
引言
当你在学新知识的时候,想必都会用到浏览器来搜索不会的知识,有一天你对一个知识模模糊糊,晕晕乎乎,于是你打开了你的电脑,打开了浏览器,对着浏览器一气呵成的输入'啥是TCP,HTTP啊啊啊',当你按下回车时,页面瞬间加载...
等等
等等
等等
这背后究竟发生了什么,数据是怎么到我面前的???
针对于这个问题呢,我们要先对网络通信有个大概的知识~
零、协议--独立计算机到万物互联
其实在最初计算机是以独立形态存在的,也就是说各个计算机的功能仅局限于单一任务处理,但是随着技术的发展,为了打破这种隔阂,人们就开始制定协议~
那么协议是什么呢?
其实就是由于当时不同公司的计算机语言是不通的,于是各企业呢,就商量着统一一下规则,不管你是A公司还是B公司,都要遵从这个规则,这样就保证了传输数据有了统一的标准,最终变成了今日的万物互联
于是,就将通信协议中必要的功能分成了七层,也就是我们熟知的OSI七层模型,每一层都可以独立使用,即使某些系统中的层级发生变化,也不会波及整个系统。因此可以构造一个可扩展性和灵活性都较强的系统
一、 OSI七层模型:网络通信的"理想国"
OSI(Open Systems Interconnection,开放系统互连)模型 是国际标准化组织(ISO)在1984年提出的理论框架 。你可以把它想象成法律条文------它规定了网络通信应该怎么做,但在实际的"江湖"(互联网)中,大家往往只遵守其中最核心的部分。
它把复杂的通信过程拆解为7个层次,越往下,离硬件越近;越往上,离用户越近。
为了方便记忆,我们可以把这七层看作是一个寄信的过程:
| 层级 | 名称 | 关键词 | 作用 | 数据形态 | 对应协议/技术 |
|---|---|---|---|---|---|
| 7 | 应用层 | "写信人" | 提供网络服务接口,直接与用户交互 | 数据 | HTTP, FTP, SMTP |
| 6 | 表示层 | "翻译/加密" | 数据格式转换、加密解密、压缩解压 | 数据 | SSL/TLS, JPEG, ASCII |
| 5 | 会话层 | "通话管理" | 建立、管理和终止会话(连接) | 数据 | RPC, NetBIOS |
| 4 | 传输层 | "邮局分拣" | 提供端到端的可靠传输(重点!) | 段 | TCP, UDP |
| 3 | 网络层 | "导航系统" | 逻辑寻址(IP地址)、路由选择 | 包 | IP, ICMP, ARP |
| 2 | 数据链路层 | "本地快递" | 物理寻址(MAC地址)、差错检测 | 帧 | Ethernet, PPP |
| 1 | 物理层 | "公路/车辆" | 传输比特流(0和1),定义电压、接口 | 比特 | RJ45, 光纤, 集线器 |
如果把网络通信比作一次快递寄送,我们就能轻松理解"分层模型"的奥秘。就像我们寄快递时,不需要关心飞机怎么飞、路怎么修,只需要把包裹交给快递员,网络通信也是一套严密的分工协作体系。
无论是理论界的OSI七层模型,还是实战界的TCP/IP四层模型,其精髓都在于**"分而治之"**:将复杂的通信过程拆解为若干个逻辑层次,每一层只专注于自己的职责,层与层之间通过接口协作。
本文将聚焦于这一协作链条中的三个关键角色:
- 接口层(Socket):程序接入网络的"插座"。
- 传输层(TCP):保证数据可靠的"运输队"。
- 应用层(HTTP):定义业务规则的"对话语言"。
那么,这个流程中,第一个登场的"接口人"是谁?------是 Socket。
二、Socket:程序与网络的"插座"
Socket(套接字),是操作系统提供的抽象接口,充当应用程序(应用层)与网络协议栈之间(传输层)的桥梁。其核心作用是将底层网络协议(如TCP/IP)的复杂性隐藏,为开发者提供统一的读写、连接等操作接口。类比电力系统中插座标准化电流传输,Socket标准化了网络数据传输。
技术实现逻辑
- 唯一标识 :通过
IP地址 + 端口号定位服务。例如192.168.1.1:80。 - 核心作用 :将底层复杂的网络协议(如TCP/IP)封装成简单的读写(
send/recv)、连接(connect)等API接口。 - 操作原语 :
socket():创建套接字并指定协议类型(如AF_INET、SOCK_STREAM)。
bind():将套接字绑定到特定IP和端口(服务端必备)。
listen():启动监听队列(TCP服务端)。
accept():接受客户端连接并生成新套接字。
Java 实现示例
以下代码展示了如何使用Java原生API创建一个TCP服务端:
java
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws Exception {
// 1. 创建ServerSocket并绑定8080端口
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务端已启动,等待连接...");
// 2. 持续监听并接受客户端连接
while (true) {
// accept() 是阻塞方法,等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接: " + clientSocket.getInetAddress());
// 此处可开启新线程处理业务逻辑
}
}
}
关键点:
ServerSocket用于监听端口。accept()方法会阻塞线程,直到有客户端连接进来,返回一个专属的Socket对象。- Socket vs 协议:Socket是接口(API),TCP/UDP是协议(规则)。
三、TCP:传输层的"定海神针"
有了Socket这个"插座",数据就能发出去了吗?还不够,我们还需要一个可靠的"运输队"。这就是 TCP(传输控制协议) 的职责。
TCP位于传输层,它为两个Socket之间建立了一条面向连接、可靠、有序的字节流通道。
TCP 的核心机制
- 面向连接:通信前必须先"握手",通信后必须"挥手"告别。
- 可靠传输:保证数据不丢失、不重复、按序到达。
- 全双工:双方可以同时发送和接收数据。
三次握手(建立连接)
就像打电话,必须确认双方都能听到:
- SYN:客户端 -> 服务端:"在吗?我要连上了。"
- SYN-ACK:服务端 -> 客户端:"在,我也准备好了,收到你的请求了。"
- ACK:客户端 -> 服务端:"好,我也收到你的回复了,开始通话吧。"
四次挥手(断开连接)
因为TCP是全双工,双方都需要单独关闭:
- FIN:客户端 -> 服务端:"我说完了,要挂了。"
- ACK:服务端 -> 客户端:"收到,你可以挂了。"
- FIN:服务端 -> 客户端:"我也说完了。"
- ACK:客户端 -> 服务端:"收到,再见。"
流量与拥塞控制
- 流量控制:通过滑动窗口,防止发送方太快导致接收方缓冲区溢出。
- 拥塞控制:慢启动、拥塞避免,防止网络瘫痪。
四、 HTTP:应用层的"对话语言"
当可靠的运输通道建立好后,应用层的程序们终于可以开始"对话"了。
HTTP(超文本传输协议),就是浏览器与服务器之间约定俗成的"对话语言"。它定义了客户端如何向服务器请求资源(如网页、图片),以及服务器如何向客户端返回响应。
HTTP 的工作模式
- 请求-响应模型 :
- 客户端:"我要一个网页(GET请求)。"
- 服务端:"给你,这是你要的网页(200状态码+HTML内容)。"
- 无状态:每一次交流都是独立的,服务器不记得上一次的对话(可通过Cookie/Session维持状态)。
报文结构
- Headers(首部) :包含元数据,如
Content-Type(内容类型)、User-Agent(浏览器类型)。 - Body(主体):包含实际数据,如HTML代码、JSON数据。
Java HTTP 请求示例
使用 HttpURLConnection 发送 GET 请求:
java
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpGetExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
System.out.println("响应码: " + responseCode); // 200 表示成功
// 读取响应内容...
connection.disconnect(); // 记得关闭连接
}
}
五、总结------一次网页请求的全过程
让我们以"浏览器访问 https://example.com"为例,复现数据流动的完整闭环:
-
DNS解析 :浏览器将域名
example.com解析为 IP 地址(找到门牌号)。 -
创建Socket:浏览器调用操作系统 API 创建一个 Socket。
-
TCP三次握手:浏览器(客户端)通过 Socket 向服务器 IP 的 443 端口(HTTPS)发起连接请求,经过三次握手建立可靠通道。
-
发送HTTP请求 :浏览器通过 Socket 发送 HTTP 请求报文:
httpGET / HTTP/1.1 Host: example.com -
服务器处理:服务器接收到请求,处理逻辑(如读取网页文件),组装 HTTP 响应报文(包含状态码 200 和网页 HTML)。
-
数据传输:响应数据通过 TCP 通道传输回浏览器,TCP 负责保证数据的完整性和顺序。
-
渲染页面:浏览器接收到数据,解析 HTML 并渲染出可视化的网页。
-
连接关闭:数据传输完毕,双方通过四次挥手断开 TCP 连接。
这就是一次网页请求的全过程!
回顾整个过程,我们可以清晰地勾勒出它们的关系:
- Socket 是接口,是程序接入网络的入口(插座)。
- TCP 是通道,是保证数据可靠传输的基石(运输队)。
- HTTP 是语言,是应用层定义业务规则的协议(对话)。
理解这三者,是排查网络问题、优化性能的基石。
- Socket错误:通常是端口被占用、连接超时。
- TCP错误:通常是网络不通、丢包严重。
- HTTP错误:通常是业务逻辑错误(404找不到,500服务器内部错误)。
这就是我们今天的全部内容,希望对您有所帮助
本篇其实还有诸多细节,诸多概念,后续再给大家慢慢讲解产出
那么最后结尾还是分享给大家一句话~
"不是因为有些事情难以做到,我们才失去信心;而是因为我们失去了信心,有些事情才显得难以做到。" ------ 维吉尔
本文参考书籍:《图解TCP/IP》
由AI助手进行辅助