三次握手
image.png
具体流程:
客户端发送连接请求报文 服务器端收到后回复ack报文 并为这次连接分配资源 客户端收到ack报文后也向服务器端发送ack报文 并分配资源 这些tcp连接就建立了
四次挥手
image.png
流程:
中断连接的一端可以是客户端 也可以是服务器端 假设客户端发起中断连接的请求 意思是 我这里面没有数据发送了 但是你如果没有数据发送完成 不要先着急关闭socket 可以继续发送数据
服务器收到消息之后 发送ack给客户端 你的请求我收到了 请等待我的后续消息
这个时候客户端进入 fin_wait状态 继续等待服务端的fin报文 当服务端确定报文已经发送完成的时候 向客户端发送 fin报文 告诉客户端 我这边数据已经发送完了 准备好关闭连接了
客户端收到fin报文之后 就知道可以关闭连接了 但是他不相信网络 怕服务器端不知道要关闭 所有发送ack进入time_wait状态 如果服务器端没有收到ack则重传
服务器端收到ack后 就知道可以断开连接了
客户端等待2mls后依然没有用收到回复 则证明服务器端已经正常关闭 那么客户端也能关闭了
至此 tcp连接关闭
反过来要是关闭请求由另一方提出 那么过程刚好相反
问:为什么连接是三次握手 关闭的时候是四次握手
当服务器端收到客户端的syn连接请求之后 直接发送syn+ack报文 前者用来同步 后者用来应答 但是当关闭连接的时候 服务器端收到fin报文时 很可能不会马上关闭socket 所以只能先回复一个ack报文 告诉 客户端 你的fin报文我收到了 但是只有等服务器端所有的报文都已经发送完成 才能发送fin报文 因此不能一起发送 所以需要四次握手
为什么time_wait状态 需要进行2mls才能返回close状态
虽然按 道理四个报文发送完毕就能进入close 状态 但是我们必须承认并假象网络是不可靠的 如果最后一个ack报文丢失 那么time_wait状态就是用来重发可能丢失的ack报文
网友评论