最近在复习计算机网络,看到TCP这一章,总结一下。

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

1.jpg

先来看看如何建立连接的:

2.png

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发送报文,并分配资源,这样TCP连接就建立了。

如何断开连接呢?简单的过程如下:

3.png

注意中断连接端可以是Client端,也可以是Server端

假设Client端发起中断请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说“我client端要发给你了”,但是如果你还没有数据要发送完成,则不必急着关闭Socket,可以继续发送数据。所以所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

整个过程Client端所经历的状态如下:

4.png

而Server端所经历的过程如下:

5.png

注意在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

  1. 为什么连接的时候是三次握手,关闭的时候却是四次握手?

    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

  2. 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    • 为了保证发送的最后一个ACK报文段能够到达B
    • 防止“已失效的连接请求报文段”出现在本连接中。在发送完最后一个ACK报文段后,再经过实践2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种就得连接请求报文段。

TCP有限状态机

TCP有限状态机如下图:

  • 粗实箭头表示客户进程的正常迁移
  • 粗虚线箭头表示对服务器进程的正常迁移
  • 细线箭头表示异常变迁

作者:小球why链接:http://www.jianshu.com/p/9968b16b607e

图解TCP协议中的三次握手和四次挥手相关推荐

  1. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  2. 【转】TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  3. [转]TCP协议中的三次握手和四次挥手(图解)

    本文转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来 ...

  4. Linux疑难杂症解决方案100篇(十九)-什么是TCP协议中的“三次握手,四次挥手”?带你深入探讨下

    前言 以下是博主精心整理的专栏,需要的小伙伴可自行订阅. 深度学习100例全系列详细教程  深度学习算法原理介绍及应用案例 tensorflow从入门到精通100讲 深度学习框架TensorFlow的 ...

  5. TCP协议中的三次握手和四次挥手(图…

    http://m.blog.csdn.net/article/details?id=51793861 http://m.blog.csdn.net/article/details?id=6667471

  6. tcp 协议中发送窗口的大小应该是_TCP 协议中的三次握手与四次挥手

    今天来聊聊面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手.涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详解 4.什么是 TIME_ ...

  7. tcp协议报文和三次握手与四次挥手

    tcp协议: tcp是面向连接.可靠的进程到进程之间的协议.tcp提供全双工服务:即:数据可在同一时间双向传输. tcp报文段首部格式: 各字段含义: 源端口号:16位字段,为发送端进程对应的端口号 ...

  8. 【转载】万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起

    今日头条 腾讯技术工程 作者:morganhuang,腾讯 IEG 后台开发工程师 说到 TCP 协议,相信大家都比较熟悉了,对于 TCP 协议总能说个一二三来,但是 TCP 协议又是一个非常复杂的协 ...

  9. 简述tcp协议三报文握手过程_TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

最新文章

  1. EL之GB(GBR):利用GBR对回归问题(实数值评分预测)建模
  2. XCode提交app时提示SDK Version Issue,This app was built with the IOS 12.0 SDK...
  3. 2018 Wannafly summer camp Day3--Knight
  4. Linux信号处理函数可中断么,linux中关于信号处理笔记(一)
  5. MD5算法原理与常用实现
  6. 信息学奥赛一本通 1165:Hermite多项式
  7. java的恐怖推理游戏_胆小勿入!盘点一下2019年所有的恐怖游戏
  8. Java的%=是什么意思?%=运算的正确使用
  9. UG二次开发GRIP标准件库
  10. R语言:KNN算法的实现——kknn包
  11. mysql 分析explain命令执行sql的计划
  12. 服务器显示未知主机如何解决办法,mc服务器时候说我未知主机
  13. GO语言:zorm介绍
  14. 天馈线测试仪是什么?
  15. 帆软BI日期函数总结
  16. Java实现图片水印文字换行、平铺、旋转效果
  17. (P5)模型运行及结果可视化(netCDF)
  18. python文件打开模式的合法组合,python文件操作
  19. 计算机控制 根轨迹,五计算机实时控制系统的设计根轨迹法PPT课件
  20. Servlet学习日志

热门文章

  1. linux shell pushd popd dirs命令
  2. redis java对象操作
  3. 把自己当成打工的,一辈子都是打工的!:周鸿祎
  4. 使用JSON.parse(),JSON.stringify()实现对对象的深拷贝
  5. 初识区块链——用JS构建你自己的区块链
  6. 多核学习在图像分类中的应用
  7. 数据结构排序学习总结
  8. Redis-04Redis数据结构--哈希hash
  9. Apache-DBCP数据库连接池解读
  10. C++五子棋(四)——走棋原理及权值计算