### 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. 化繁为简|AIRIOT智慧水务信息化建设解决方案

    ​ "生产自动化,管理信息化"是现代化水厂建设的目标之一,需要在水质要求.工艺.生产.管理.环境等监测方面达到精细化管理标准,这是一个高度智能化,实现化繁为简智慧进阶的工程.传统水 ...

  2. PasteSpider之appsettings.json中的Serilog的配置,分流不同日志层级的信息!

    在实际使用Serilog中,我们通常会有不一样的需求,常见的比如 1.按照等级,高级哪个等级的才记录 2.记录文件每个多大,超过的划分到下一个文件中 3.不同等级的记录到不同的位置中 4.按照不一样的 ...

  3. c++ lambda学习举例

    #include <iostream> #include<vector> #include<algorithm> #include<cmath> #in ...

  4. Winform 动态画曲线 波峰波谷识别

    项目需要识别数组的波峰波谷,我就想 可视化的测试自己的判断波峰波谷的算法,于是就有了下面这张图. 我就用gdi+再panel上描点,点画完后,就点击分析按钮蓝色的为波峰 绿色的为波谷.虽然说能识别出来 ...

  5. CSS——透明度

    CSS 中提供了一个 opacity 属性用来设置元素的透明度,它不仅对颜色有效,对图像或者页面中其它的元素也有效. 其语法格式如下: opacity: number; 其中 number 为一个 0 ...

  6. 小程序视图组件 scroll-view

    视图容器组件 3.2.1.swiper 滑块视图容器. https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html 3 ...

  7. CF1815

    CF1815 Div. 1 确实难,Virtual Contest 上只完成了两道题,想出来了三道题. A. Ian and Array Sorting 秒切题--考虑将前 \(n - 1\) 个数变 ...

  8. 剑指Offer-52.正则表达式匹配(C++/Java)

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  9. kettle从入门到精通 第六十二课 ETL之kettle job中发送邮件(带多个附件),闭坑指南

    1.今天群里一个朋友加我微信遇到问下向我求助.一顿测试下来发现原来是使用kettle姿势不对,对kettle没有完全驾驭导致的,今天和大家一起分享下这个问题. 2.先自我膨胀下,自从写kettle系列 ...

  10. 使用 Java 客户端通过 HTTPS 连接到 Easysearch

    Easysearch 一直致力于提高易用性,这也是我们的核心宗旨,然而之前一直没有官方的 Java 客户端,也对用户使用造成了一些困扰,现在,我们正式发布了第一个 Java 客户端 Easysearc ...