zoukankan      html  css  js  c++  java
  • TCP为什么不是两次握手而是三次?

    为什么不采用两次握手?
    如果是两次握手的情景:
    客户端在发送一个连接建立请求之后进入等待状态,等到服务端确认之后就进入established状态。服务端在发送一个确认连接建立请求报文之后(不管客户端是否有回应)也进入established状态。
    这就好比,
    A给B打电话,
    A:你听得到我说话吗?
    B:我听得到啊
    A和B就都以为对方都能听得到自己了。
    但有一种情况是,B的麦是坏的,A根本就听不到B说话,结果A没收到B的回应,但B却以为A能听得到他,B就一直等着A说点什么...这样让B身心俱疲。

    三次握手:
    客户端在发送一个连接建立请求报文之后进入等待状态,等到服务端返回确认建立连接的通知;
    服务端发送确认建立连接请求报文,同时向客户端发送连接建立请求报文,进入等待状态。

    客户端接受到服务端发送的确认请求报文。进入established状态。客户端接受到来自服务端的连接建立请求报文,发送确认连接建立请求报文。

    服务端接受到来自客户端的确认建立连接报文,进入established。

    如果是三次握手,则会是这样:
    A:你能听得到我说话吗?
    B:我听得到啊,你能不能听得到我说话?
    A:我也听得到你啊。( established)
    B:(established)

    这样子A和B都能明确知道对方都能听到自己说话了。
    这样A和B就能安心煲电话粥了。从此过上幸福的快乐的生活。

    三次握手是因为,作为连接的一方,都要让对方明白自己知道对方的意见。

    第一次握手,a主动请求建立,b收到。

    第二次握手,a收到来自b的应答,此刻a知道了b同意了。

    第三次握手,b收到来自a的应答,此刻b知道了a知道它发送给a的请求。

    至此,连接双方a、b都知道了对方知道自己的话被知道了,连接可以建立了。

  • 相关阅读:
    MySQL学习——操作表
    MySQL学习——数据类型
    MySQL学习——操作数据库
    MySQL学习——存储引擎
    Linux网络——配置防火墙的相关命令
    查询各分类中最大自增ID
    CentOS7下Rsync+sersync实现数据实时同步
    mysql的join连接查询优化经历
    搭建nginx代理支持前端页面跨域调用接口
    Centos查看系统CPU个数、核心数、线程数
  • 原文地址:https://www.cnblogs.com/akiradunn/p/8643603.html
Copyright © 2011-2022 走看看