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报文,连接建立失败。

  • 相关阅读:
    Mac下安装LNMP(Nginx+PHP5.6)环境
    MySQL中文全文检索
    关于Mysql模糊查询的优化-全文检索和Like的使用
    MySql全文索引
    为mysql数据库建立索引
    【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合
    PHP中利用redis实现消息队列处理高并发请求
    Windows下为PHP安装redis扩展
    Linux中postfix邮件服务器的搭建
    ELK日志分析系统(转)
  • 原文地址:https://www.cnblogs.com/janeysj/p/12966783.html
Copyright © 2011-2022 走看看