tcp有限状态机分析
tcp有限状态机分析
2011-11-23 0 个评论
收藏 我要投稿
-
这幅图是TCP的状态机,看了2个小时,分析总结如下:
(1)CLOSED 状态时初始状态。
(2)LISTEN:被动打开,服务器端的 状态变为LISTEN(监听)。被动打开的概念:连接的一端的应用程序通知操作系统,希望建立一个传入的连接。这时候操作系统为连接的这一端建立一个连 接。与之对应的是主动连接:应用程序通过主动打开请求来告诉操作系统建立一个连接。
(3)SYNRECVD:服务器端收到SYN后,状态为SYN;发送SYN ACK;
(4) SYN_SENTY:应用程序发送SYN后,状态为SYN_SENT;
(5)ESTABLISHED:SYNRECVD收到ACK后,状态为ESTABLISHED; SYN_SENT在收到SYN ACK,发送ACK,状态为ESTABLISHED;
(6)CLOSE_WAIT:服务器端在收到FIN后,发送ACK,状态为CLOSE_WAIT;如果此时服务器端还有数据需要发送,那么就发送,直到数据发送完毕;此时,服务器端发送FIN,状态变为LAST_ACK;
(7)FIN_WAIT_1:应用程序端发送FIN,准备断开TCP连接;状态从ESTABLISHED——>FIN_WAIT_1;
(8)FIN_WAIT_2:应用程序端只收到服务器端得ACK信号,并没有收到FIN信号;说明服务器端还有数据传输,那么此时为半连接;
(9)TIME_WAIT:有两种方式进入 该状态:1、FIN_WAIT_1进入:此时应用程序端口收到FIN+ACK(而不是像FIN_WAIT_2那样只收到ACK,说明数据已经发送完毕)并 向服务器端口发送ACK;2、FIN_WAIT_2进入:此时应用程序端口收到了FIN,然后向服务器端发送ACK;TIME_WAIT是为了实现TCP 全双工连接的可靠性关闭,用来重发可能丢失的ACK报文;需要持续2个MSL(最大报文生存时间):假设应用程序端口在进入TIME_WAIT后,2个 MSL时间内并没有收到FIN,说明应用程序最后发出的ACK已经收到了;否则,会在2个MSL内在此收到ACK报文;
2011.9.14补充:
关闭的状态转换比较复杂:现在设通信双方是A,B,A是主动发起关闭方
(1) 主动发起关闭方:
A首先主动发起FIN报文,准备关闭TCP连接,然后进入FIN_WAIT1状态;然后,如果A收到了ACK报文,就进入FIN_WAIT2状态;而如果A收到的是ACK + FIN,A进入TIME_WAIT状态。
进入FIN_WAIT2状态,说明B还有数据发给A。过了不久之后,B发送FIN给A,然后,A发送ACK,并进入TIME_WAIT状态。当2个MSL内,没有收到FIN信号,那么TIME_WAIT就自动转化为CLOESD。(为什么TIME_WAIT状态要进过2个MSL(Maximum Segment Lifetime.)才能进入CLOSED状态?假设网路是不可靠的,最后A发出的ACK信号丢失,那么B就没有收到ACK,此时B还需要重新发一个FIN给A,这个过程最多需要2MSL,所以如果过了2MSL,没有再次收到B的FIN,那么,说明之间A发出的ACK被B收到了,所以可以可靠地关闭连接。)
(2) 被动接收方
B在收到A的FIN报文后,知道A准备关闭 TCP连接了(注意只是A单方面关闭,也就是说,A还可以收数据,但是不准备发数据了)。B将发送ACK给A,然后B进入CLOSED_WAIT状态。如 果此时B也有数据发送给A,那么就一直发送好了,反正A不会发数据了。此时A处于FIN_WAIT2状态。当B的数据发送完毕之后,那么B发送FIN给 A,B进入LAST_ACK状态。当收到A发过来的ACK信号后,A进入CLOSED状态。
问题:
1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在 一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以 未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报 文和FIN报文多数情况下都是分开发送的。TCP的关闭连接的时候,状态很多,以刚才的例子分类:一个是主动发起方涉及的状态,一个被动发起方涉及的状态:
主动发起方:
FIN_WAIT1(发出FIN信号)
FIN_WAIT2(收到ACK信号)
TIME_WAIT(收到FIN信号)
CLOSED(2个MSL后,没有再次收到FIN,进入)
被动接收方:
CLOSED_WAIT(收到FIN信号)
LAST_ACK(发出FIN信号)
CLOSED(收到ACK信号,如果没有,再次发出FIN信号)
2.为什么能三次握手、四次挥手可靠地建立关闭连接?
注意可靠。
答:在建立连接的时候,首先需要发起方发出请求(即发出带有SYN的报文),接收方收到后必须给发起方一个回应(ACK+SYN)
,关键是这里还没有完毕。因为网络是不可靠地,(a)如果发起方没有收到应答方的ACK+SYN报文,显然,说明报文丢失,必须重发请求;(b)如果发起方收到ACK+SYN后,不再向接收方发出ACK信号(更正于2011.9.17)(也 就是只有两次握手,此时开始传递报文),那么从发起方的角度来看,它认为自己发出的ACK+SYN报文丢失了,接收方没有收到,所以它会再次重发。(c) 当发起方发出ACK信号后,如果没有收到接收方再次发来的ACK+SYN报文,那么说明接收方收到了自己发出的ACK报文,所以可以建立连接了。
举个例子,如何保障可靠通信:
现在A和B两支军队准备在10:00同时发起进攻,如何才能保证这两支军队同时呢?
现在A发出电报,“要求在10:00同时发起进攻”;
B收到后,显然必须向A回复“收到,可以”。
A在收到“收到,可以”的消息后,直到B已 经收到了自己发出的消息。注意,这里还没有完,如果你站在B的角度去思考:“我发出了‘收到,可以’的消息,必须要求A给我一个回应。如果我没有收到回 应,那么就说明我的这个消息没有送到A那里去”,那么,我得再传一次“收到,可以”的消息跟A。所以,A必须再次发出“你的消息已经收到”的消息发送给 B。此时,如果A没有再次收到B发来的“收到,可以”的消息,就可以认为自己的“你的消息已经收到”送给了B。而实际上,如果B收到A发来的“你的消息”我已经收到,说明,自己此前发出的消息已经被A收到。
这样,就可以保证A,B可靠地收到消息,保证他们在10:00准时发起进攻
转载于:https://blog.51cto.com/3639953/1657009
tcp有限状态机分析相关推荐
- 思科服务器远程管理,Telnet远程访问思科交换机、路由器 TCP协议分析工具
Top 1 Telnet远程访问思科交换机.路由器 1.1 问题 在企业中为方便网络管理员对Cisco设备的配置,一般需事先在Cisco交换机及路由器上开启远程管理的服务,借助网络通过telnet方式 ...
- TCP、UDP、TCP三次握手与四次挥手、TCP如何保证可靠传输、TCP异常分析、拆包和粘包等
4.OSI模型 4.1.OSI七层模型 4.2.七层模型功能 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,如网线:网卡标准. 数据链路层:接收来自物理层的位流形式的数据 ...
- TCP头部分析与确认号的理解
TCP头部分析与确认号的理解 https://www.cnblogs.com/xcywt/p/8075623.html TCP协议(1)--TCP首部 https://blog.csdn.net/la ...
- FTP协议中的登录 上传 下载 新建目录 删除目录 的wireshark包分析(一文看完TCP包分析,附源文件,ppt,操作视频)
目录 一原理 二.FTP登录 三.FTP下载 四.FTP上传 五.FTP新建目录 六.FTP删除目录 一原理 前言:TCP/IP四层模型和OSI模型对照,以及FTP在模型中的位置. • ...
- 计算机网络大作业telnet,计算机网络大作业-TCP包分析.pdf
计算机网络大作业-TCP包分析 2010 无84 吴文昊 2008011146 吴超 2008011137 张舸 2008011133 [计算机网络课程大作业] [实验报告] 目录 1 数据收集和初步 ...
- ModBus/TCP协议分析
ModBus/TCP协议分析 一.术语 1 word = 2 byte; 1 byte = 8 bit. 校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性.代码作为数据在向计算 ...
- 计算机网络实验报告 实验4 TCP协议分析
实验4 TCP协议分析 1.实验目的 了解运输层TCP协议基本概念.报文结构 分析TCP报文头部 分析TCP连接建立过程.TCP连接释放 掌握利用tcpdump和wireshark进行tcp协议分析技 ...
- linux /proc/net/tcp 文件分析
/proc/net/tcp文件提供了tcp的连接信息,是由net/ipv4/tcp_ipv4.c中的tcp4_seq_show()实现信息打印的 本文内容来源于 linux官方文档proc_net_t ...
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
最新文章
- 文献记录(part59)--多任务学习
- HTML5表单新增元素与属性(form、formaction、formmethod、formenctype、formtarget、autofous、required、labels)
- 复习JavaFile类_递归_综合案例
- (计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位、逻辑移位和循环移位)
- 大学 C语言程序设计第一讲,c语言程序设计1第一讲(第一章上).ppt
- pagehelper的使用_Spring Boot 2.x(十三):你不知道的PageHelper
- prototype、JQuery中跳出each循环的方法
- android软键盘挡住输入框问题解决方法
- 东财mysql作业_20春东财《MySQL数据库系统及应用》单元作业三(答案100分)
- GB2312 一二级中文汉字字库(带拼音)
- 基于matlab的电力系统潮流计算,基于matlab电力系统潮流计算
- oj1047: 对数表
- 【图像去噪】基于高斯滤波、均值滤波、中值滤波、双边滤波四种滤波实现椒盐噪声图像去噪附matlab代码
- 餐饮点餐外卖小程序源码(外卖订餐系统源码)
- WebDriver与浏览器版本对应关系
- 免费动态域名解析软件dnspod每步nat123体会
- 职场人做会议记录的法宝——讯飞智能录音笔SR101
- 纯CSS3实现常见多种相册效果
- 手风琴效果(jQuery)
- Java如何使用new来创建对象