图解TCP协议中的三次握手和四次挥手
最近在复习计算机网络,看到TCP这一章,总结一下。
建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:
先来看看如何建立连接的:
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发送报文,并分配资源,这样TCP连接就建立了。
如何断开连接呢?简单的过程如下:
注意中断连接端可以是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端所经历的状态如下:
而Server端所经历的过程如下:
注意在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
- 为了保证发送的最后一个ACK报文段能够到达B
- 防止“已失效的连接请求报文段”出现在本连接中。在发送完最后一个ACK报文段后,再经过实践2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种就得连接请求报文段。
TCP有限状态机
TCP有限状态机如下图:
- 粗实箭头表示客户进程的正常迁移
- 粗虚线箭头表示对服务器进程的正常迁移
- 细线箭头表示异常变迁
作者:小球why链接:http://www.jianshu.com/p/9968b16b607e
图解TCP协议中的三次握手和四次挥手相关推荐
- Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解
今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...
- 【转】TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- [转]TCP协议中的三次握手和四次挥手(图解)
本文转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来 ...
- Linux疑难杂症解决方案100篇(十九)-什么是TCP协议中的“三次握手,四次挥手”?带你深入探讨下
前言 以下是博主精心整理的专栏,需要的小伙伴可自行订阅. 深度学习100例全系列详细教程 深度学习算法原理介绍及应用案例 tensorflow从入门到精通100讲 深度学习框架TensorFlow的 ...
- TCP协议中的三次握手和四次挥手(图…
http://m.blog.csdn.net/article/details?id=51793861 http://m.blog.csdn.net/article/details?id=6667471
- tcp 协议中发送窗口的大小应该是_TCP 协议中的三次握手与四次挥手
今天来聊聊面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手.涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详解 4.什么是 TIME_ ...
- tcp协议报文和三次握手与四次挥手
tcp协议: tcp是面向连接.可靠的进程到进程之间的协议.tcp提供全双工服务:即:数据可在同一时间双向传输. tcp报文段首部格式: 各字段含义: 源端口号:16位字段,为发送端进程对应的端口号 ...
- 【转载】万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起
今日头条 腾讯技术工程 作者:morganhuang,腾讯 IEG 后台开发工程师 说到 TCP 协议,相信大家都比较熟悉了,对于 TCP 协议总能说个一二三来,但是 TCP 协议又是一个非常复杂的协 ...
- 简述tcp协议三报文握手过程_TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
最新文章
- EL之GB(GBR):利用GBR对回归问题(实数值评分预测)建模
- XCode提交app时提示SDK Version Issue,This app was built with the IOS 12.0 SDK...
- 2018 Wannafly summer camp Day3--Knight
- Linux信号处理函数可中断么,linux中关于信号处理笔记(一)
- MD5算法原理与常用实现
- 信息学奥赛一本通 1165:Hermite多项式
- java的恐怖推理游戏_胆小勿入!盘点一下2019年所有的恐怖游戏
- Java的%=是什么意思?%=运算的正确使用
- UG二次开发GRIP标准件库
- R语言:KNN算法的实现——kknn包
- mysql 分析explain命令执行sql的计划
- 服务器显示未知主机如何解决办法,mc服务器时候说我未知主机
- GO语言:zorm介绍
- 天馈线测试仪是什么?
- 帆软BI日期函数总结
- Java实现图片水印文字换行、平铺、旋转效果
- (P5)模型运行及结果可视化(netCDF)
- python文件打开模式的合法组合,python文件操作
- 计算机控制 根轨迹,五计算机实时控制系统的设计根轨迹法PPT课件
- Servlet学习日志