tcp三次握手和四次挥手

article/2025/9/15 17:17:54

TCP三次握手与四次挥手详解(最全面)

一、TCP 协议简述

TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。

无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。

同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。

TCP的工作原理

在这里插入图片描述
注意:

  • 在发送完一个分组后,必须暂时保留已发送的分组的副本。

  • 分组和确认分组都必须进行编号。

  • 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。

TCP 的流量控制

一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。

流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。

利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

举个例子:
在这里插入图片描述

TCP的拥塞控制

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。

出现资源拥塞的条件:

​ 对资源需求的总和 > 可用资源

若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。

拥塞控制与流量控制的关系

拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。

拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。

流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

拥塞控制所起的作用

在这里插入图片描述

慢开始和拥塞避免

发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。

发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。

发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

慢开始算法的原理

在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。

在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。

用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
在这里插入图片描述

发送方每收到一个对新报文段的确认(重传的不算在内)就使 cwnd加

二、TCP包首部

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。
TCP包首部,定义了TCP协议如何读取和解析数据:
在这里插入图片描述

  • 源端口和目的端口字段各占 2个字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
  • 序号字段占 4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
  • 确认号字段占 4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号
  • 数据偏移(即首部长度)占 4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位字(以4字节为计算单位)
  • 保留字段占 6位,保留为今后使用,但目前应置为0。
  • 紧急URG 当URG= 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
  • 确认 ACK 只有当ACK= 1 时确认号字段才有效。当ACK= 0 时,确认号无效。
  • 推送 PSH(PuSH)接收TCP收到PSH= 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位 RST(ReSeT)当RST= 1 时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 同步 SYN 同步SYN= 1 表示这是一个连接请求或连接接受报文。
  • 终止 FIN(FINis) 用来释放一个连接。FIN= 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  • 窗口字段占2字节,用来让对方设置发送窗口的依据,单位为字节
  • 检验和占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
  • 紧急指针字段占16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
  • 选项字段长度可变。TCP最初只规定了一种选项,即最大报文段长度 MSS。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。
  • 填充字段这是为了使整个首部长度是4字节的整数倍。

三、TCP 三次握手建立连接

在这里插入图片描述
第一次握手:A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。

第二次握手:B 的 TCP 收到连接请求报文段后,如同意,则发回确认。B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。

第三次握手

  • A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。A的TCP通知上层应用进程,连接已经建立。
  • B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。

四、四次挥手释放TCP连接

在这里插入图片描述
第一次挥手

数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。

A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。

第二次挥手

B 发出确认,确认号 ack = u + 1,而这个报文段自己的序号 seq = v。
TCP 服务器进程通知高层应用进程。
从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态,B若发送数据,A还是要接收的
第三次挥手

若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接
第四次挥手

A 收到连接释放报文段后,必须发出确认。 •在确认报文段中 ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1。

常见面试题

为什么TCP连接的时候是三次握手,关闭的时候却是四次握手?

其实是客户端和服务端的两次挥手,也就是客户端和服务端分别释放连接的过程.
再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

为什么不能用两次握手进行连接?

答:
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

只有经过三次握手才能确认双发的收发功能都正常,缺一不可:

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并 发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

上面介绍第四次挥手的过程中,客户端在发送完给服务端的回执报文后没有立刻进入CLOSED状态,而是进入TIME-WAIT状态,然后等待2*MSL(最长报文段寿命)的时间后才进入CLOSED状态,这是为什么?原因有以下两点:

  • 客户端发送给服务端回执后,有可能这个回执报文在传输途中丢失等原因,服务端并没有收到,此时服务端会再次向客户端发送FIN=1的断开请求报文,如果客户端没有等待2*MSL时间而直接进入了CLOSED状态,客户端就会收不到服务端再次发送的断开连接的请求报文,导致服务端无法进入CLOSED状态;
  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

注:MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

ISN (Initial Sequence Number) 是固定的吗

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。

当一端为建立连接而发送它的 SYN 时,它会为连接选择一个初始序号。ISN 随时间而变化,因此每个连接都将具有不同的 ISN。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

三次握手过程中可以携带数据吗

第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手绝对不可以携带数据假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,然后疯狂重复发 SYN 报文的话(因为攻击者根本就不用管服务器的接收、发送能力是否正常,它就是要攻击你),这会让服务器花费很多时间、内存空间来接收这些报文。

简单的记忆就是,请求连接/接收 即 SYN = 1的时候不能携带数据

而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以当然能正常发送/携带数据了。

半连接队列

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。

当然还有一个全连接队列,完成三次握手后建立起的连接就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

SYN 洪泛攻击

SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 则回复确认包,并等待 Client 确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用半连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

如果第三次握手丢失了,客户端服务端会如何处理

服务器发送完 SYN-ACK 包,如果未收到客户端响应的确认包,也即第三次握手丢失。那么服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除。

注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s…


http://chatgpt.dhexx.cn/article/sAneL9w6.shtml

相关文章

三次握手和四次挥手详解

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ” *TCP connection* 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection(关系,连接)的东西; 由于TCP不存在连接的概念,只存在请求和响应&…

TCP三次握手和四次挥手过程

TCP三次握手和四次挥手过程 1、TCP报文段首部2、TCP三次握手过程及常见问题2.1 TCP三次握手过程2.2 常见问题 3、TCP四次挥手过程及问题3.1 TCP四次挥手过程3.2 常见问题 1、TCP报文段首部 要理解TCP三次握手和四次挥手的过程,首先需要了解TCP报文段的某些首部的含义…

三次握手和四次挥手

三次握手和四次挥手 三次握手四次挥手 ♠ \color{red}{\spadesuit} ♠ ok,上一篇介绍完TCP/IP的常见状态码,对TCP协议有一个大概的了解了,接下来进入TCP协议的(建立连接)三次握手和四次挥手(关闭连接&#…

详解三次握手和四次挥手

三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官&#xff1…

TCP为什么需要3次握手与4次挥手

http://blog.csdn.net/xifeijian/article/details/12777187 为什么需要“三次握手” 在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次…

一文搞懂TCP的三次握手和四次挥手

目录 1、三次握手 2、四次挥手 3、11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕…

【通俗易懂】三次握手与四次挥手

1.三次握手 三次握手(Three-way Handshake)是指在建立一个TCP连接时,客户端和服务器会一共发送三个报文段。 初始时客户端和服务器都处于CLOSED状态,当服务器应用程序创建一个监听套接字时,服务器处于LISTEN状态。 …

面试官,不要再问我三次握手和四次挥手

温馨提示:本篇文章会长期维护及更新,详情见:https://yuanrengu.com/2020/77eef79f.html 面试相关文章推荐: 面试必备 | 小伙伴栽在了JVM的内存分配策略。。。垃圾收集器(CMS、G1)及内存分配策略Java虚拟机…

C语言数据结构创建矩阵,及代入数据

创建一个这样的矩阵 数据由我们插入(定位坐标行列及插入的数据) 代码如下: 思路:将每个坐标节点和我们插入的节点坐标做对比,如果行列坐标都相等,则value置1并输出其相应的数据,否则value还是为0&#x…

数据结构-树(c语言实现篇)

数据结构之二叉树(c语言实现篇) 介绍树的概念和二叉树的概念和应用,内容主要是以二叉树为主。 1. 树 1.1 树的概念 树是n个结点的有限集,当n0时,称为空树。树是一种非线性的数据结构,与前面的线性表、栈和…

c语言的数据结构表达式求值

最近学习c语言的数据结构中有关栈的实现。下面是用栈实现表达式求值的一个实例,用的是顺序栈的形式 原理: List item 我们默认一‘#’开始,最后输入’#‘结束 在运算中的每一步中,任意两个相继出现的算符theta1和theta2之间的关…

C语言数据结构篇——栈的顺序存储

作者名:Demo不是emo 主页面链接:主页传送门创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索&#xf…

C语言数据结构之查找(顺序查找,折半查找)

C语言数据结构之查找(顺序查找,折半查找) tips:前些天已经学习了树和图的相关知识,今天来总结下两种常用的查找方式(顺序查找,折半查找)。 为了演示方便,顺序查找和折半…

【C语言数据结构7】--串的实现

串 一、什么是串 串就是我们常说的字符串,它同样是一个线性表。可能有人认为串就是元素为字符的线性表,但这种说法是不准确的。对于普通的线性表,它们关注的往往是单个元素,每个单独的元素都有独立的含义。比如我们用线性表存储…

C语言数据结构——查找(检索)

一、查找的基本概念 查找:查询某个关键字是否在(数据元素集合)表中的过程。也称作检索。 查找表: 由同一类型的数据元素(或记录)构成的集合。 主关键字: 能够惟一区分各个不同数据元素的关键字 次关键字: 通常不能惟一区分各个不同数据元素的…

C语言数据结构——广义表

C语言数据结构中,广义表和数组一样,也是线性表的一种推广! 广义表的定义: 广义表 LS 为n(n≥0)个元素的有穷序列,记作: LS (d1, d2, … dn) 其中&#xff1…

C语言数据结构——图

一、图的基本概念 图是由顶点集合及顶点间的关系集合组成的一种数据结构。vertex, edge 图G的定义是: G (V,E) 其中, V {x|x∈某个数据元素集合} E { (x,y)|x,y∈V} (无向图&#…

数据结构(c语言版本)

1.基本概念 1.1数据 对客观事物的符号表示,在计算机与科学中是指所有能输入到计算机并被计算机程序处理的符号的总称。 1.2数据元素 是数据的基本单位,在计算机程序中作为一个整体进行考虑和处理 1.3数据对象 是相同性质数据元素的集合&#xff0c…

c语言数据结构

目录 一、数据结构构造概述 1.1、什么是数据结构 1.2、数据的逻辑结构的4种分类 二、线性表 2.1、线性表概述 2.2、顺序表 2.3、链表 2.3.1、链表节点的创建 2.3.2、链表结点遍历 2.3.3、链表结点删除 2.3.4、链表的插入 ​ 三、栈和队列 3.1、栈概述 3.2、栈…

C语言数据结构知识点小结(全)

Catologue C语言数据结构一、基本概念和术语二、时间、空间复杂度(1)时间复杂度(2)空间复杂度 三、类C语言有关操作补充1:数组定义补充2:动态内存分配补充3:C中的参数传递 四、线性表&#xff0…