【Java网络编程核心-0】从OSI七层到TCP/IP模型深度解析(HTTP协议、TCP、UDP 、 IP协议)

一、OSI七层模型

|-------------|-----------|---------------------------|------------------------------|
| OSI 七层模型 | TCP/IP 模型 | 功能 | 核心协议/组件 |
| 应用层、表示层、会话层 | 应用层 | 负责应用程序间的沟通、数据格式化、加密等。 | HTTP ,DNS, WebSocket |
| 传输层 | 传输层 | 提供端到端的通信,负责流量控制和可靠性。 | TCP, UDP |
| 网络层 | 网络层 | 负责寻址(IP地址)和路由选择,解决跨网络传输。 | IP, ICMP, ARP |
| 数据链路层、物理层 | 数据链路层 | 网络接口层负责物理传输,处理 MAC 地址和比特流 | 以太网, Wi-Fi |

访问一个网页的具体流程

大体流程:

  • 解析地址 :通过 DNS 将域名转为 IP 地址。

  • 建立连接 :通过 TCP 三次握手 建立可靠传输通道。

  • 发送请求 :客户端发送 HTTP Request

  • 返回数据 :服务器处理并返回 HTTP Response

  • 渲染页面:浏览器解析 HTML 并展示。

  • 断开连接 :通过 TCP 四次挥手 释放资源。

深度解析:( 五层协议栈的详细流程**)**

  1. 应用层 (Application Layer):构建请求--请求报文

输入: [http://www.baidu.com/index.html\]

DNS 解析 :域名www.example.com----DNS服务器----->对应IP 地址110.242.68.4

**构建 HTTP 请求:**浏览器生成一个 HTTP 请求报文:

①首行:请求方法get/set(浏览器默认get)+url

①请求头header:每行是键值对信息,比如content type;content length;Cookie

①空行:标识header结束

①正文body:get的参数放在首行的?后,post的放在body

  1. 传输层 (Transport Layer) ------ 端到端连接--TCP报头(端口号-16位

选择协议 :HTTP <2.0默认使用 TCP 协议

建立连接:(三次握手)确认双方都有收发数据的能力

整个 HTTP 请求报文切分成小段,贴上源端口和目标端口(HTTP 默认80,HTTPS 默认 443)信息

  1. 网络层 (Network Layer) ------ 寻址与路由--IP报头(IP地址-ipv4(32);ipv6(64)

IP 封装: 传输层的小段被交给网络层,封装成 IP 数据报

核心操作 :加上源 IP 地址 (你的电脑)和目标 IP 地址(百度服务器)

路由转发:路由器根据路由表,决定这个包下一步该跳往哪个路由器,最终到达目标机房

最终封装为:IP报头|TCP报头|HTTP报文

  1. 数据链路层 (Data Link Layer) ------ 物理跳跃

MAC 封装 :IP 数据报被封装成 以太网帧

ARP 协议 :为了在局域网内传输,需要通过 ARP 协议 找到网关路由器的 MAC 地址

寻址:每一帧都包含源 MAC 和目标 MAC,数据在物理链路上一跳一跳地传递

  1. 物理层 (Physical Layer) ------ 比特流传输

信号转换:数据帧被转换为电信号、光信号或无线电波(0 和 1 的比特流),通过网线、光纤或 Wi-Fi 发射出去

1.1 HTTP

https和http的区别

HTTPS(HTTP + SSL/TLS)

|-----------|---------------------|-------------------------------|
| 特性 | HTTP | HTTPS |
| 安全性 | 明文传输,数据易被窃听、篡改。 | 加密传输,通过身份认证确保安全。 |
| 默认端口 | 80 | 443 |
| 证书 | 无需证书 | 需要向 CA(机构) 申请证书 |
| OSI层级 | 应用层。 | 应用层与传输层之间增加了 SSL/TLS 层 |
| 性能 | 握手快,响应迅速 | 需要进行 SSL 握手,对 CPU 性能有一定消耗 |

HTTPS 的"握手"流程

HTTPS 需要在 TCP 之后再进行一次 SSL/TLS 握手

HTTPS 主要解决了 HTTP 的三个安全问题:

  • 机密性(Encryption) :通过 对称加密 (传输数据)和 非对称加密(交换密钥)结合,防止数据被中间人窃听。

  • 完整性(Integrity) :通过 摘要算法(如 SHA-256) 产生数据的数字指纹。如果数据被篡改,指纹对比就会失败。

  • 身份认证(Authentication) :通过 数字证书 证明服务器的身份。防止你访问的是"钓鱼网站"。

1.2 TCP/UDP

|----------|----------------------|----------------|
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
| 连接性 | 面向连接(需握手) | 无连接(直接发) |
| 可靠性 | 可靠(保证不丢、不乱) | 不可靠(尽力而为) |
| 传输方式 | 字节流(无消息边界) | 数据报(有消息边界) |
| 首部开销 | 大(最小 20 字节) | 小(固定 8 字节) |
| 适用场景 | 网页 (HTTP)、文件传输 (FTP) | 直播、语音通话、即时游戏 |

TCP 如何保证可靠

  • 序列号与确认应答 (ACK):给每个包编号,确保不丢包、不重复、不乱序。

  • 校验和 (Checksum):检测数据在传输中是否损坏,损坏则丢弃。

  • 超时重传:发出的包若在规定时间内未收到 ACK,则认为丢包并重发。

  • 流量控制 (Flow Control):通过"滑动窗口"告知发送方自己的处理能力,防止接收端缓冲区溢出。

  • 拥塞控制 (Congestion Control):感知网络拥堵情况(如慢启动),动态调整发送速度,防止网络崩溃。

三次握手

  • 第一次握手 (SYN) :客户端向服务端发送连接请求报文,包含一个初始序列号x。此时客户端进入 SYN_SENT 状态。

  • 第二次握手 (SYN+ACK) :服务端收到请求,如果同意连接,则发回确认报文。包含确认号 x+1和服务端自己的初始序列号 y。此时客户端进入 ESTABLISHED 状态。

  • 第三次握手 (ACK) :客户端收到确认后,再发送一个确认报文,确认号为y+1。此时服务器进入 ESTABLISHED 状态

为什么握手不能合并成两次:

++防止旧连接请求误导++:假设只有两次握手,一个因网络阻塞而延迟的 SYN 包在连接关闭后才到达服务端,服务端会误以为是新连接并进入 ESTABLISHED 状态。但客户端此时并无连接意向,不会理会服务端的确认,导致服务端资源白白浪费。

++确认双方收发能力++:两次握手只能保证服务端收到了信息,无法确认客户端是否收到了服务端的反馈。只有三次握手才能确保两端都具备完整的收与发能力

四次挥手

挥手需要四次,是因为 TCP 是全双工的。当一方停止发送数据时,另一方可能还有数据没发完。

  1. 第一次挥手 (FIN):客户端发起关闭请求,告诉服务端:"我没数据发了"

  2. 第二次挥手 (ACK):服务端操作系统内核立即返回确认。此时客户端进入不再发数据,但仍能接收数据。

  3. 第三次挥手 (FIN):服务端处理完剩余数据后,调用close()关闭资源,发起关闭请求。

  4. 第四次挥手 (ACK):客户端确认,服务端closed状态,客户端等了一会closed

关键点 :客户端发送完最后的 ACK 后,必须等待 2MSL(最大报文生存时间)才真正关闭。若后一个 ACK没到达,服务器会再次发送FIN,防止因丢包导致服务端无法正常关闭。

粘包问题

TCP 是 面向字节流 的,它不理解业务数据的逻辑边界。如果发送端连续发送两个小数据包,TCP 可能会为了提高传输效率将它们合并成一个大包发送;或者一个大包被拆成两个。接收方收到的数据就像"粘"在一起了,无法区分哪里是第一条消息的结尾

++解决方案(在应用层处理)++

  • 固定长度:规定每个数据包固定为 128 字节,不足的补位。

  • 分隔符 :在每条消息末尾增加特殊字符(如 \n)。

  • 长度前缀 (Length Field)最主流方案 。在包头先用 4 个字节存入 Body 的长度。接收方先读 4 字节拿到长度,再精准读取后续内容。

  • 序号:本报文段所发送的数据的**第一个字节的编号,**接收方根据序号,就能像拼拼图一样,把乱序的包按正确顺序重新排好

  • 确认序号:接收方告诉发送方,期望收到对方下一个报文段的第一个数据字节的序号

1.3 IP

核心任务

IP 协议主要做两件事:

  1. 寻址(Addressing):为每一台联网设备分配一个唯一的身份证号(IP 地址)。

  2. 路由(Routing):决定数据包在复杂的网络中,每一跳(Hop)应该往哪儿走,最终到达目的地

生存时间(TTL, Time To Live)

  • 关键点:防止数据包在网络中由于路由环路无限循环。每经过一个路由器,TTL 减 1,减到 0 时,数据包被丢弃并返回错误

IP 协议的"三不"原则(不可靠性):

IP 协议本身是不可靠的:

  • 不保证可靠交付:数据包丢了、错了,IP 协议不管(交给上层 TCP 解决)。

  • 无连接:发包前不需要打招呼,每个包独立选择路径。

  • 无序性:先发的包可能后到,后发的可能先到

  • 校验和:看 IP 头里的校验和,如果发现头坏了直接丢弃

IP 协议的工作流程

  1. 封装 :应用层产生数据,传输层套上 TCP 头,网络层套上 IP 头(写上你的 IP 和服务器 IP)。

  2. 分片(Fragmentation):如果你的数据包太大,超过了链路能承载的上限(MTU),IP 协议会把包切成几块,到了目的地再由目标机的 IP 层重组。

  3. 路由:你的数据包进入路由器。路由器查"路由表",发现目标 IP 离自己很远,于是丢给下一个更近的路由器。

  4. 解封装:服务器收到 IP 包,检查目的 IP 是不是自己,是的话剥掉 IP 头,把里面的 TCP 数据交给传输层。

相关推荐
老毛肚1 小时前
循环网络神经模型基础快速入门
网络
DavidTaozhe1 小时前
美股api接口的WebSocket订阅如何实现自动重连
网络·websocket·网络协议
草莓熊Lotso1 小时前
【Linux网络】从 0 到 1 实现高性能 UDP 聊天室:深入拆解 Linux 网络编程与线程池架构
linux·运维·服务器·网络·数据库·c++·udp
艾莉丝努力练剑1 小时前
【Linux网络】Linux 网络编程:应用层自定义协议与序列化(2)序列化与反序列化
linux·运维·服务器·c++·网络协议·序列化
天问一2 小时前
bat文件切换电脑ip
服务器·网络·tcp/ip
yyuuuzz2 小时前
企业出海aws运维常见问题梳理
运维·服务器·网络·数据库·aws
悟渔2 小时前
STM32N6系列MIDI 串口 GPDMA 环形接收解析模块
网络
AOwhisky2 小时前
Docker 学习笔记:网络篇
linux·运维·网络·笔记·学习·docker·容器
Bat U2 小时前
JavaEE|网络编程
运维·服务器·网络