TCP状态机

【三次握手】

服务器监听端口,被动打开;

开始建立连接是,客户端向服务器发送SYN报文,服务器转为SYN_RCVD状态;

服务器回传报文表示收到,客户端确认,转为ESTABLISHED状

客户端确认回传服务端转为ESTABLISHED,连接建立

当客户端和服务端都是ESTABLISHED时,连接建立

三次握手原因:网络是不可靠的,客户端的连接请求可能会因为网络原因滞留,当客户端没有收到确认的时候会重新发送,所以需要收到客户端确认的信息才建立连接!!!!

【四次挥手】

客户端准备关闭连接,发起FIN报文,进入FIN_WAIT1状态;

服务端基于是否还有数据传输,发出ask或者FIN报文;

客户端收到ack后进入FIN_WAIT2,

如果收到ACK+FIN,则进入TIME_WAIT状态;

在TIME_WAIT状态如果两个MSL内没有FIN信号,自动转化成CLOSED

【常见问题】

1. 为什么TIME_WAIT状态要进过2个MSL(Maximum Segment Lifetime.)才能进入CLOSED状态?

    假设网路是不可靠的,最后A发出的ACK信号丢失,那么B就没有收到ACK,此时B还需要重新发一个FIN给A,这个过程最多需要2MSL,所以如果过了2MSL,没有再次收到B的FIN,那么,说明之间A发出的ACK被B收到了,所以可以可靠地关闭连接。)


2. 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,482评论 0 11
  • 参考文章:https://www.2cto.com/net/201209/157585.html tcp状态: L...
    anmei001阅读 803评论 0 0
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 3,410评论 0 13
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,125评论 6 174
  • 套接字选项SO_RESUEADDR 即使端口处于2MSL状态,使用该选项,仍然能够在该端口建立连接。服务器常会设置...
    Myth52125阅读 1,432评论 0 0