【网络】(六)TCP的十一种状态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CMbug/article/details/48416383

1、TCP 十种状态

这里写图片描述

过程描述:

  • 0.1 服务器B和客户端A中的套接字都处于CLOSE状态(图中未标出)
  • 0.2 服务器B调用socket/bind/listen函数创建了一个套接字后,处于LISTEN状态,该套接字属于被动套接字,被动套接字不能用来发起连接,只能接受连接
  • 0.3 客户端A调用socket/connect函数创建一个套接字后,处于SYN_SENT状态,该套接字属于主动套接字,用来发起连接,这会向服务器B发送一个用于发起连接的TCP段SYN,假定编号为a,并且此时connect函数处于阻塞状态
  • 0.4 服务器B由于调用accept而处于阻塞状态,在接收到客户端A发来的SYN a段后,服务器B的套接字就处于SYN_RCVD状态,此时accept函数并不返回,还是处于阻塞状态;同时,它对SYN a段进行确认,并发送SYN b段和一个确认段ACK a+1给对方
  • 0.5客户端A接收到服务器B发送的SYN b 和 SYN a+1段后,然后处于ESTABLISHED状态,connect函数返回,并发送ACK b+1 确认段给服务器B
  • 0.6 服务器B收到ACK b+1 段后,TCP状态也就处于ESTABLISHED状态,accept函数返回,连接的三次握手完成,accept将未连接队列中的一个条目移至以连接队列中,并返回队头连接

 

  • 0.7 连接建立后,双方可通信,通信过程中,双方都可发起关闭请求

 

  • 0.8 假设客户端A发起关闭请求close,向服务器B发送一个FIN x段,此时客户端A TCP状态变为:FIN_WAIT_1
  • 0.9 服务器B收到FIN x段后,会导致read函数返回0,同时服务器B会对FIN x段进行确认,发送确认段 ACK x+1,导致服务器B的TCP状态变为:CLOSE_WAIT
  • 1.0 客户端A接收到ACK x+1确认段后,TCP状态变为:FIN_WAIT_2,从而等待服务器B发起close请求
  • 1.1 服务器B在收到0.9中的FIN x段后,也可发起close关闭请求,发送FIN y段给客户端A,TCP状态变为:LAST_ACK
  • 1.2 客户端A收到FIN y段后,确认关闭,并发送ACK y+1给服务器B,TCP状态变为:TIME_WAIT,此时客户端A的连接并不马上关闭,而是保留2MSL时间(报文最大生存时间),目的是保证ACK y+1发送后,如果对方没有收到,及时重发它
  • 1.3 服务器B收到ACK y+1段后,表示客户端确认关闭,TCP状态变为:CLOSED;TCP 四次挥手完成,TCP连接关闭!

 
2、TCP 第十一种状态–CLOSING

该状态发生于:如果客户端和服务器同时发起了关闭请求,那么此时它们的TCP状态就都为FIN_WAIT_1,并发送FIN段给对方,对方收到FIN段后,又发送确认段ACK段给对方,此时彼此的TCP状态就为CLOSING,当接收到对方的ACK段后,彼此状态变为:TIME_WAIT,该状态是发起close的一方才会有的状态。

 
3、SIGPIPE信号的产生

在TCP通信中,往一个已经接收到FIN段的套接字中再发送数据是合法的,接收到FIN段仅仅代表对方不再发送数据,即不再往套接字中写入数据,不代表我们不能给它发送数据!
如果此时发送了数据给对方,而对方的进程已经不存在了,会导致TCP的重置,并发送一个RST段给我们,如果我们再次发送数据给对方,在调用write函数时就会产生SIGPIPE信号,对于这个信号,可以直接捕获然后忽略它,如果不捕获,默认的操作会立即结束当前进程!

展开阅读全文

没有更多推荐了,返回首页