TCP/IP详解学习笔记-TCP连接的建立与中止
来源:互联网 发布:成交量指标源码 编辑:程序博客网 时间:2024/06/05 09:43
TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。
书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,可以看到,TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次分手。
TCP状态转换图:
如果是二次就建立连接,即客户端没有发送确认,server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。而client认为是早已失效的延时请求报文
1. TCP连接的状态
首先介绍一下TCP连接建立与关闭过程中的状态。TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体状态如下所示:
- CLOSED:初始状态,表示没有任何连接。
- LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求。
- SYN_SENT:发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包。
- SYN_RECEIVED:收到一个连接请求后回送确认信息和对等的连接请求,然后等待确认信息。通常是建立TCP连接的三次握手过程中的一个中间状态,表示Server端的Socket接收到来自Client的SYN包,并作出回应。
- ESTABLISHED:表示连接已经建立,可以进行数据传输。
- FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包。若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态,等待对方返回ACK包,此后还能读取数据,但不能发送数据。在正常情况下,无论对方处于何种状态,都应该马上返回ACK包,所以FIN_WAIT_1状态一般很难见到。
- FIN_WAIT_2:主动关闭连接的一方收到对方返回的ACK包后,等待对方发送FIN包。处于FIN_WAIT_1状态下的Socket收到了对方返回的ACK包后,便进入FIN_WAIT_2状态。由于FIN_WAIT_2状态下的Socket需要等待对方发送的FIN包,所有常常可以看到。若在FIN_WAIT_1状态下收到对方发送的同时带有FIN和ACK的包时,则直接进入TIME_WAIT状态,无须经过FIN_WAIT_2状态。
- TIME_WAIT:主动关闭连接的一方收到对方发送的FIN包后返回ACK包(表示对方也不再有数据需要发送,此后不能再读取或发送数据),然后等待足够长的时间(2MSL)以确保对方接收到ACK包(考虑到丢失ACK包的可能和迷路重复数据包的影响),最后回到CLOSED状态,释放网络资源。
- CLOSE_WAIT:表示被动关闭连接的一方在等待关闭连接。当收到对方发送的FIN包后(表示对方不再有数据需要发送),相应的返回ACK包,然后进入CLOSE_WAIT状态。在该状态下,若己方还有数据未发送,则可以继续向对方进行发送,但不能再读取数据,直到数据发送完毕。
- LAST_ACK:被动关闭连接的一方在CLOSE_WAIT状态下完成数据的发送后便可向对方发送FIN包(表示己方不再有数据需要发送),然后等待对方返回ACK包。收到ACK包后便回到CLOSED状态,释放网络资源。
- CLOSING:比较罕见的例外状态。正常情况下,发送FIN包后应该先收到(或同时收到)对方的ACK包,再收到对方的FIN包,而CLOSING状态表示发送FIN包后并没有收到对方的ACK包,却已收到了对方的FIN包。有两种情况可能导致这种状态:其一,如果双方几乎在同时关闭连接,那么就可能出现双方同时发送FIN包的情况;其二,如果ACK包丢失而对方的FIN包很快发出,也会出现FIN先于ACK到达。
TCP连接的状态转换如下图所示
2. TCP连接的关闭方式
建立TCP连接需要三次握手,而关闭连接则需要四次握手,并且分为主动关闭和被动关闭。这是由于TCP连接是全双工的,我关了你的连接,并不等于你关了我的连接,因此双方都必须单独进行关闭。当一方完成它的数据发送任务后可以发送FIN包来终止这个方向的连接,表明自己不再有数据需要发送;收到FIN包的那一方虽然不能再读取数据,但仍能发送数据。以Client主动关闭连接为例:
- Client向Server发送FIN包,表示Client主动关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。
- Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。
- Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。
- Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。
TCP连接的建立到关闭,需要经历以下状态迁移(假定Client发起连接,并主动关闭连接):
- Client
CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
- Server
CLODES -> LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止 .
- TCP/IP详解--学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- stm32 IAP + APP ==>双剑合一
- 过三点的圆 用鼠标点三个共线的点 生成过这三个点的外接圆 源代码
- linux系统上Chrome播放flash卡顿问题
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构
- 图像LBP特征
- TCP/IP详解学习笔记-TCP连接的建立与中止
- Domino 迁移到Exchange 服务器 之在Domino Server 创建用户!
- python模块学习-----加密、随机数生成
- 对Spring的IoC和DI最生动的解释
- 啥叫组播单播分离
- hdu 1028 Ignatius and the Princess III
- java 中 file to url
- Quartz定时任务配置
- const和define的区别