三次握手建立连接
-
首先客户端向服务器发送SYN标志位 第一次握手
举个栗子: 客户端给服务器打电话: 我要跟你说话啦!
-
服务器发送SYN和ACK应答 第二次握手
服务器响应: 我也要跟你说话了, 收到你的请求了, 每句话编号, 我的下一句编号是Y!
-
客户端发送ACK应答 第三次握手
客户端: 我收到你的通话请求了, 我要说的下一句的编号是Z!
可靠的消息通信
此时客户端和服务器建立了可靠的通信基础。彼此之间通过编号确认所有收到的消息以及消息的顺序。 为什么要确认顺序呢, 因为一次消息的程度是有限制的, 由于网络波动, 可能晚发送的消息早达到, 甚至有可能有的消息丢失, 为什么? 自己去复习网络基础去吧!
通过确认编号, 就知道了之前所有的消息已经收到, 例如 服务器给客户端发送 1-10 十条消息, 而客户端接收到了 1, 2, 3, 5, 此时, 客户端给服务器的ACK应答应为4, 期待4的发送, 此时服务器就知道了自己应该再吧4发送一次, 顺便发送后面5-10。 因为部分消息可能丢失了。 需要再次发送。
四次挥手关闭连接
过程为:
-
主动方发送FIN标志位, 同时关闭写缓冲区
主动方: 我该说的说完了,我不说了。
-
被动方发送ACK应答, 同时关闭读缓冲区
被动方:我知道了, 我不听了, 我继续说
-
被动方发送FIN标记, 同时关闭写缓冲
被动方此时也说完了: 我也说完了, 我不说了。
-
主动方发送ACK应答, 同时关闭读缓冲
主动方: 行我知道了, 我也吧不听了。
主动方发送ACK应答之后,进入TIME_WAIT状态, 会等待2MSL时间
原因:
- 为了保证最后发送的ACK能够到达被动方, 因为这个ACK可能会丢失, 如果丢失了, 主动方没管的话, 被动方话一直等待ACK应答, 不会关闭连接, 浪费资源。如果到达了被动方, 在数据链路层会有确认报文段, 2MSL时间内没有收到确认报文段的, 主动方会再次发送ACK应答, 并重新计时2MSL。
- 防止已失效的报文段到达, 因为可能因为网络的原因, 前面的报文段晚到达了, 此时如果没有2MSL的时间, 会再次发起三次握手连接。 并此方一直陷入等待的状态, 浪费资源。 等待2MSL可以使得网络中所有的报文段到达此处。