“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录

什么是TCP协议

“三次握手”建立连接

“四次挥手”断开连接

“三次握手”和“四次挥手”的反思

总结


什么是TCP协议

想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这封信能够完整、准确地传递,你们制定了一系列规则,比如谁先说、如何确认对方听到了、如果听不清怎么办。这些规则,就像是TCP协议(Transmission Control Protocol,传输控制协议)在计算机网络中的作用。

TCP的基本概念

TCP 是一种面向连接的、可靠的基于流的传输协议,运行在传输层。它主要用于确保数据能完整、准确地从一台计算机传输到另一台计算机,即使网络环境并不稳定。

简单理解:

  • 面向连接:就像打电话一样,TCP 需要在数据传输前先建立一条稳定的通信线路(连接)。
  • 可靠传输:TCP 确保数据不会丢失、不会重复、不会乱序,就像你确保信件被完整送达。
  • 流式传输:TCP 以数据流的方式传输数据,而不是像快递那样一次性把所有内容打包。

“三次握手”建立连接

在TCP通信开始前,必须先建立连接,这就像是打电话时要先拨号、等待对方接听,然后确认对方能听清楚。

当客户端(Client)和服务器(Server)建立TCP连接时,会经历“三次握手”过程。其目的是:

确保客户端和服务器都具备发送和接收能力。

协商初始序列号(ISN,Initial Sequence Number),防止数据包混乱。

假设客户端A想要与服务器B建立连接:

第一次握手(SYN)

  • 客户端A发送一个 SYN(同步)数据包给服务器B,请求建立连接。
  • 该数据包包含:
    • SYN=1(表示请求建立连接)
    • 初始序列号 ISN(A)(用于数据传输的编号,防止乱序)
  • 这时,客户端A进入 SYN_SENT(同步已发送) 状态。

第二次握手(SYN-ACK)

  • 服务器B收到SYN请求后,回应一个 SYN-ACK(同步-确认)数据包。
  • 该数据包包含:
    • SYN=1(表示服务器同意建立连接)
    • ACK=1(表示确认收到客户端的SYN请求)
    • 服务器的初始序列号 ISN(B)
    • 确认号 ACK=ISN(A)+1(表示已收到客户端的SYN)
  • 服务器B进入 SYN_RECV(同步已收到) 状态。

第三次握手(ACK)

  • 客户端A收到服务器B的SYN-ACK后,发送一个 ACK(确认)数据包。
  • 该数据包包含:
    • ACK=1(确认连接)
    • 序列号 = ISN(A)+1
    • 确认号 ACK=ISN(B)+1(表示已收到服务器的SYN)
  • 服务器B收到ACK后,连接正式建立,双方进入 ESTABLISHED(已建立) 状态。

至此,TCP连接成功建立,双方可以开始数据传输。

TCP如何保证数据可靠传输?

TCP 采用了多个机制来确保数据不会丢失、不会重复、不会乱序。

数据包的编号与确认

每个TCP数据包都会有一个序列号(Sequence Number),而接收方会发送确认号(Acknowledgment Number) 来确认收到的数据。

例如:客户端发送 Seq=1000 的数据包,服务器收到后,会回复 Ack=1001,表示已成功接收。

如果服务器没有收到这个数据包,它不会发送 Ack=1001,这样客户端就知道数据丢失了,需要重新发送。

超时重传

如果客户端发送了数据包,但一直没有收到确认(ACK),就会在一定时间后重发数据,直到对方确认收到。

  • 这类似于寄快递时,如果包裹长时间未送达,快递员可能会重新派送。

流量控制

TCP 允许接收方通过滑动窗口机制控制数据发送速度,避免发送方数据过快而接收方处理不过来。

例如:如果服务器处理能力有限,它可以告诉客户端“慢点发,我忙不过来了”,客户端就会降低发送速度。

拥塞控制

当网络拥堵时,TCP 会自动降低发送速率,以防止网络进一步恶化。

这就像高速公路上遇到堵车时,大家会自动放慢速度,避免发生更严重的交通事故。

“四次挥手”断开连接

当通信结束时,TCP使用“四次挥手”来关闭连接。其目的是:

  1. 确保双方都完成数据传输后,安全地关闭连接。
  2. 防止数据丢失,确保所有数据包都被正确接收。

假设客户端A想要断开与服务器B的TCP连接:

第一次挥手(FIN)

  • 客户端A发送 FIN(终止)数据包,表示“我不想再发送数据了”。
  • 该数据包包含:
    • FIN=1(请求关闭连接)
    • 序列号 seq=U(U是当前数据序列号)
  • 客户端A进入 FIN_WAIT_1(终止等待1) 状态。

第二次挥手(ACK)

  • 服务器B收到FIN后,发送一个 ACK(确认)数据包。
  • 该数据包包含:
    • ACK=1(确认关闭请求)
    • 序列号 = V
    • 确认号 ACK=U+1(确认收到FIN)
  • 服务器B进入 CLOSE_WAIT(关闭等待) 状态,等待完成剩余的数据传输。
  • 客户端A进入 FIN_WAIT_2(终止等待2) 状态,等待服务器B发送FIN。

第三次挥手(FIN)

  • 服务器B数据传输完成后,主动发送 FIN(终止)数据包,表示“我也不想再发送数据了”。
  • 该数据包包含:
    • FIN=1(请求关闭)
    • 序列号 seq=W
  • 服务器B进入 LAST_ACK(最后确认) 状态,等待客户端的最后ACK。

第四次挥手(ACK)

  • 客户端A收到服务器B的FIN后,发送一个 ACK(确认)数据包,表示“确认关闭”。
  • 该数据包包含:
    • ACK=1(确认关闭请求)
    • 序列号 = X
    • 确认号 ACK=W+1(确认收到FIN)
  • 服务器B收到ACK后,立即进入 CLOSED(关闭) 状态,释放连接。
  • 客户端A等待 TIME_WAIT(通常是2倍的MSL时间,默认240秒)后,最终进入 CLOSED 状态,连接彻底关闭。

至此,TCP连接完全关闭,确保所有数据包已经被正确处理。

“三次握手”和“四次挥手”的反思

为什么 TCP 需要三次握手,而不是两次?

两次握手可能会导致已失效的 SYN 报文被服务器误认为是新的连接,从而建立了一个无效连接。而三次握手可以确保双方都明确对方的接收和发送能力。例如,客户端发出的 SYN 因为网络问题被延迟,服务器收到后认为是新的连接请求并建立连接,但客户端并不知情,导致连接状态不同步。
三次握手能够确保:

客户端确认服务器的 接收能力

服务器确认客户端的 接收能力

双方都确认了彼此的 发送和接收能力,确保连接有效。

为什么 TCP 需要四次挥手,而不是三次?
因为 TCP 是全双工通信,数据的发送和接收是独立的,一方发出 FIN 只表示它不再发送数据,但仍然可以接收数据,所以另一方要单独再发送 FIN 以表示自己也不再发送数据,这就导致了四次挥手。

为什么A在TIME-WAIT状态必须等待2MSL的时间
MSL最长报文段寿命Maximum Segment Lifetime,MSL=2
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
总结:

  • 确保 B 已经收到 A 的最后一个 ACK,若 B 没收到,会重发 FIN,A 需要有时间处理。
  • 防止历史连接中的旧报文在网络中滞留,影响后续新的连接。

总结

三次握手(TCP 连接建立)

A -> B(SYN):A 发送 SYN 报文,表示请求建立连接,进入 SYN-SENT 状态。

B -> A(SYN-ACK):B 收到 SYN 后,发送 SYN-ACK 报文,表示同意建立连接,进入 SYN-RECEIVED 状态。

A -> B(ACK):A 收到 SYN-ACK 后,发送 ACK 报文,B 进入 ESTABLISHED 状态,A 也进入 ESTABLISHED 状态,连接建立完成。

四次挥手(TCP 连接释放)

A -> B(FIN):A 发送 FIN 报文,表示不再发送数据,进入 FIN-WAIT-1 状态。

B -> A(ACK):B 收到 FIN 后,发送 ACK,表示确认,进入 CLOSE-WAIT 状态;A 收到 ACK 后,进入 FIN-WAIT-2 状态。

B -> A(FIN):B 处理完剩余数据后,发送 FIN 报文,进入 LAST-ACK 状态。

A -> B(ACK):A 收到 FIN 后,发送 ACK 报文,进入 TIME-WAIT 状态,等待 2MSL;B 收到 ACK 后,进入 CLOSED 状态。

A 进入 CLOSED 状态:等待计时器 2MSL 结束后,A 进入 CLOSED 状态,连接彻底关闭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

el-dropdown选中效果

vue2版本 <template><el-dropdown size"mini" command"handleCommand"><span class"el-dropdown-link">{{ selectedOption }}<i class"el-icon-arrow-down el-icon--right"></i></span><el-d…

Deepseek首页实现 HTML

人工智能与未来&#xff1a;机遇与挑战 引言 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了突飞猛进的发展。从语音助手到自动驾驶汽车&#xff0c;AI 正在深刻地改变我们的生活方式、工作方式以及社会结构。然而&#xff0c;随着 AI 技术的普及…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件&#xff0c;专注于处理高并发流量分发&#xff0c;广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么&#xff1f; 本质&#xff1a; 基于 C 语言开发 的轻量级工具&a…

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内&#xff0c;右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑&#xff0c;点击【属性】 5.下滑滚动条&…

Spring Boot 日志管理(官网文档解读)

摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容&#xff0c;文章主要参考官网文章的描述内容&#xff0c;并在其基础上进行一定的总结和拓展&#xff0c;以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…

【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录 跳台阶递归实现指数级枚举递归实现排列型枚举上面两题总结 递归实现组合型枚举P1036选数 跳台阶 思路&#xff1a; 如果 n 1&#xff0c;只有一种走法&#xff08;走 1 级&#xff09;。如果 n 2&#xff0c;有两种走法&#xff08;11 或 2&#xff09;。对于 n &g…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

at32f103a+rtt+AT组件+esp01s 模块使用

AT组件使用 这里需要设置wifi名称和密码 配置使用的串口 配置上边的自动会配置,at_device 依赖了at_client 依赖sal也自动加入 依赖了串口2 uart2 连接WiFi AT+ CWJAP = TP-LINK_45A1

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…

Grok 3与GPT-4.5的“智能天花板”争夺战——谁才是大模型时代的算力之王?

2025年2月18日&#xff0c;马斯克旗下 xAI 高调发布新一代大模型Grok 3&#xff0c;号称“地球上最聪明AI”&#xff0c;在数学推理、代码生成等核心能力上碾压 GPT-4o、DeepSeek-V3 等对手。而就在同一天&#xff0c;OpenAI创始人 Sam Altman 暗示 GPT-4.5 即将登场&#xff0…

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中&#xff0c;理解和区分Binlog&#xff08;二进制日志&#xff09;、RedoLog&#xff08;重做日志&#xff09;和UndoLog&#xff08;撤销日志&#xff09;是至关重要的。这三种日志在MySQL中扮演着不同…

C++中结构体与结构体变量 和 类与对象的区别

具体区别如下&#xff1a; 结构体 -> 结构体变量 { 结构体&#xff1a;struct student{ 具体是多少&#xff0c;年龄&#xff0c;名字&#xff0c;性别&#xff0c;成绩 } 结构体变量&#xff1a; stu{ 名字&#xff1a;张三&#xff0c;年龄&#xff1a;18&#…

小迪安全23-php后台模块

cookie技术 cookie就是身份验证表示&#xff0c;通过cookie好区分每个用户的个人数据和权限&#xff0c;第一次登陆之后正常的网站都会赋予一个cookie 写写一个后台界面&#xff0c;直接让ai去写就可以 然后自己需要的提交方式&#xff0c;和表单值自己修改即可 生成cookie的…