三次握手:目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息。

理论上跟通话一样: a: 你听的到吗?  b: 我能听到。只需要两次就可以了,但建立连接阶段不是双向即时通信的,且最终的目的是为了建立安全稳定的连接。所以需要三次握手。

三次握手最终要达到的目的是,客户端以及服务端都知道自己以及对方发送接收正常,这样的机制才是健康安全的。

第一次握手:客户端给服务器发送了消息

解析:客户端发送了 SYN = 1,以及 seq = 1给服务端,这个过程结束后服务端知道了一件事情: 我自己的接收正常,客户端那边的发送正常。(这时候的客户端并不能确认自己的发送正常)

   seq = x相当于是一个暗号,客户端发完后就进入了等待发送状态(发送预启动)

第二次握手:服务端接收到了客户端的消息后作出反馈

解析:服务端返回给客户端的信息里:把刚才客户端发过来的 SYN = 1,以及 seq这个暗号 进行加1 得到ack = x+1,然后再发送一套自己的东西,ACK = 1, seq = Y.

客户端收到了 ack = x+1,明白了确实服务器收到了我刚才的那个请求,暗号是对的。并且也记下了服务器的那套东西, ACK以及seq

这个过程下来,客户可以确认:我的发送正常,接收也正常,服务器那边的接收正常,发送正常。(服务端那边还不能确认自己的发送正常),服务端进入等待接收状态(或者说是接收预启动)

第三次握手:客户端发送消息给服务端

解析: 客户端把之前收到的服务端发送过来的两个字段返回给服务端,并把那个暗号+1.

服务端可以做出总结:我之前发的服务端确实收到了,我的发送正常,客户端能收到我的消息并返回给我,那客户端的发送接收功能也正常。(第一次握手时候,服务端确认了自己的发送正常及客户端的发送正常)

至此: 客户端以及服务端都确认了,自己的发送接收正常,对方的发送接收也正常。结束,建立起tcp连接。双方由预启动状态正式开始工作。

总结:为什么要有三次握手:这个保证了即时性、有效性,假设一种场景:客服端给服务端发送的消息经历了太空漫游,网络延迟等,导致很久之后服务端才接收到。

    如果是客户端请求了,服务端接收到了请求就直接建立起tcp连接,这样服务端就会处在一个等待客户端请求端的状态(联想到了古代时期一妇女收到了战场上夫君的书信,然后天天桥头望夫归,信是几个月前军队寄       出来的,男人早已战死QAQ)。这种状态浪费了服务器的资源。

四次挥手:断开tcp连接的机制,防止对方话还没说完就挂电话了。。。

第一次挥手:客户端发送了报文给服务端,客户端进入了预关闭状态,表明自己没有啥话说了。

第二次挥手:服务端告诉客户端,我知道了。同时把暗号进行加1,返回给客服端。

第三次挥手:服务端继续告诉客户端,我也没啥话说了,那咱们挂电话吧? 服务端进入准备挂电话状态。

第四次挥手:客服端收到了服务端发的消息,确认对方也没有话交代了,且准备挂电话了。然后客户端说:好,那挂吧。

      服务端收到消息后,挂断电话(服务器进入关闭状态),客户端听到嘟嘟,知道对方挂电话了,于是自己也进入关闭状态。

      (原理是,客户端发出消息后,几毫秒之后没有接收到服务端的任何消息,就知道服务端是进入关闭状态了,于是自己也这样)

总结:为什么要四次挥手,客户端告知服务端:我没啥话说了。服务端回复客户端:我知道你没话说了。这两步走完后,不可能立马就挂的,

    万一服务端还有话说呢? 于是接下来,服务端需要通知客户端:我也没话说了,要不先挂了?下次再说?。这是第三步挥手。

   最后,客户端收到了服务端的消息,并说:好的,那挂了吧,下次再说。于是服务端挂电话,然后客户端也挂电话。TCP断开连接。

最后说明:以上内容纯自己手打,内容参考于以下两篇博客后自己做的总结巩固。

     https://blog.csdn.net/zixiaomuwu/article/details/60965466

     https://www.cnblogs.com/shihaochangeworld/p/5770294.html

TCP中的三次握手和四次挥手的更多相关文章

  1. TCP 中的三次握手和四次挥手

    Table of Contents 前言 数据报头部 三次握手 SYN 攻击 四次挥手 半连接 TIME_WAIT 结语 参考链接 前言 TCP 中的三次握手和四次挥手应该是非常著名的两个问题了,一方 ...

  2. 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手

    [摘要]本文重点分析计算机网络中TCP协议中的握手和挥手的过程. [前提说明] 前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需 ...

  3. TCP协议中的三次握手和四次挥手(图解)【转】

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...

  4. TCP/IP协议三次握手和四次挥手大白话解说

    前言 昨天晚上被一位师傅问到了TCP/IP的工作机制,心里很清楚三次握手,然而对于四次挥手却忘了,这是大学习里学过的,奋而翻阅书籍和网络对之前所学的做一个温顾,算是夯实自我吧. TCP(Transmi ...

  5. 详解TCP连接的“三次握手”与“四次挥手”(下)

    上文链接: 详解TCP连接的"三次握手"与"四次挥手"(上) 四.TCP的四次挥手(Four-Way Wavehand) 0.前言 对于"三次握手&q ...

  6. 白话解说TCP/IP协议三次握手和四次挥手

    白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...

  7. TCP为什么做三次握手、四次挥手

    TCP 为什么做三次握手.四次挥手? TCP 是为了解决可靠传输出现的.为了实现可靠性,TCP 做了流量控制.拥塞控制,并且在建立.关闭连接前做些机制:三次握手.四次挥手. 三次握手是为了让客户端.服 ...

  8. 真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)

    一.TCP报文格式 下面是TCP报文格式图: (1) 序号, Seq(Sequence number), 占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2) 确 ...

  9. TCP/IP协议 三次握手与四次挥手

    一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下:        (1)序号 ...

随机推荐

  1. GitHub初步探索-1-使用本地代码管理工具,简化上传的过程

    使用GitHub对于我们写Java的同志们来说是一个非常好的代码存储的方式,但是因为是全英文的,操作起来有一点复杂,所以我不是经常使用 ,但是最近代码越敲越多,再加上老师要求,希望使用比较简单的方法来 ...

  2. Sql Server关于日期查询时,如果表中日期到具体某个时间

    1.如果查询日期参数为'2017/02/21',而数据库表中的字段为'2017/02/21 12:34:16.963',则需要格式化一下日期才能查询出来,如下 select * from table ...

  3. BigDecimal setScale()设置无效 scale()取得的值不是setScale()设置的值

    最近查看rebate数据时,发现一个bug,主要现象是,当扣款支付宝的账号款项时,返回的是数字的金额为元,而数据库把金额存储为分,这中间要做元与分的转化,这个转化规则很简单,就是*100的,所以一开始 ...

  4. Effective C++(5) 了解C++默默地编写并调用哪些函数

    预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...

  5. Python实例---抽屉后台框架分析

    1.1. 抽屉框架分析 --登陆注册分析 1.2. 前台获取form表单补充知识: <!DOCTYPE html> <html lang="en"> < ...

  6. Mysql学习---使用Python执行存储过程

    使用Python执行存储过程 使用Python执行存储过程[2部分]: 1.执行存储过程,获取存储过程的结果集  2.将返回值设置给了  @_存储过程名_序号 = #!/usr/bin/env pyt ...

  7. Django 发送html邮件

    转载于: http://blog.sina.com.cn/s/blog_76e94d2101011bxd.html   django中发送html邮件:   #mailer.py   # -*- co ...

  8. C++派生类成员访问作用域,同名重载

    #include <iostream> using namespace std; class CFatherSum //父类Sum { public: int m_iVar; //公用数据 ...

  9. 【[HNOI2004]敲砖块】

    非常巧妙的\(dp\)顺序 这道题如果按照最正常的顺序来\(dp\)的话,显然是没有办法做的,后效性太大了 所以我们可以巧妙的改变\(dp\)的顺序 我们注意到一个位置\((i,j)\)要被打到的话就 ...

  10. ZooKeeper学习之路 (六)ZooKeeper API的简单使用(二)级联删除与创建

    编程思维训练 1.级联查看某节点下所有节点及节点值 2.删除一个节点,不管有有没有任何子节点 3.级联创建任意节点 4.清空子节点 ZKTest.java public class ZKTest { ...