TCP与Socket状态转换图

这里写图片描述
原图

正常开启

  1. 初始时,Client 和 Server 的TCP状态都为CLOSED。
  2. S 端首先socket、bind、listen。listen后 S tcp状态会变成LISTEN,执行 被动打开。
  3. S 端调用 accept ,阻塞等待 tcp 有连接完成。
  4. C 端socket、connect,connect会阻塞到tcp的三次握手完成。
  5. 在C tcp 发送第一个 SYN 报文时,C tcp 状态变为 SYN_SEND,为主动打开一方。
  6. S tcp 收到 C tcp 的SYN后,状态由 LISTEN变为 SYN_RCVD,并进行发送回复(SYN K, ACK J+1 )。
  7. C tcp 收到回复时,状态变为 ESTABLISHED(数据传输状态),并回复 确认(ACK K+1),然后 connect 函数返回,这时客户点的 tcp连接创建完毕,可以向该套接字收发数据了。
  8. S tcp 收到3次握手的最后一个确认后,状态变为ESTABLISHED,至此,S 端的 accept 返回,返回已连接套接字(区分socket返回的监听套接字)。

正常关闭

  1. C 调用 close ,C tcp 向 S tcp 发送 FIN 报文,状态变为 FIN_WAIT_1,主动关闭。
  2. S tcp 收到 FIN 后,状态变为 CLOSE_WAIT,并回复 确认,此为 被动关闭。若此时 S 端正在阻塞 read 此套接字,read 将返回0。
  3. S 端 调用 close 或 退出进程,使 S tcp 向 C tcp 发送 FIN,S tcp 状态变为 LASK_ACK。
  4. C tcp 收到 S tcp 发送的 FIN 后,状态变为 TIME_WAIT,并对此 FIN 发送确认。在等待 2*MSL 后,状态变为 CLOSED,在此 2MSL 时间内,所有此 socket pair 的报文被丢弃(新建的,旧的)。
  5. S tcp 收到最后 ACK 后,状态变为 CLOSED。

异常情况

  • accept返回前连接终止
  • S 端进程终止
  • SIGPIPE信号
  • S 主机崩溃
  • S 主机崩溃后重启
  • S 主机关机

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章