【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 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
明天也要努力学习1 小时前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
HideF1 小时前
Linux
linux·服务器·网络
万联WANFLOW1 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
听风说ml1 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
sbjdhjd2 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
taktok_ai4 小时前
用 cc-switch 连接 Taktok
网络
cpolar技术支持6 小时前
网关加 gzip,同时开启 chunked,下载回来的包解不开:把两层编码的解压顺序与长度核对做成只读页
python·http·网络编程·socket·内网穿透
小嘉丶学长6 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
LCG米6 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip