Android第三次面试(网络篇补充)
TCP(传输控制协议)的 “模式” 通常指其核心工作机制和特性,这些机制共同确保数据传输的可靠性、效率和稳定性。以下是 TCP 的主要模式和特点,用通俗易懂的语言解释:
1. 面向连接模式
- 核心:先 “握手” 再通信,像打电话前先拨号。
- 过程:
- 发送方发起连接请求(SYN)。
- 接收方确认并回复(SYN+ACK)。
- 发送方再次确认(ACK),连接建立完成(三次握手)。
- 作用:确保双方准备好通信,避免无效数据传输。
2. 可靠传输模式
- 核心:数据不丢、不乱序,像寄快递要签收。
- 机制:
- 序列号:给每个字节编号,接收方按序重组。
- 确认应答(ACK):接收方收到数据后回复确认。
- 超时重传:发送方未收到 ACK 时,重新发送数据。
- 例子:下载文件时,若某部分数据丢失,TCP 会自动补传。
3. 字节流模式
- 核心:数据像水流一样连续传输,不保留消息边界。
- 特点:
- 发送方连续发送字节,接收方按顺序接收。
- 比如发送 “HELLO” 和 “WORLD” 两次,接收方可能一次性收到 “HELLOWORLD”。
- 注意:需应用层自己处理消息边界(如加分隔符)。
4. 滑动窗口模式
- 核心:动态控制发送速率,避免接收方被 “淹没”。
- 工作原理:
- 接收方告诉发送方自己当前能处理的数据量(窗口大小)。
- 发送方在窗口范围内发送数据,每收到一个确认,窗口向右滑动(允许发送更多数据)。
- 类比:快递员根据客户剩余空间调整每次送货量(见之前详细解释)。
5. 拥塞控制模式
- 核心:防止网络拥堵,像交通信号灯调节车流。
- 算法:
- 慢启动:初始发送少量数据,逐步增加速率。
- 拥塞避免:接近网络极限时,线性增长速率。
- 快重传:发现丢包时,立即重传而不等待超时。
- 快恢复:快速调整速率,减少因误判导致的性能损失。
- 目标:在网络允许的情况下最大化吞吐量。
6. 特殊选项模式
- Nagle 算法:合并小数据包,减少网络负担(适合文本传输)。
- 延迟确认(Delayed ACK):延迟发送 ACK,减少确认包数量。
- 紧急数据(Urgent Data):允许发送优先级高的数据(如终止命令)。
🔄 总结:TCP 模式的协作
TCP 通过多种模式协同工作:
- 面向连接建立通道;
- 可靠传输保证数据完整;
- 滑动窗口控制速率;
- 拥塞控制保护网络;
- 字节流适应不同应用场景。
TCP 的三次握手和四次挥手是建立和终止连接的核心流程,下面用通俗易懂的语言和生活场景类比详细解释:
一、三次握手:建立连接(像打电话)
目标
确保双方都准备好通信,并同步初始序列号(防止历史数据干扰)。
步骤拆解
-
第一次握手:客户端发起请求(SYN)
- 动作:客户端发送
SYN=1
的数据包,告诉服务器:“我想和你建立连接,我的初始序号是x
。” - 状态变化:客户端从
CLOSED
→SYN_SENT
。 - 类比:你给朋友打电话,说 “喂,能听到吗?”(等待对方回应)。
- 动作:客户端发送
-
第二次握手:服务器确认并响应(SYN+ACK)
- 动作:服务器收到请求后,发送
SYN=1
和ACK=1
的数据包,回复:“我收到了,我的初始序号是y
,确认你下次发送的序号是x+1
。” - 状态变化:服务器从
CLOSED
→SYN_RCVD
。 - 类比:朋友说 “能听到,你先说吧!”(确认连接,同时准备接收你的消息)。
- 动作:服务器收到请求后,发送
-
第三次握手:客户端确认(ACK)
- 动作:客户端发送
ACK=1
的数据包,告诉服务器:“我收到你的确认,下次发送的序号是y+1
。” - 状态变化:客户端从
SYN_SENT
→ESTABLISHED
,服务器从SYN_RCVD
→ESTABLISHED
。 - 类比:你说 “好的,我开始说了”(双方正式进入通信状态)。
- 动作:客户端发送
为什么需要三次握手?
- 防止历史连接干扰:若网络延迟导致旧的 SYN 包后到,服务器不会因为二次握手就误认为连接有效(必须等客户端确认)。
二、四次挥手:终止连接(像挂断电话)
目标
双方确认数据传输完毕,释放资源。
步骤拆解
-
第一次挥手:客户端请求关闭(FIN)
- 动作:客户端发送
FIN=1
的数据包,告诉服务器:“我没有数据要发了,可以关闭连接。” - 状态变化:客户端从
ESTABLISHED
→FIN_WAIT_1
。 - 类比:你说 “我说完了,挂了吧?”(等待对方回应)。
- 动作:客户端发送
-
第二次挥手:服务器确认(ACK)
- 动作:服务器收到请求后,发送
ACK=1
的数据包,回复:“我知道你要关闭了,但我还有数据要发,等我发完。” - 状态变化:服务器从
ESTABLISHED
→CLOSE_WAIT
,客户端从FIN_WAIT_1
→FIN_WAIT_2
。 - 类比:朋友说 “好的,我这边还有几句话,说完就挂。”(继续传输剩余数据)。
- 动作:服务器收到请求后,发送
-
第三次挥手:服务器请求关闭(FIN)
- 动作:服务器发送
FIN=1
的数据包,告诉客户端:“我数据发完了,可以关闭连接。” - 状态变化:服务器从
CLOSE_WAIT
→LAST_ACK
。 - 类比:朋友说 “我说完了,现在可以挂了。”(等待你的确认)。
- 动作:服务器发送
-
第四次挥手:客户端确认(ACK)
- 动作:客户端发送
ACK=1
的数据包,回复:“收到,连接关闭。” - 状态变化:客户端从
FIN_WAIT_2
→TIME_WAIT
,服务器从LAST_ACK
→CLOSED
。 - 客户端等待 2MSL 时间:确保服务器收到最后一个 ACK,避免因网络问题导致连接未完全关闭。
- 类比:你说 “好的,再见!”(双方挂断电话)。
- 动作:客户端发送
为什么需要四次挥手?
- 全双工通信特性:TCP 允许双向同时传输数据,关闭连接需双方独立确认。服务器可能在收到 FIN 后仍有数据要发送,因此需要两次 ACK 和两次 FIN。
三、关键细节补充
-
序列号(Sequence Number)
- 确保数据按序接收,避免乱序。例如,客户端发送 SYN 时的序号为 x,后续数据序号从 x+1 开始。
-
ACK 号(Acknowledgment Number)
- 表示期望收到的下一个数据序号。例如,服务器回复 ACK=101,表示已收到序号 100 及之前的数据。
-
TIME_WAIT 状态
- 作用:等待 2 倍 MSL(最大段生命周期)时间,确保所有旧数据包在网络中消失,避免新连接复用端口时收到旧数据。
总结
- 三次握手:确保双方 “能收能发”,同步初始序号。
- 四次挥手:双方确认 “数据传完”,优雅释放资源。
- 核心思想:通过多次确认,保证连接建立和终止的可靠性,避免因网络延迟或丢包导致的问题。