TCP 1

确认应答

确认应答(ACK,Acknowledgment) 是一种通信机制:接收方收到数据后,向发送方发送一个确认信号,告诉对方"这份数据我已经收到了"

序号和确认序号

序号 : 给发送的数据的每一个字节编号、第一个字节就是该数据的序号

确认序号 : 收到的数据的最后一个字节的序号 + 1

(1 ~ 1000 : 数据的序号 )

超时重传

如果 主机1 在⼀个特定时间间隔内没有收到 主机 2 发来的确认应答,就会进⾏重发。如果发送方没有收到 ack 、发送方重新传输数据是需要一定的等待时间的、 超出等待时间就会重新传输数据。

如果发送方收到 ack 、说明数据发送成功。 发送方没有收到 ack 可能会有两种情况 :

  1. 可能是数据没发过去(数据丢包)

  2. 可能是 ack 没传回到发送方(ack 丢包)

    在第 2 种情况、数据就会重复发送。接收方的接收缓冲区会根据数据的序号进行去重、相同数据不会被重复接收

建立连接的三次握手

客户端和服务器通信前需要建立连接。客户端和服务器建立连接的流程就是"三次握手"。网络中的握手就是通信的时候,给对方传达一个不包含载荷(只有报头)的数据包。 通信双方需要通过 3 次这样的"握手数据"、才能建立连接

发送了 4 次 "握手数据" 、为什么是 3 次握手 ? 在应答的同时申请建立连接

  • 3 次握手有什么作用 ?
  1. 初步验证通信链路是不是通畅
  2. 验证通信双方的发送能力和接受能力是不是正常的
  3. 协商必要数据(序号的起始值)

断开连接的四次挥手

服务器和客户端在完成通信后,需要断开连接。服务器和客户端断开连接的过程就是"四次挥手" 。挥手和握手类似都是只有报头没有载荷

  • 4 次挥手 能不能变成 3 次挥手呢 ?
    一般是不能的。3 次握手的 ack 和 syn 都是 操作系统内核控制的、服务器收到客户端的 syn 操作系统就会立刻发送 ack 和 syn 、ack 和 syn 都是 相同时机发送的。而 4 次握手的 ack 也是在收到 客户端的 fin 后立刻发送、但是 fin 的返回时机是应用程序控制的、在应用程序(服务器)调用 Socket.close() 时才会向客户端发送 fin。
    发送时机不同 => 不能合并
相关推荐
特立独行的猫A1 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
budingxiaomoli8 小时前
Spring统一功能处理
java·后端·spring
Flynn Liang9 小时前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
金銀銅鐵10 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
文丑颜不良啊14 小时前
LeetCode2821~2840题目解析
java·leetcode
apcipot_rain14 小时前
C++转Java日记(10)
java·开发语言
简 洁 冬冬15 小时前
泛型方法写法全面辨析:从「能编译」到「能跑」到「能用」
java·泛型
LGL6030A15 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
Lansonli17 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
budingxiaomoli17 小时前
Spring AOP
java·spring·java-ee