zoukankan      html  css  js  c++  java
  • TCP三次握手

    大家都知道TCP是一种可靠的链接,之所以说它可靠是因为它在发送数据包之前会建立一个通道,待通道建立完毕后再发送数据,确保数据可以收到。而建立连接的过程和删除连接的过程也是很可靠的。建立连接是通过三次握手,删除连接是四次握手。下图是一个TCP三次握手的图,一个手机向一个服务器建立TCP连接:

    为什么建立连接要三次握手呢?两次不行吗?答案是不行,因为第三次握手就是为了保证第二次握手是一定成功的。这里不成功有两种可能(1. server发出的SYN+ACK在半路丢失 2. 手机发出了SYN在半路上延迟了,很久才到Server端,Server端却正常回SYN+ACK, 但此时作为Client的手机端已经放弃这次连接了,不会再有第三次握手。那么连接也是建立不成功的。)建立连接的过程,就像古代求娶美人订婚,首先男方托媒到女方家说媒,表明想娶这位美人为妻(类似第一次握手)。美人的家人经过询问女儿现在有没有意愿,如果同意了,媒婆再跑到男方家说女孩愿意了,这类似于第二次握手。然后这样就可以了吗?订婚就算完成了吗?当然不是,这时男孩再送一些聘礼到女方家,说定求娶日期,这样才算订婚完成。假如第二次握手完成后,男方没来送聘礼,那说明可能有变故了,可能媒婆死了,也可能男方嫌等的时间长了,也可能被公主看上了等等。这时美人就会想男方应该不会来娶她了,她会再考虑其他的人。当然就算完成三次握手也可能男方一直迟迟不来,但是订婚已完成,美女会等上一段时间,毕竟已经达成协议了呀。

    如下图,如果只有两次握手,但是第二次握手失败了,服务器认为连接已经建立成功,下面就会去向手机发送一些数据,但是其实并没有连接。就会造成发送失败。

    另外,最后一次握手的ACK还带有最新的手机端的滑动窗口信息,便于服务器发送正确长度的报文。如下图所示,是一次成功的TCP三次握手:

    并不是每次TCP握手都是成功的,如下图所示,黄色框里三个报文是一组,第三次服务器发送了RST报文,连接建立失败。

  • 相关阅读:
    A program file was not specified in the launch configuration.
    Effective C++条款38: 决不要重新定义继承而来的缺省参数值
    进程控制块
    Effective C++条款37: 决不要重新定义继承而来的非虚函数
    Effective C++条款42: 明智地使用私有继承
    迭代的是人,递归的是神(第一篇——递归调用的分析)
    Effective C++条款36: 区分接口继承和实现继承
    进程上下文
    进程的层次结构 ——进程组捕捉信号
    SQL语句的并集UNION,交集JOIN(内连接,外连接),交叉连接(CROSS JOIN笛卡尔积),差集(NOT IN)
  • 原文地址:https://www.cnblogs.com/janeysj/p/12966783.html
Copyright © 2011-2022 走看看