### TCP 三次握手过程是怎样的?

TCP的建立连接是通过三次握手来进行的。三次握手的过程如下图:

说实话这个很好理解,我称之为N字型

首先我们理解到建立连接是一个虚的概念了对吧?那么我们来设计一个可靠的TCP,首先建立连接是必须的吧?相当于我们打电话,总要先说一句喂---wei?(面向连接正是这个意思!)

那么这里顺便谈谈他们很爱问的一个问题

为什么是三次握手?不是两次、四次?

首先你(客户端)要和我(服务端)打电话,我们再要说出内容时,都需要先确定下,网络如何?对方能否听到吧?

而上图中蓝色的SYN相当于就是问候服务器能否听到,然后服务器的ACK对应的就是我能听到,

而这里我们说的"我能听到"在现实中映射到TCP中就代表着ACK而且是SYN,因为接下来对方会回复你说"好"或者说"原本要和你说的内容"也即是绿色的ACK

然后两次的话,是必然不可行的,双方都确认对方能接收信息才能说这个连接建立成功,那么能准确证明两个不行吗?首先要双方都确认必然要2SYN和2ACK,那么很明显两个ACK的分配,要么(1,1),要么(2,0)这里2,0可以顺序相反,(2,0)意味着单方发出两个ACK必然不行!(1,1)意味着双方都发ack,那么必然在时间上有交错,因为同时发的话,这个ack就没用了,ack有用的前提是收到syn后再发,同时时间交错则也只能保障单次ack生效,在前发的ack无效

所以证毕,至少三次握手

那么四次可行吗?肯定可以啊,不谈那些不太荒唐的,你把server的ack和syn拆分后就可以了,只不过比较浪费带宽

到此如果要实现上述功能我们只需要SYN和ACK便够了,那么又为何带上SeqNum呢?以及ACK的时候要对应的+1呢?仅仅是说对暗号的情况吗?因为我们计算机会维持多个tcp连接,通过这个来知道他对应的是哪个连接吗?是的,但是仅此而已吗?

所以更深层上三次握手还能实现其他功能:

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费
阻止历史连接的初始化

下面是小林的解释,我来用我自己的话,来让自己更好地了解,首先情况是服务端seqNum为90的这个报文发送后,重启了那么又重新想向服务端建立连接,所以发了个新的seqNum为100,如果90的报文仍然到达了服务端,那么服务端会再发送90对应的90+1的ACK+SYN,那么这时你客户端不就可以确认了吗?你就会弄一个RST位为1的报文,给服务端,效果类似说"打错了",然后之后100的服务端会再发送100+1,

同理我们这个"N"的下一个折角处也是可以防止服务端重启后,这个SYN+ACK导致的历史链接的问题

然后值得注意的一点是,如果服务端收到客户端报文的顺序是:「旧 SYN 报文」->「新 SYN 报文」

那么服务端并不是说同样地给这个返回RST,因为谁是挑战者不好说!对他来讲90可能是新的也可能是旧的,100同样,所以他采用的是认定先来的

所以他返回的是ChangeACK报文给客户端,这个 ack 报文并不是确认收到「新 SYN 报文」的,而是上一次的 ack 确认号,也就是91(90+1)。说白了,解玲还需系铃人,所以这个RST报文只能由他们的原先发送者确认是否结束

同步双方初始序列号
  • 接收方可以去除重复的数据;
  • 接收方可以根据数据包的序列号按序接收;
  • 可以标识发送出去的数据包中, 哪些是已经被对方收到的(通过 ACK 报文中的序列号知道);

序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

避免资源浪费

如果只有「两次握手」,当客户端发生的 SYN 报文在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK 报文,所以服务端每收到一个 SYN 就只能先主动建立一个连接

如果客户端发送的 SYN 报文在网络中阻塞了,重复发送多次 SYN 报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

自己理解的TCP三次握手的更多相关文章

  1. 小白都能理解的TCP三次握手四次挥手

    前言 TCP在学习网络知识的时候是经常的被问到知识点,也是程序员必学的知识点,今天小杨用最直白的表述带大家来认识认识,喜欢的朋友记得点点关注哈. 何为TCP 上点官方的话:是一种面向连接(连接导向)的 ...

  2. TCP 三次握手原理,你真的理解吗?

    最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑写下这篇文章 ...

  3. 理解TCP三次握手和四次挥手

    TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协 ...

  4. TCP三次握手形象理解

    tcp三次握手就像是你用企业微信给人家发信息,首先你得确认别人在不在,你会发  在吗?  这个时候显示的是未读   对方看到之后未读会变成已读 然后他会回复你  在的    你看到这个消息后,他那边也 ...

  5. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  6. TCP三次握手、四次挥手理解

    tcp三次握手建立连接第一次握手 客户端发送给服务器一段连接请求报文,等待服务器回应 第二次握手 服务器收到报文,并发送给客户端一个确认报文,等待客户端回应 第三次握手 客户端收到新报文 ,再发送给服 ...

  7. TCP ,UDP概念和TCP三次握手连接 的知识点总结

    OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...

  8. TCP三次握手,数据传输,四次挥手

    TCP包结构 一个TCP包结构如下: 一个TCP包主要由TCP包头和数据部分组成,包头固定部分为20字节,选项和数据部分根据实际情况设置为4N(N可以为0)字节. 1.16bit源端口和目的端口号,它 ...

  9. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  10. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

随机推荐

  1. webapi添加添加websocket中间件

    添加位置 我按照MSDN的例子添加了一个复述客户端响应的中间件.需要注意的时,中间件采用那种方式添加,添加在哪. 哪种方式 我选择创建一条管道分支,只要时ws的连接请求,就转到这个分支 因此,我们需要 ...

  2. [NOIP2000 提高组] 单词接龙

    传送锚点:https://www.luogu.com.cn/problem/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以 ...

  3. MyBatis延迟加载策略详解

    延迟加载就是在需要用到数据的时候才进行加载,不需要用到数据的时候就不加载数据.延迟加载也称为懒加载. 优点:在使用关联对象时,才从数据库中查询关联数据,大大降低数据库不必要开销. 缺点:因为只有当需要 ...

  4. claude3国内API接口对接

    众所周知,由于地理位置原因,Claude3不对国内开放,而国内的镜像网站使用又贵的离谱! 因此,团队萌生了一个想法:为什么不创建一个一站式的平台,让用户能够通过单一的接口与多个模型交流呢?这样,用户就 ...

  5. 通过计算巢部署 Puppet Enterprise 服务

    概述 Puppet Enterprise 是一款自动化软件,可帮助您和您的组织在管理 IT 基础设施的同时提高工作效率和敏捷性. 本文向您介绍如何开通计算巢上的 Puppet Enterprise 服 ...

  6. nginx001

    本文档版权归属:陈雷雷,仅限学习交流 QQ:370460470 blog:www.chenleilei.net Nginx服务实践 简述Nginx(nginx.org) Nginx (engine x ...

  7. foxy rviz2 "rviz_common/Time"报错问题

    报错内容 The class required for this panel, 'rviz_common/Time', could not be loaded. Error: According to ...

  8. 2023 Hive 面试宝典

    先说一些废话 总结一下Hive面试宝典,方便读者快速过一遍Hive面试所需要的知识点 Hive的介绍 Hive和Hadoop的关系 Hive利用hdfs存储数据,利用MapReduce查询数据 Hiv ...

  9. 简单实现Viper配置管理

    本文由 ChatMoney团队出品 简介 前面实现的一个简易suno-api.是使用cookie来获取suno-token发起请求的.当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了 ...

  10. AT_agc044_c

    problem & blog 由于看到和三进制有关的操作,可以想到建造每个结点都有三个儿子的 Trie.考虑维护两种操作. 1.Salasa 舞 对于这种操作,就是把每一个节点的第一个儿子和第 ...