在《计算机网络》一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,B端收到一个过时失效的报文段之后,向A端发出确认,此时A并没有要求建立连接,所以就不会向B端发送确认,这个时候B端也能够知道连接没有建立。

问题的本质是,信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求的。


TCP建立连接三次握手过程:
第一次握手:建立连接时, 客户端发送 syn包(syn=j)到 服务器,并进入 SYN_SENT状态,等待服务器确认;SYN:同步序列编号( Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。


TCP为什么四次挥手?
本质的原因是TCP是全双公的,要实现可靠的连接关闭,A发出结束报文FIN,收到B确认后A知道自己没有数据需要发送了,B知道A不再发送数据了,自己也不会接收数据了,但是此时A还是可以接收数据,B也可以发送数据;当B发出FIN报文的时候此时两边才会真正的断开连接,读写分开。


TCP断开连接四次挥手过程: 
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的  数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK  报文确认,并将确认序号设置为收到序号加1。

最新文章

  1. sparksql udf的运用----scala及python版(2016年7月17日前完成)
  2. SQL SERVER与SSIS 数据类型对应关系
  3. SSH 动态端口forwarding是如何工作的
  4. 从零开始学习Node.js例子零 永远的Hello World
  5. [转载]逐步建设企业DevOps能力
  6. Spring 接口代理 类代理
  7. Windows 一键安装OpenSSL
  8. centos7配置笔记
  9. java、android 对比两个目录或文件是否是同一个目录或文件的方法
  10. linux 下使用crontab 定时打包日志并删除已被打包的日志
  11. PPTPD服务端搭建
  12. 新概念英语(1-37)Making a bookcase
  13. SpringBoot集成rabbitmq(一)
  14. Ingress介绍与安装配置
  15. (转载)spring RestTemplate用法详解
  16. 使用JDBC从数据库中查询数据的方法
  17. Spring Cloud feign
  18. python练习题-3
  19. python Django框架接入微信公众平台
  20. 如何理解Robot Framework

热门文章

  1. 数据库的SQL基本用法 创建 删除 查询 修改
  2. Promise里的代码为什么比setTimeout先执行
  3. MySQL快速回顾:计算字段与函数
  4. css样式及类型集合
  5. springcloud之断路器(Hystrix)
  6. Akka Java 文档 -- 容错
  7. Android的学习之路一
  8. Golang - 指针与引用
  9. Potplay视频播放画面扭曲
  10. 机器学习-浅谈神经网络和Keras的应用