TCP为何采用三次握手来建立连接,若采用两次握手可以吗,请说明理由?

  不可以。采用三次握手是为了防止失效的连接请求报文段突然又传送到服务器,从而发生错误。当客户端发出的连接请求报文段由于某些原因没有及时到达服务器,而客户端在等待一段时间后,又重新向服务器发送连接请求,且建立成功,顺序完成数据传输,那么第一次发送的连接请求报文段就称为失效的连接请求报文段。

  考虑这样一种情况,客户端第一次发送的连接请求并没有丢失,而是因为网络问题导致延迟到达服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端不予理会,服务器就一直等待客户端发送数据,导致服务器资源浪费。

TCP为何会采用四次挥手来释放连接?

  关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了,但未必你所有的数据都发送给对方了,所以你未必会马上关闭socket,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你没有数据发送给对方了,针对每个FIN报文,都需要ack报文。所以需要四次挥手。

为何需要TIME_WAIT状态?

  1. 实现终止TCP全双工连接的可靠性

  假设最终的ACK状态消失,服务器将重新发送最终的FIN。因此客户必须维护状态信息以允许它重发最终的ACK,如果不维护状态信息,它将最终响应以RST,而服务器则把该分节解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接方向的数据流,那么它必须能够处理连接终止序列四个分节中任何一个分节丢失的情况,也即主动关闭的那一端进入TIME_WAIT状态,因为它可能不得不重新发送最终的ACK。

  2. 允许老的重复分节在网络中消失

  我们假设12.106.32.254端口1500和206.168.112.219端口21之间有一个TCP连接,我们关闭这个连接后,在以后某个时候又建立起相同的IP地址和端口之间的TCP连接。后一个连接称为前一个连接的化身,因为它们的IP地址和端口号是相同的,TCP必须防止来自某个连接的老的重复分组在连接终止后再现,从而被误解成属于同一个连接的化身。要实现这种功能,TCP不能给处于TIME_WAIT状态的连接启动新的化身,既然TIME_WAIT状态的持续时间是2MSL,这就足够让某个方向上的分组存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃,通过实施这个规则,我们就能保证当成功建立一个TCP连接时,来自该连接的先前的化身的老重复分组都已在网络中消失了。

  

参考资料:

  1.http://coolshell.cn/articles/11564.html

  2.《王道程序员求职宝典》

  

TCP建立连接与释放连接过程中的几个问题的更多相关文章

  1. SQL Server 2005 sa登录失败。已成功与服务器建立连接 但是在登录过程中发生错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。

    SQL Server 2005 Express版 用户 'sa' 登录失败.该用户与可信 SQL Server 连接无关联.提示错误:已成功与服务器建立连接 但是在登录过程中发生错误. provide ...

  2. TCP建立连接和释放连接过程

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP建立连接需要三次握手,释放连接需要四次握手. 1.TCP整 ...

  3. TCP建立连接与释放连接

    1.建立连接:(三次握手) (1)客户端发送一个SYN包给服务器,然后等待应答. (2)服务器端回应给客户端一个ACK=1.SYN=1的TCP数据段. (3)客户必须再次回应服务器端一个ACK确认数据 ...

  4. 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案

    import pymysqlfrom redis import Redisimport time h, pt, u, p, db = '192.168.2.210', 3306, 'root', 'n ...

  5. TCP建立连接和释放的过程,及TCP状态变迁图

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

  6. TCP建立连接三次握手和释放连接四次握手

    TCP建立连接三次握手和释放连接四次握手     [转载]http://blog.csdn.net/guyuealian/article/details/52535294   在谈及TCP建立连接和释 ...

  7. 【转】TCP建立连接三次握手和释放连接四次握手

    在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程) 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数 ...

  8. TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开

    TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...

  9. TCP长连接与短连接的原理及区别

    一.当网络通信时采用TCP协议时:  1.过程: 第一步:(在真正的读写操作之前)Server 和Client 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...

随机推荐

  1. 20155206 2016-2017-2 《Java程序设计》第三周学习总结

    20155206 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 两个基本标准类:java.util.Scanner , java.math.BigDecim ...

  2. 20155231 2016-2017-2 《Java程序设计》第3周学习总结

    20155231 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 学习目标 区分基本类型与类类型 理解对象的生成与引用的关系 掌握String类和数组 理解封 ...

  3. 20155301 2016-2017-2 《Java程序设计》第4周学习总结

    20155301 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 1.关键词extends,表示SwordsMan会扩充Role的行为,然后再扩充Role原本 ...

  4. 2016-2017-2 20155302 实验四 Android 开发基础

    2016-2017-2 20155302 实验四 Android 开发基础 实验内容 1.下载和安装Android Studio 2.学会使用Android Studio进行简单的Android开发 ...

  5. 北京Uber优步司机奖励政策(4月12日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. OpenCV人脸识别-训练级联分类器

    OpenCV中以及附带了训练好的人脸特征分类器,3.2版本的有三种: 分别是LBP,Haar,Hug 在Data目录下. 也可以训练自己的特征库,具体参照如下: 级联分类器训练 — OpenCV 2. ...

  7. 【转载】C/C++杂记:深入理解数据成员指针、函数成员指针

    原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始 ...

  8. 【转载】OGRE中用到的设计模式

    原文:OGRE中用到的设计模式 1.       单例模式(Singleton) 2.       工厂方法(Factory Method)  3.       适配器模式(Adapter)  4.  ...

  9. 【LG3242】 [HNOI2015]接水果

    题面 洛谷 题解 20pts 对于\(n,P,Q\leq 3000\),暴力判断每条路径的包含关系然后排序\(kth\)即可,复杂度\(O(PQ\log P)\) 另30pts 原树为一条链. 发现对 ...

  10. Zabbix学习之路(五)之MySQL监控

    1.linux-node2节点安装数据库 [root@linux-node2 ~]# yum install -y mariadb-server [root@linux-node2 ~]# syste ...