tcp三次握手和四次挥手的过程

2023-11-19

在这里插入图片描述
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息。

1.第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

2.第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

3.第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

那四次挥手呢?

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。

1.第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

2.第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;

3.第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

4.第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

至此,TCP的四次挥手就这么愉快的完成了。当你看到这里,你的脑子里会有很多的疑问,很多的不懂,感觉很凌乱;没事,我们继续总结。

为什么要三次握手?

既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

在书中同时举了一个例子,如下:

"已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,

而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一

个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新

的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server

发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,

也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,

server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,

client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。"

这就很明白了,防止了服务器端的一直等待而浪费资源。

为什么要四次挥手?

那四次挥手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工 模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文 段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会愉快的中断这次TCP连接。如果要正确的理解四次挥手的原理,就需要了解四次挥手过程中的状态变化。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等 待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时, 它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报 文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK 报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。 (主动方)

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即 有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。 (主动方)

CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN 报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实 际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个 SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关 闭连接。(被动方)

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报 文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。 如果FINWAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无 须经过FIN_WAIT_2状态。(主动方)

CLOSED: 表示连接中断。

简明理解三次握手和四次挥手
在这里插入图片描述

三次握手与四次挥手分别对应TCP连接建立过程与断开过程,先上TCP报文格式:
在这里插入图片描述

三次握手过程:在这里插入图片描述

问题1: 为什么要三次握手?

答:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。

    第一次握手:Client什么都不能确认;Server确认了对方发送正常

    第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常

    第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常

所以三次握手就能确认双发收发功能都正常,缺一不可。

问题2:为什么要发送特定的数据包,随便发不行吗?

答:三次握手的另外一个目的就是确认双方都支持TCP,告知对方用TCP传输。

    第一次握手:Server 猜测Client可能要建立TCP请求,但不确定,因为也可能是Client乱发了一个数据包给自己

    第二次握手:通过ack=J+1,Client知道Server是支持TCP的,且理解了自己要建立TCP连接的意图

    第三次握手:通过ack=K+1,Server知道Client是支持TCP的,且确实是要建立TCP连接

问题3:上图中的SYN和ACK是什么?

答:SYN是标志位,SYN=1表示请求连接;

    ACK其实就是ack后面加上的那个数,真正发送的时候不单独发ACK,只发ack,下面四次挥手的图同理

四次挥手:
在这里插入图片描述

问题1: 为什么要四次挥手?

答:根本原因是,一方发送FIN只表示自己发完了所有要发的数据,但还允许对方继续把没发完的数据发过来。

    举个例子:A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。

问题2:为什么双方要发送这样的数据包?

答:和握手的情况类似,只是为了让对方知晓自己理解了对方的意图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tcp三次握手和四次挥手的过程 的相关文章

  • 计算机网络体系结构 - 运输层

    一 运输层协议概述 运输层为应用进程之间提供端到端的逻辑通信 二 运输层的端口 端口 port 也称为协议端口号 protocol port number 对上层的应用进程进行标识 端口用一个16位端口号进行标志 端口号只具有本地意义 端口
  • 可靠数据传输的实现

    可靠数据传输协议 我们知道 TCP和UDP都是基于IP网际协议来传输数据的 但是IP网际协议是一种不可靠数据传输协议 它不负责数据丢失等情况 而TCP是一种可靠数据传输 因此我们需要来关注TCP是如何实现可靠数据传输的 经完全可靠信道的可靠
  • 物理层(比特流)

    物理层 一 物理层的基本概念 二 数据通信的基础知识 1 数据通信系统的模型 2 有关信道的几个基本概念 3 信道的极限容量 4 信道的极限信息传输速率 三 物理层下面的传输媒体 1 导引型传输媒体 2 非导引型传输媒体 四 信道复用技术
  • 【计算机网络13】网络安全

    文章目录 1 HTTP协议的安全问题 2 单向散列函数 One way hash function 2 1 单向散列函数的特点 2 2 常见的几种单向散列函数 2 3 防止数据被篡改 2 4 几个网站 3 对称加密 Symmetric Cr
  • 【计算机网络】湖科大微课堂笔记 p50-53 路由选择协议概述、路由信息协议RIP、开放最短路径优先OSPF、边界网关协议BGP的基本工作原理

    文章目录 路由选择协议概述 小结 路由信息协议RIP的基本工作原理 小结 一些例题 开放最短路径优先OSPF的基本工作原理 小结 边界网关协议BGP的基本工作原理 小结 一些例题 路由选择协议概述 因特网采用分层次的路由选择协议 域间路由选
  • 超详细的计算机网络基础知识总结 第四章:网络层

    本文基于 王道计算机考研 计算机网络 其他文章 超详细的计算机网络基础知识 第一章 概述 超详细的计算机网络基础知识 第二章 物理层 超详细的计算机网络基础知识 第三章 数据链路层 超详细的计算机网络基础知识 第五章 传输层 超详细的计算机
  • HTTP协议(下)

    前面我介绍了什么是HTTP协议 以及HTTP的协议格式 接下来我介绍一下如何使用代码构造出HTTP请求 以及在介绍一下HTTPS 目录 一 通过代码构造HTTP请求 1 基于HTML JS 1 1 基于form表单 1 2 基于ajax 2
  • get和post区别

    1 GET请求在URL中传送的参数是有长度限制的 而POST没有 2 GET相对于POST来说不安全 因为参数直接暴露在URL上 所以不能用来传递敏感信息 而POST数据不会显示在URL中 是放在Request body中 3 对参数的数据
  • 计算机网络,用Excel画3种编码方式图(非归零编码,曼彻斯特编码,差分曼彻斯特编码)

    计算机网络 用Excel画3种编码方式图 非归零编码 曼彻斯特编码 差分曼彻斯特编码
  • LWIP学习笔记(2)---IP协议

    IP首部 最高位在左边记为 bit 最低位在右边 记为31 bit 传输顺序 先0 7bit 在8 15bit 然后16 13 最后24 31bit 这种方式称为 big endian 也叫网络字节序 版本 ipv4 或 6 ipv6 首部
  • 几率大的网络安全面试题(含答案)

    其他面试题类型汇总 Java校招极大几率出的面试题 含答案 汇总 几率大的网络安全面试题 含答案 几率大的多线程面试题 含答案 几率大的源码底层原理 杂食面试题 含答案 几率大的Redis面试题 含答案 几率大的linux命令面试题 含答案
  • 计算机网络重点知识(期末考研复习)

    点个关注 更多精彩持续更新为考研和期末助力 一起加油 计算机网络 第一章 思维导图 概述 计算机网络的主要性能指标 计算机网络的体系结构 OSI RM模型 TCP IP 两种模型对比 第二章 思维导图 数据通信主要指标与信道极限容量 多路通
  • 计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

    文章目录 3 物理层下面的传输媒介 3 1 导引型传输媒介 3 2 非导引型传输媒介 4 信道复用技术 5 数字传输系统 5 1 旧的数字系统 5 2 新数字系统 6 带宽接入技
  • 【计算机网络概述】第一章:概论 1.1什么是Internet

    学习目标 什么是网络 什么是计算机网络 什么是互联网 前言 温馨提示 该文章是小编学习计算机网络的笔记 参考中科大的郑老师hh 这一章是非常重要的 是为之后的学习进行打基础 我们需要努力学习这一章的内容 跨过这座山 他们就会听见你的故事 一
  • 通信子网在计算机网络中的地位和作用

    一 通信子网是计算机网络的核心组成部分 通信子网是计算机网络的核心组成部分 它负责为计算机网络中的各种设备提供通信支持 无论是主机之间的数据传输 还是主机与终端之间的数据通信 都需要通过通信子网来实现 通信子网是连接各个设备的关键基础设施
  • 如何学好信息安全?大学信息安全专业研发技能表-成为信息安全专业优秀人才

    网络空间安全 信息安全 的重要性这几年被提升到前所未有的高度 国家更是高度重视 并且特批成立了网络空间安全一级学科 各大高校积极申报博士点 硕士点 开设信息安全专业的高校越来越多 那么 对于信息安全专业的大一新生如何学好 可能很多同学都在迷
  • P2P应用

    目录 一 P2P的简介 二 P2P的工作方式 1 具有集中目录服务器的P2P工作方式 2 具有全分布式结构的P2P文件共享程序 一 P2P的简介 P2P 对等连接 是指两台主机在通信时 并不区分哪一个是服务请求方和哪一个是服务提供方 只要两
  • 计算机网络基础——常用的中英文网络述语大全,强烈建议收藏

    系统网络体系结构 System Network Architecture SNA 国际标准化组织 International Organization for Standardization ISO 开放系统互连基本参考模型 Open Sy
  • 计算机网络基础知识——OSI七层模型

    OSI 七层模型是计算机网络体系结构中的一个重要概念 它由七个层次组成 每一层都有其特定的功能和作用 这个模型最初是由 ISO 国际标准化组织 提出的 用于描述计算机网络中不同层次之间的交互方式 虽然 OSI 模型是一个理论模型 但是在实际
  • 【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么挖洞致富的?

    19岁 很多人正是上大学 仍伸手向父母要生活费的年纪 可有一位 00 后阿根廷少年 Santiago Lopez 靠自学成才 赚取了 100 万美元 折合人民币约 670 万元 的 Bug 赏金 成为世界上第一个白帽黑客的百万富翁 美元 少

随机推荐

  • 以渲染和ue独立游戏为接下来的主要学习任务。(独立游戏就是为单干做准备,不为跳槽涨薪,目标就是单干,找另外一种可能。)

    这段时间工作不好找 即使招聘网站上找我聊的 薪水也没有什么吸引力 所以不考虑跳槽 直接把精力放在渲染上 说不准还能涨涨薪 拿个年终奖 这条被哥们否定了 内部涨薪很困难 即使以前确实是从1万七涨到2万 也可能是因为人力看过流水 知道我是从两万
  • 微信小程序游戏怎么开发入门教程

    微信小程序游戏开发是现在比较热门的小程序类型开发项目 对于开发人员而言 怎么开发微信小程序游戏呢 今天小编分享一篇小游戏的入门开发教程 希望对微信小程序制作开发人员提供参考 第一步 注册一个小程序账号 在官方注册一个微信小程序账号 注册申请
  • springboot+thymeleaf+mybatis简单获取数据库数据

    1 数据库准备 建好需要的表 这里我的表是info list 2 文件创建 实体类Info public class Info private int id private String name public int getId retu
  • Android平台RTMP

    我们需要怎样的直播播放器 很多开发者在跟我聊天的时候 经常问我 为什么一个RTMP或RTSP播放器 你们需要设计那么多的接口 真的有必要吗 带着这样的疑惑 我们今天聊聊Android平台RTMP RTSP播放器常规功能 如软硬解码设置 实时
  • 5V转±12V无变压器双boost电路

    最近有个新项目 需要 10V范围的模拟量输出 非隔离 对于5V以下供电的控制板而言单端输出绝对没问题 可现在需要有正负输出 是少不了正负电源的 因此准备设计一个5V转 12V的电源 然后选择一个双向供电的运放 来实现单端模拟量信号向双向模拟
  • Blob类型介绍以及查看

    最近看到一个字段的类型是Blob有点懵逼 从Navigate上看只能看到一个 Blob 实际你去仔细看的话 分线字段大小不为空 而且每个大小不一样 说明该字段不仅不为空而且还有值且不一样 那这个Blob是什么呢 大名叫做binary lar
  • 程序员如何乘风破浪?从数据库历史看技术人发展

    2009 年我国数据库软件市场规模为 35 03 亿元 2017 年我国数据库软件市场规模增长至 120 00 亿元 8年时间内 我国数据库软件市场始终保持平稳增长 年均复合增长率为 17 5 且增速呈现递增趋势 根据中研产业研究院估计 到
  • 深入浅出Spring AOP面向切面编程实现原理方法

    1 什么是AOP AOP Aspect Oriented Programming 意为 面向切面编程 通过预编译方式和运行期动态代理实现在不修改源代码的情况下 给程序动态统一添加功能的一种技术 可以理解成动态代理 是Spring框架中的一个
  • Web前端学习(六)HTML5列表标签

    列表标签 ul li 语法 ul li 精彩少年 li li 美丽突然出现 li li 触动心灵的旋律 li ul 有序列表 ol li 语法 ol li 前端开发面试心法 li li 零基础学习html li li JavaScript全
  • Linux内存逆向映射(reverse mapping)技术的前世今生

    本文来自于微信公众号Linux阅码场 一 前言 数学大师陈省身有一句话是这样说的 了解历史的变化是了解这门学科的一个步骤 今天 我把这句话应用到一个具体的Linux模块 了解逆向映射的最好的方法是了解它的历史 本文介绍了Linux内核中的逆
  • Web网络安全-----Log4j高危漏洞原理及修复

    系列文章目录 Web网络安全 红蓝攻防之信息收集 文章目录 系列文章目录 什么是Log4j 一 Log4j漏洞 二 漏洞产生原因 1 什么是Lookups机制 2 怎么利用JNDI进行注入 JNDI简介 LADP RMI 三 Log4j漏洞
  • 2021/8/10补题A - Min Difference

    A Min Difference 题目大意 题解 1 暴力的方法 2 双指针 优化查询 3 所有元素打上标签扔进一个数组 和1异曲同工 题目大意 给定数组a和数组b 数组a长度为n 数组b长度为m 你可以从数组a和数组b中各选一个数 问这两
  • 解决Centos7 下 root账号 远程连接FTP,vsftpd 提示 530 Login incorrect 问题

    三步走 1 vim etc vsftpd user list 注释掉 root 2 vim etc vsftpd ftpusers 同样注释掉 root 3 重启服务 systemctl restart vsftpd service 最后测
  • 使用docker搭建gitlab服务器

    一 拉取gitalb镜像 1 使用docker search gitalb gitlab 搜索有哪些镜像 2 docker pull gitlab gitlab ce 拉取镜像 这里拉取社区版的 3 创建容器 先使用默认挂载目录 随机端口
  • 什么是矩阵的范数

    原文地址 在介绍主题之前 先来谈一个非常重要的数学思维方法 几何方法 在大学之前 我们学习过一次函数 二次函数 三角函数 指数函数 对数函数等 方程则是求函数的零点 到了大学 我们学微积分 复变函数 实变函数 泛函等 我们一直都在学习和研究
  • Springboot+Pagehelper+Vue 完成分页显示操作

    Springboot Pagehelper Vue 完成分页显示操作 在开发的过程最常用也是最常见的就是表格的分页查询了 在开发的时候碰到了这个需求 所以今天讲讲怎么把Pagehelper集成到SpringBoot并结合前端框架Vue 完成
  • 如何正确的关闭 MFC 线程

    前言 近日在网上看到很多人问及如何关闭一下线程 但是我看网上给出的并不详细 而且有些方法还是错误的 小弟在此拙作一篇 不谈别的 只谈及如何正确的关闭MFC的线程 至于Win32和C RunTime的线程暂不涉及 一 关于MFC的线程 MFC
  • JS中的发布-订阅

    发布订阅模式 什么是发布 订阅模式 发布 订阅模式的实现 发布 订阅实现思路 总结 优点 缺点 Vue 中的实现 观察者模式和发布订阅的区别 观察者模式 发布订阅模式 什么是发布 订阅模式 发布 订阅模式其实是一种对象间一对多的依赖关系 当
  • Kubernetes笔记(3) - 资源管理基础

    Kubernetes系统将一切事物都抽象为API资源 其遵循REST架构风格组织并管理这些资源及其对象 同时还支持通过标准的HTTP方法 POST PUT PATCH DELETE和GET 对资源进行增 删 改 查等管理操作 Kuberne
  • tcp三次握手和四次挥手的过程

    TCP是面向连接的 无论哪一方向另一方发送数据之前 都必须先在双方之间建立一条连接 在TCP IP协议中 TCP 协议提供可靠的连接服务 连接是通过三次握手进行初始化的 三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信