当前位置: 首页 > article >正文

JavaEE [特殊字符] TCP协议:三次握手四次挥手全图解

🌟 一、TCP核心特性:可靠传输的秘密

1️⃣ 有连接 & 全双工
  • 双向通道:建立连接后,客户端↔服务器可同时收发数据
  • 可靠传输三板斧
    • 确认应答(ACK)
      • 接收方返回ACK=接收序号+数据长度
      • 示例:发送SEQ=100(数据长度50) → 收到ACK=150
    • 超时重传
      • 未收到ACK则自动重发,解决丢包问题
    • 数据排序
      • 通过SEQ序号重组乱序数据包
2️⃣ 字节流传输
  • 无边界限制:像水管流水,数据可任意拆分/合并
  • 粘包问题:需应用层自行处理消息边界(如添加长度头)

🔑 二、三次握手:连接建立的精妙设计

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。
1️⃣ 握手流程
Client Server SYN=1 (我的序号X) SYN=1 + ACK=X+1 (我的序号Y) ACK=Y+1 Client Server
2️⃣ 三大核心作用
  1. 验证链路畅通(投石问路)
  2. 能力验证
    握手阶段验证的能力
    第一次客户端能发送
    第二次服务器能收 + 客户端能收
    第三次服务器能发
  3. 参数协商:确定起始序号(防数据混淆)
  4. 从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。
3️⃣ 为什么能合并ACK和SYN?
  • 操作系统内核自动处理,时机相同 → 合并为一次报文

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。

💣 三、四次挥手:断开连接的江湖恩怨

1️⃣ 挥手流程
Client Server FIN=1 (序号U) ACK=U+1 FIN=1 (序号V) ACK=V+1 Client Server
2️⃣ 关键差异
  • ACK由内核自动发,FIN由代码触发
  • 对于四次挥手来说,ACK是内核控制的,但是FIN的触发,通过应用程序(也就是java写的程序),调用close,假如说没写close,就甚至不发送
  • 四次挥手为何不能合并?
    • 服务器收到FIN后,可能还有数据要发送 → 先ACK,发完数据再FIN:
    • 服务器收到客户端的 FIN 报文时,内核会马上回一个 ACK 应答报文,但是服务端应用程序可能还有数据要发送,所以并不能马上发送 FIN 报文,而是将发送 FIN 报文的控制权交给服务端应用程序:如果服务端应用程序有数据要发送的话,就发完数据后,才调用关闭连接的函数;如果服务端应用程序没有数据要发送的话,可以直接调用关闭连接的函数,所以说,是否要发送第三次挥手的控制权不在内核,而是在被动关闭方的应用程序,因为应用程序可能还有数据要发送,由应用程序决定什么时候调用关闭连接的函数,当调用了关闭连接的函数,内核就会发送 FIN 报文了,所以服务端的 ACK 和 FIN 一般都会分开发送。
    • 对于三次握手来说,中间的两次ACK和SYN,都是在内核中,操作系统负责进行 时机都是在收到SYN之后,此时同一时机,就可以合并

⚠️ 四、必懂TCP状态:程序员排错指南

状态触发场景排查重点
LISTEN服务器绑定端口后检查端口占用/防火墙
ESTABLISHED连接建立成功正常通信状态
CLOSE_WAIT被动方收到FIN后🔥 代码没写socket.close()
TIME_WAIT主动方最后ACK后等待2MSL防ACK丢失
🔥 CLOSE_WAIT爆炸?
  • 典型症状:服务器出现大量CLOSE_WAIT
  • 致命原因:忘记关闭Socket!
    // 错误示范:未关闭连接!
    Socket socket = new Socket(...);
    // 正确做法:try-with-resources自动关闭
    try (Socket socket = new Socket(...)) { ... }
    
TIME_WAIT存在的意义
  • 保活2MSL(约1-4分钟):确保最后一个ACK送达
  • 副作用:短时内端口不可重用 → 可通过SO_REUSEADDR解决

📌 五、高频面试题

  1. 为什么是三次握手,不是两次?
    – 确保双方收发能力正常

  2. TIME_WAIT为何要等2MSL?
    – 足够时间让网络中的残余报文消亡


掌握TCP协议,就像获得网络世界的“内功心法”!无论是面试还是调优,这些知识点都能让你一眼看穿网络问题的本质! 🚀

相关文章:

JavaEE [特殊字符] TCP协议:三次握手四次挥手全图解

🌟 一、TCP核心特性:可靠传输的秘密 1️⃣ 有连接 & 全双工 双向通道:建立连接后,客户端↔服务器可同时收发数据可靠传输三板斧: 确认应答(ACK) 接收方返回ACK接收序号数据长度示例&#…...

解决 Ubuntu 24.04 虚拟机内无法ping 通 Hostname 的问题

问题背景 在 VMware 或 VirtualBox 中安装 Ubuntu 24.04 虚拟机时,遇到无法通过主机名(Hostname)进行网络通信的问题。例如,将虚拟机的主机名设置为 001,执行 ping 001 时返回 ping 0.0.0.1 并超时。此问题通常由 主机…...

wzl-django学习

####################################################总的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…...

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…...

泛型编程、函数模板、类模板

目录 一、泛型编程 1.泛型编程提出背景 1.1.代码复用案例解析 案例1:实现一个交换函数,并对不同类型参数进行函数重载 (1)调试 (2)代码解析 ①代码复用问题 ②泛型编程的解决方案 ③上面泛型Swap函数模版的优点 1.2.泛型编程提出背景 2.泛型编…...

【Vue3】浅谈setup语法糖

Vue3 的 setup 语法糖是通过 <script setup> 标签启用的特性&#xff0c;它是对 Composition API 的进一步封装&#xff0c;旨在简化组件的声明式写法&#xff0c;同时保留 Composition API 的逻辑组织能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…...

经验总结:使用vue3测试后端接口的模板

为了方便在开发中途&#xff0c;比较即时地&#xff0c;测试自己写的接口&#xff0c;是否有BUG&#xff0c;所以整理了这个测试模板。 效果就是可以通过自己编码&#xff0c;比较灵活&#xff0c;比较快得触发接口调用。 下边这个是最核心的模板&#xff0c;然后还有一个写axi…...

Vosk语音识别包

Vosk介绍 Vosk作为一款开源的离线语音识别工具包&#xff0c;其核心特点可归纳为以下五个方面&#xff0c;结合多篇技术文档的实践与分析 一、离线高效识别 完全脱离网络依赖&#xff1a;所有语音处理均在本地完成&#xff0c;无需云端数据传输&#xff0c;既保障隐私安全又…...

【欢迎来到Git世界】Github入门

241227 241227 241227 Hello World 参考&#xff1a;Hello World - GitHub 文档. 1.创建存储库 r e p o s i t o r y repository repository&#xff08;含README.md&#xff09; 仓库名需与用户名一致。 选择公共。 选择使用Readme初始化此仓库。 2.何时用分支&#xf…...

简洁的个人地址发布页HTML源码

源码介绍 简洁的个人地址发布页HTML源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码获取 简洁的个人地址发布页HTML源码...

【VSCode】VSCode下载安装与配置极简描述

VSCode 参考网址&#xff1a;[Visual Studio Code Guide | GZTime’s Blog]. 下载安装 下载地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows. 注&#xff1a;推荐不更改安装位置&#xff0c;并且在附加任务中“其他”中的四项全部勾选&#xff0c;即将用…...

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 问题一&#xff1a;wav格式的音频压缩为哪些格式&#xff0c;网络传输给用户播放…...

Linux权限 -- 开发工具(一)

文章目录 包管理器yumyum具体操作 Linux编辑器 - vim的使用vimvim的多模式 包管理器yum Linux中安装软件&#xff1a; 1.源码安装 2. 软件包安装 – rpm 3. 包管理器yum(centos) apt/apt-get(ubuntu) 为什么有包管理器&#xff1f; 包管理器会自动帮我们解决包依赖的问题 2. 什…...

leetcode_动态规划/递归 279**. 完全平方数

279. 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 …...

【leetcode】二分查找专题

文章目录 1.二分查找1.题目2.解题思路3. 解题代码 2.在排序数组中查找元素的第一个和最后一个位置1.题目2.算法原理3. 代码 3.x的平方根1.题目2.代码 4.搜索插入位置1.题目2.解题思路3.解题代码 5.山脉数组的索引1.题目2.解题思路3. 代码 6.寻找峰值1.题目2.解题思路3.代码 7. …...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…...

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…...

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…...

unity学习59: 滑动条 和 滚动条 滚动区域

目录 1 滑动条 slider 1.1 创建slider 1.2 构成的子物体 1.2.1 找到 某个UI的 方法 1.3 构成的component&#xff0c;主体就是 slider 2 核心属性 2.1 value 2.2 direction 3 作用 3.1 由于是fill back 可以实现血条效果 3.2 可以取得 slider.value 数值 1 滑动条…...

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…...

UWB人员定位:精准、高效、安全的智能管理解决方案

在现代企业管理、工业生产、安全监测等领域&#xff0c;UWB&#xff08;超宽带&#xff09;人员定位系统正逐步成为高精度定位技术的首选。相较于传统的GPS、Wi-Fi、蓝牙等定位方式&#xff0c;UWB具备厘米级高精度、低延迟、高安全性、抗干扰强等突出优势&#xff0c;能够实现…...

etcd 3.15 三节点集群管理指南

本文档旨在提供 etcd 3.15 版本的三节点集群管理指南&#xff0c;涵盖节点的新增、删除、状态检查、数据库备份和恢复等操作。 1. 环境准备 1.1 系统要求 操作系统&#xff1a;Linux&#xff08;推荐 Ubuntu 18.04 或 CentOS 7&#xff09; 内存&#xff1a;至少 2GB 磁盘&a…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

DO-254航空标准飞行器电机控制器设计注意事项

DO-254航空标准飞行器电机控制器设计注意事项 1.核心要求1.1 设计保证等级(DAL)划分1.2生命周期管理1.3验证与确认2.电机控制器硬件设计的关键注意事项2.1需求管理与可追溯性2.2冗余与容错设计2.3验证与确认策略2.4元器件选型与管理2.5环境适应性设计2.6文档与配置管理3.应用…...

【Pandas】pandas Series fillna

Pandas2.2 Series Computations descriptive stats 方法描述Series.backfill(*[, axis, inplace, limit, …])用于填充 Series 中缺失值&#xff08;NaN&#xff09;的方法Series.bfill(*[, axis, inplace, limit, …])用于填充 Series 中缺失值&#xff08;NaN&#xff09;的…...

文字描边实现内黄外绿效果

网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边&#xff08;兼容Webkit内核&#xff09; */text-stroke: 2px #008000; /* 标准语法 *…...

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1&#xff1a;注册账号步骤2&#xff1a;在线体验步骤3&#xff1a;获取API密钥步骤4&#xff1a;安装chatbox步骤5&#xff1a;chatbox设置 价格方面 前言 最近在使用DeepSeek时&#xff0c;开启深度思考功能后&#xff0c;频繁遇到“服务器繁忙&am…...

python-leetcode-使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:n len(cost)dp [0] * (n 1) # 额外多…...

图书数据采集:使用Python爬虫获取书籍详细信息

文章目录 一、准备工作1.1 环境搭建1.2 确定目标网站1.3 分析目标网站二、采集豆瓣读书网站三、处理动态加载的内容四、批量抓取多本书籍信息五、反爬虫策略与应对方法六、数据存储与管理七、总结在数字化时代,图书信息的管理和获取变得尤为重要。通过编写Python爬虫,可以从各…...

ChatGPT 提示词框架

作为一个资深安卓开发工程师&#xff0c;我们在日常开发中经常会用到 ChatGPT 来提升开发效率&#xff0c;比如代码优化、bug 排查、生成单元测试等。 但要想真正发挥 ChatGPT 的潜力&#xff0c;我们需要掌握一些提示词&#xff08;Prompt&#xff09;的编写技巧&#xff0c;并…...