一、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 四次挥手 释放资源。
深度解析:( 五层协议栈的详细流程**)**
- 应用层 (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
- 传输层 (Transport Layer) ------ 端到端连接--TCP报头(端口号-16位
选择协议 :HTTP <2.0默认使用 TCP 协议
建立连接:(三次握手)确认双方都有收发数据的能力
整个 HTTP 请求报文切分成小段,贴上源端口和目标端口(HTTP 默认80,HTTPS 默认 443)信息
- 网络层 (Network Layer) ------ 寻址与路由--IP报头(IP地址-ipv4(32);ipv6(64)
IP 封装: 传输层的小段被交给网络层,封装成 IP 数据报
核心操作 :加上源 IP 地址 (你的电脑)和目标 IP 地址(百度服务器)
路由转发:路由器根据路由表,决定这个包下一步该跳往哪个路由器,最终到达目标机房
最终封装为:IP报头|TCP报头|HTTP报文
- 数据链路层 (Data Link Layer) ------ 物理跳跃
MAC 封装 :IP 数据报被封装成 以太网帧。
ARP 协议 :为了在局域网内传输,需要通过 ARP 协议 找到网关路由器的 MAC 地址
寻址:每一帧都包含源 MAC 和目标 MAC,数据在物理链路上一跳一跳地传递
- 物理层 (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 是全双工的。当一方停止发送数据时,另一方可能还有数据没发完。
第一次挥手 (FIN):客户端发起关闭请求,告诉服务端:"我没数据发了"
第二次挥手 (ACK):服务端操作系统内核立即返回确认。此时客户端进入不再发数据,但仍能接收数据。
第三次挥手 (FIN):服务端处理完剩余数据后,调用close()关闭资源,发起关闭请求。
第四次挥手 (ACK):客户端确认,服务端closed状态,客户端等了一会closed
关键点 :客户端发送完最后的 ACK 后,必须等待 2MSL(最大报文生存时间)才真正关闭。若后一个 ACK没到达,服务器会再次发送FIN,防止因丢包导致服务端无法正常关闭。
粘包问题
TCP 是 面向字节流 的,它不理解业务数据的逻辑边界。如果发送端连续发送两个小数据包,TCP 可能会为了提高传输效率将它们合并成一个大包发送;或者一个大包被拆成两个。接收方收到的数据就像"粘"在一起了,无法区分哪里是第一条消息的结尾
++解决方案(在应用层处理)++
固定长度:规定每个数据包固定为 128 字节,不足的补位。
分隔符 :在每条消息末尾增加特殊字符(如
\n)。长度前缀 (Length Field) :最主流方案 。在包头先用 4 个字节存入 Body 的长度。接收方先读 4 字节拿到长度,再精准读取后续内容。
序号:本报文段所发送的数据的**第一个字节的编号,**接收方根据序号,就能像拼拼图一样,把乱序的包按正确顺序重新排好
确认序号:接收方告诉发送方,期望收到对方下一个报文段的第一个数据字节的序号
1.3 IP
核心任务
IP 协议主要做两件事:
寻址(Addressing):为每一台联网设备分配一个唯一的身份证号(IP 地址)。
路由(Routing):决定数据包在复杂的网络中,每一跳(Hop)应该往哪儿走,最终到达目的地
生存时间(TTL, Time To Live) :
- 关键点:防止数据包在网络中由于路由环路无限循环。每经过一个路由器,TTL 减 1,减到 0 时,数据包被丢弃并返回错误
IP 协议的"三不"原则(不可靠性):
IP 协议本身是不可靠的:
不保证可靠交付:数据包丢了、错了,IP 协议不管(交给上层 TCP 解决)。
无连接:发包前不需要打招呼,每个包独立选择路径。
无序性:先发的包可能后到,后发的可能先到
校验和:看 IP 头里的校验和,如果发现头坏了直接丢弃
IP 协议的工作流程
封装 :应用层产生数据,传输层套上 TCP 头,网络层套上 IP 头(写上你的 IP 和服务器 IP)。
分片(Fragmentation):如果你的数据包太大,超过了链路能承载的上限(MTU),IP 协议会把包切成几块,到了目的地再由目标机的 IP 层重组。
路由:你的数据包进入路由器。路由器查"路由表",发现目标 IP 离自己很远,于是丢给下一个更近的路由器。
解封装:服务器收到 IP 包,检查目的 IP 是不是自己,是的话剥掉 IP 头,把里面的 TCP 数据交给传输层。
