五层协议介绍
层次 | 核心功能 | 典型协议/设备 |
---|---|---|
应用层 | 为用户应用程序提供网络服务接口(如文件传输、电子邮件、网页浏览) | HTTP、FTP、SMTP、DNS、SSH |
传输层 | 提供端到端的可靠或不可靠数据传输,处理流量控制和差错恢复 | TCP(可靠)、UDP(不可靠) |
网络层 | 负责数据包的路由选择和跨网络传输,处理逻辑寻址(如IP地址) | IP、ICMP、ARP、路由器 |
数据链路层 | 将比特流封装为帧,提供物理寻址(如MAC地址)和错误检测,管理链路访问控制 | Ethernet、Wi-Fi(802.11)、PPP、交换机 |
物理层 | 定义物理介质的电气、机械特性,传输原始比特流(0/1信号) | 双绞线、光纤、无线信号、中继器 |
一、应用层
1.作用:直接为用户应用程序提供网络服务,定义数据格式和交互规则
2.主要协议:HTTP协议,HTTPS协议
3.储备知识
1)日常我们在浏览器上见到的url(统一资源定位符)中包括协议,域名,资源路径
2)表现形式:协议://域名/资源路径
3)域名会被解析成IP地址
4)使用域名的原因:域名具有更强的表义性,便于用户了解自己访问的是哪个服务器
5)DNS(域名系统):存储IP地址和域名的映射关系
4.HTTP协议的介绍
4.1HTTP请求
1)HTTP以空行为分隔符做到了报头与有效载荷的分离
2)client和server如何保证自己读到的报文是完整的?
答:step1:读取字节流,分析读到的字节流是否存在空行
step2:提取content-length,获得正文长度,然后再读取或截取指定长度的内容
注:如果接收方的应答内携带数据,他的response中的响应报头中携带content-length:xx
4.2HTTP响应
1)content-type:数据类型
2)一张网页内可能有多种资源(如:网页自己+图片),这就导致了如果想获得网页,除识别网页外,还要识别其他类型,故而浏览器会发送第二次请求
3)临时重定向和永久重定向
临时重定向:不改变任何信息,多用于登录,跳转,状态码多为302/307
永久重定向:多用于网站更换域名或更换网址,状态码多为301/308
4)方法:Get和Post
Get:获取资源,如果进行参数提交通过uri进行提交
Post:上传资源,如果进行参数提交通过httprequest正文提交
Get | Post(相较于Get比较安全) |
提交的参数不宜过长 | 可以传送长数据 |
会回显参数 | 不会回显参数 |
注:Get和Post都不安全,二者皆为明文传送
5)为了在一定程度上解决安全问题,引入session和cookie
3.协议数据单元(PDU):数据
二、传输层
1.作用:确保数据从源进程可靠传输到目标进程(通过端口号标识)
2.主要协议:TCP和UDP
特性 | TCP | UDP |
---|---|---|
设计目标 | 提供可靠、有序、无差错的数据传输 | 提供高效、低延迟的简单数据传输 |
连接管理 | 面向连接(需建立和释放连接) | 无连接(直接发送数据,无需握手) |
传输方式 | 字节流(无边界,需应用层自行分帧) | 数据报(保留消息边界,每个UDP包独立) |
3.TCP协议
1)报头和有效载荷如何分离?
答:读取报文段的前20个字节,提取前4位首部长度,计算有效载荷长度
2)可靠性的原因:对于每一次请求都会有对应的应答,保证了历史消息的可靠性(即保证可靠的核心机制是确认应答机制)
3)面试题:为什么报文段里需要包含两个序号(确认序号和序号)
答:服务器不一定只作应答,他可能是捎带应答(应答+数据),这就要求接收方既要对报文进行确认,又要包含自己的序号
4)标志位
标志位 | 全称 | 作用 | 取值含义 | 典型场景 | 核心特点 |
---|---|---|---|---|---|
URG | Urgent Pointer | 标识紧急指针字段是否有效,用于高优先级数据传输 | 1=紧急数据有效;0=无效 | 服务端响应慢时,客户端发送紧急状态查询(如“立即终止”指令) | 紧急数据优先处理,应用层称为“带外数据” |
ACK | Acknowledgment | 确认号字段是否有效,表示报文为确认包 | 1=确认号有效;0=无效(仅握手首包) | 所有正常通信报文(除首次SYN)均需ACK=1 | 累积确认机制,确认号为期望接收的下一个字节序号 |
PSH | Push Function | 强制接收方立即将数据交付应用层,避免缓冲区堆积 | 1=立即推送;0=正常缓存 | 交互式应用(如Telnet、SSH)需实时显示用户输入 | 减少延迟,优化实时性 |
RST | Reset Connection | 强制释放连接并重建,通常因严重错误(如主机崩溃、非法数据包)触发 | 1=重置连接;0=正常 | 连接异常、拒绝SYN Flood攻击、端口未监听时返回RST | 可单独发送或与ACK组合,快速终止连接 |
SYN | Synchronize Sequence | 初始化序列号,用于连接请求或接受报文 | 1=发起/接受连接;0=正常数据 | TCP三次握手(客户端SYN→服务端SYN+ACK→客户端ACK) | 不携带数据但消耗序列号,建立连接唯一方式 |
FIN | Finish Transmission | 发送方数据已发送完毕,请求释放连接(可能仍有接收能力) | 1=终止连接;0=正常 | TCP四次挥手(客户端FIN→服务端ACK→服务端FIN→客户端ACK) | 即使无数据也消耗序列号,支持半关闭状态(如服务端继续发送数据) |
5)3次握手建立连接
阶段 | 客户端动作 | 服务端动作 | 报文标志位 | 关键作用 |
---|---|---|---|---|
1. SYN_SENT | 发送SYN包(请求连接) | 监听端口,等待客户端请求 | SYN=1, seq=x | 客户端初始化序列号x ,表示“我想建立连接”。 |
2. SYN_RCVD | 等待服务端响应 | 收到SYN后回复SYN+ACK包 | SYN=1, ACK=1, seq=y, ack=x+1 | 服务端确认客户端请求(ack=x+1 ),并初始化自身序列号y 。 |
3. ESTABLISHED | 发送ACK包(确认连接) | 收到ACK后连接建立 | ACK=1, seq=x+1, ack=y+1 | 客户端确认服务端响应,双方进入ESTABLISHED状态,可开始数据传输。 |
Q:为什么要进行3次握手?
A:1.以最短的方式验证全双工2.以最小的成本100%确认双方的通信意愿
6)4次回收释放连接
阶段 | 主动关闭方(客户端) | 被动关闭方(服务端) | 报文标志位 | 关键作用 |
---|---|---|---|---|
1. FIN_WAIT_1 | 发送FIN包(请求关闭) | 收到FIN后进入CLOSE_WAIT状态 | FIN=1, seq=u | 客户端表示“我数据已发送完毕,但可能继续接收数据”。 |
2. CLOSE_WAIT | 等待服务端确认 | 回复ACK包 | ACK=1, seq=v, ack=u+1 | 服务端确认客户端关闭请求,但可能仍有数据未发送完。 |
3. LAST_ACK | (可选)继续接收数据 | 发送FIN包(服务端数据发送完毕) | FIN=1, ACK=1, seq=w, ack=u+1 | 服务端表示“我数据也发送完毕,可以关闭连接”。 |
4. TIME_WAIT | 回复ACK包(确认服务端关闭) | 收到ACK后进入CLOSED状态 | ACK=1, seq=u+1, ack=w+1 | 客户端确认服务端关闭,等待2MSL(最大报文段生存时间)后释放资源(防止延迟报文干扰)。 |
Q1:为什么主动断开连接的一方要进入TIME_WAIT?
A1:保证在传输方向上尚未达到的报文已经在网络中消散,不会引起下一次连接的错误
Q2:如果client已经退出或者关闭,服务器端不关闭会怎样?
A2:服务器会一直处于TIME_WAIT状态,依旧占用fd,连接没有释放
7)滑动窗口
发送方一次可以发送多少数据有自己的滑动窗口的大小决定
滑动窗口的大小=min(对方的接收能力,拥塞窗口的大小)
滑动窗口不可以向左滑动
8)快重传和超时重传
快重传的条件:连续收到3个重复确认
超时重传的条件:超时并且没有应答
9)拥塞控制
9.1)目标:避免网络过载
9.2)四大算法
算法名称 | 触发条件 | 核心行为逻辑 | 关键特点 | 典型应用场景 |
---|---|---|---|---|
慢启动(Slow Start) | 连接建立、超时重传后,或从快速恢复退出后(部分实现)。 | 1. 初始cwnd=1 MSS (或更小)。2. 每收到一个ACK, cwnd += 1 MSS (指数增长)。3. 达到 ssthresh 后切换到拥塞避免。 | 快速探测带宽:指数增长迅速扩大发送窗口。 风险控制:避免一开始就发送大量数据导致网络过载。 | 连接初期、网络空闲后的数据传输启动阶段。 |
拥塞避免(Congestion Avoidance) | cwnd ≥ ssthresh ,或从快速恢复退出后。 | 1. 每收到一个ACK,cwnd += 1 MSS / cwnd (线性增长,每轮RTT增加1 MSS)。2. 发生丢包时,进入快速重传/恢复。 | 保守增长:缓慢增加发送速率,防止触发拥塞。 稳定性优先:适合网络负载接近阈值时。 | 网络带宽接近饱和时的持续数据传输阶段。 |
快速重传(Fast Retransmit) | 收到3个重复ACK(表明中间有数据包丢失,但后续数据已到达接收方)。 | 1. 立即重传丢失的段(无需等待超时)。 2. 触发快速恢复,调整 ssthresh 和cwnd 。 | 快速响应丢包:比超时重传减少数秒等待时间。 依赖重复ACK:适用于部分丢包场景。 | 网络轻微拥塞或随机丢包时的快速恢复。 |
快速恢复(Fast Recovery) | 快速重传后(即收到3个重复ACK后)。 | 1. ssthresh = cwnd / 2 (减半拥塞阈值)。2. cwnd = ssthresh + 3*MSS (补偿已离开网络的3个重复ACK对应的段)。3. 每收到一个重复ACK, cwnd += 1 MSS ;收到新ACK后退出,进入拥塞避免。 | 避免慢启动:维持较高发送速率,减少性能波动。 补偿机制:通过重复ACK推断网络状态。 | 快速重传后的拥塞窗口调整,平衡效率与稳定性。 |
3.协议数据单元(PDU):TCP的报文段,UDP的用户数据报
三、网络层
1.作用:通过路由算法(如Dijkstra)确定数据包从源到目标的最佳路径
2.主要协议:IP协议
1)TCP/IP协议的核心功能是将数据100%可靠从主机A传输到主机B
2)IP地址=网络号+主机号
3)子网划分
Q:问什么要进行子网划分?
A:未来查找目标主机时从目标网络中查找,从而提高效率
4)在网络通信中,私有IP不能出现在公网中,因为私有IP可以重复,这将导致从此发出的报文无法回来
5)每经过一个内网路由器进行src:ip替换,替换成当前路由器的wan口IP
6)将内网IP转换为公网IP需要借助NAT技术
3.协议数据单元(PDU):IP数据报
四、数据链路层
1.作用:将网络层数据包封装为帧(Frame),添加帧头和帧尾。
2.主要协议:PPP协议
3.协议数据单元(PDU):数据帧
4.数据链路层的三个基本问题:封装成帧,透明传输,差错检测
五、物理层
1.作用:通过物理介质(如电缆、无线信号)传输比特流
2.协议数据单元(PDU):比特