TCP断开连接_legend050709
2014-08-14 08:58
127 查看
· 连接释放:
· 图释:
·
· 步骤:
· 数据传输结束后,通信的双方都可释放连接.现在
A 的应用进程先向其 TCP
发出连接释放报文段,并停止再发送数据,主动关闭
TCP 连接(A
把连接释放报文段首部的 FIN = 1,其序号seq
= u,等待 B
的确认)
· B
发出确认,确认号
ack = u+1,而这个报文段自己的序号
seq = v(TCP 服务器进程通知高层应用进程.从
A 到 B
这个方向的连接就释放了,TCP
连接处于半关闭状态.B
若发送数据,A
仍要接收)
· 若
B 已经没有要向 A
发送的数据,其应用进程就通知
TCP 释放连接
· A
收到连接释放报文段后,必须发出确认,在确认报文段中
ACK = 1,确认号 ack=w﹢1,自己的序号
seq = u + 1
· 注意:
TCP
连接必须经过时间 2MSL
后才真正释放掉(2MSL
的时间的用意 --- 为了保证
A 发送的最后一个 ACK
报文段能够到达 B.防止
“已失效的连接请求报文段”出现在本连接中.A
在发送完最后一个 ACK
报文段后,再经过时间
2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失.这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段)
·
· 发现丢失确认时候的处理:
三个问题:
· 要使每一方能够确知对方的存在
· 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)
· 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
(一)四次挥手
:
(1)
TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2)服务器收到这个FIN,它发回一个ACK,确认序号ack为收到的序号seq加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器关闭客户端的连接,发送一个FIN给客户端。
(4)客户段发回确认ACK,并将确认序号ack设置为收到序号seq加1。
(二)TCP的半关闭:
半关闭,指连接的一端在结束它的发送之后还能接收到对方发过来的数据的能力。
客户端发送FIN,另一端发送对这个FIN的ACK报文段。
(三)状态解析:
FIN_WAIT_1 :
FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。
FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2 :FIN_WAIT_2状态下的SOCKET,表示半连接。
TIME_WAIT:
表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSE_WAIT:表示在等待关闭。当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK:
这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
CLOSING:正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。
如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
(四)建立连接是三次握手,关闭连接是四次挥手:
服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但是在关闭连接的时候,ACK和FIN是分开发送的,所以是四次挥手。
(五)2MSL连接/time-wait连接:
MSL(maximum-segment lifetime
最长数据报生命期)
虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下。在TIME_WAIT状态停留的时间为2MSL。这样可以让TCP再次发送最后的ACK以避免这个ACK丢失。
(六)time_wait解析:
对于一个具体的实现所给定的MSL值处理的原则是:从TCP执行一个主动关闭,并发回最后一个ACK期间,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。
TIME_WAIT状态存在有两个理由:
(1)可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。
假设这个ACK丢失,那么LASK_ACK状态需要再次发送一个FIN给TIME_WAIT状态。为什么这个状态特殊呢,因为这个状态是客户端的最后一个状态,这个状态结束后客户端就会让出这个端口,这个连接也就会结束了。
(2)允许老的重复分节在网络中消逝。
在连接处于2MSL等待时,任何迟到的报文段将被丢弃。如果没有这个状态,而且又建立起来一个新的连接,那么上一次连接的重复分组(因为路由故障等原因没有按时到达而重复发送,如果还是原来的连接会丢弃重复分组的)可能在新的连接中再现。
(七)同时关闭:
双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,两端发送最后的ACK。当收到最后的A
C K时,关闭TCP连接.
· 连接释放:
· 图释:
·
· 步骤:
· 数据传输结束后,通信的双方都可释放连接.现在
A 的应用进程先向其 TCP
发出连接释放报文段,并停止再发送数据,主动关闭
TCP 连接(A
把连接释放报文段首部的 FIN = 1,其序号seq
= u,等待 B
的确认)
· B
发出确认,确认号
ack = u+1,而这个报文段自己的序号
seq = v(TCP 服务器进程通知高层应用进程.从
A 到 B
这个方向的连接就释放了,TCP
连接处于半关闭状态.B
若发送数据,A
仍要接收)
· 若
B 已经没有要向 A
发送的数据,其应用进程就通知
TCP 释放连接
· A
收到连接释放报文段后,必须发出确认,在确认报文段中
ACK = 1,确认号 ack=w﹢1,自己的序号
seq = u + 1
· 注意:
TCP
连接必须经过时间 2MSL
后才真正释放掉(2MSL
的时间的用意 --- 为了保证
A 发送的最后一个 ACK
报文段能够到达 B.防止
“已失效的连接请求报文段”出现在本连接中.A
在发送完最后一个 ACK
报文段后,再经过时间
2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失.这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段)
·
· 发现丢失确认时候的处理:
三个问题:
· 要使每一方能够确知对方的存在
· 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)
· 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
(一)四次挥手
:
(1)
TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2)服务器收到这个FIN,它发回一个ACK,确认序号ack为收到的序号seq加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器关闭客户端的连接,发送一个FIN给客户端。
(4)客户段发回确认ACK,并将确认序号ack设置为收到序号seq加1。
(二)TCP的半关闭:
半关闭,指连接的一端在结束它的发送之后还能接收到对方发过来的数据的能力。
客户端发送FIN,另一端发送对这个FIN的ACK报文段。
(三)状态解析:
FIN_WAIT_1 :
FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。
FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2 :FIN_WAIT_2状态下的SOCKET,表示半连接。
TIME_WAIT:
表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSE_WAIT:表示在等待关闭。当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK:
这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
CLOSING:正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。
如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
(四)建立连接是三次握手,关闭连接是四次挥手:
服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但是在关闭连接的时候,ACK和FIN是分开发送的,所以是四次挥手。
(五)2MSL连接/time-wait连接:
MSL(maximum-segment lifetime
最长数据报生命期)
虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下。在TIME_WAIT状态停留的时间为2MSL。这样可以让TCP再次发送最后的ACK以避免这个ACK丢失。
(六)time_wait解析:
对于一个具体的实现所给定的MSL值处理的原则是:从TCP执行一个主动关闭,并发回最后一个ACK期间,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。
TIME_WAIT状态存在有两个理由:
(1)可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。
假设这个ACK丢失,那么LASK_ACK状态需要再次发送一个FIN给TIME_WAIT状态。为什么这个状态特殊呢,因为这个状态是客户端的最后一个状态,这个状态结束后客户端就会让出这个端口,这个连接也就会结束了。
(2)允许老的重复分节在网络中消逝。
在连接处于2MSL等待时,任何迟到的报文段将被丢弃。如果没有这个状态,而且又建立起来一个新的连接,那么上一次连接的重复分组(因为路由故障等原因没有按时到达而重复发送,如果还是原来的连接会丢弃重复分组的)可能在新的连接中再现。
(七)同时关闭:
双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,两端发送最后的ACK。当收到最后的A
C K时,关闭TCP连接.
相关文章推荐
- 断开某tcp连接
- 优雅地关闭Socket;检测非正常断开的TCP连接
- TCP连接异常断开检测
- TCP 连接断开问题剖析
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- 8-TCP 协议(断开连接)
- TCP的连接与断开
- TCP3次握手连接协议和4次握手断开连接协议
- 一点细节 关于linux下tcp断开连接时的情况
- TCP3次握手连接协议和4次握手断开连接协议
- TCP协议三次握手连接四次握手断开和DOS攻击
- TCP断开连接4次挥手
- (转)TCP连接异常断开检测
- tcp断开连接时的四次挥手
- 怎样及时检测出非正常断开的TCP连接
- Tcp服务端判断客户端是否断开连接
- TCP建立连接和断开连接过程
- tcp长连接判断对方断开的方法
- 关于检测TCP连接断开
- tcp要点学习断开连接