TCP 的三次握手与四次挥手过程,各个状态名称与含义

假设A是客户端,B是服务端。

  1. A首先向B发出连接请求报文段,这个时候首部中的同步位SYN=1,同时选择一个初始的序号x。此时报文段不能携带数据。此时A进入到SYN_SENT(同步已发送)状态。
  2. B受到连接请求报文,同意建立连接,向A发出确认。确认报文中,SYN和ACK都置1,确认号是x+1,与此同时,自己选择一个初始序号y,这个报文也不能携带数据。此时B进入SYN_RCVD(同步收到)状态。
  3. A收到B的确认后,还要给B确认。这时可以携带数据,A进入到ESTABLISHED状态。这就是三次握手的过程。

图片说明

那如果两次握手会怎么样呢?

就是A为什么还要发送一次确认。为了防止已经失效的连接请求报文又突然传送到了B,而产生错误。
假设一种异常,A发出的请求由于网络阻塞没有及时到达B,后又重传请求,之后B响应了,且建立了连接,之后连接又释放了。此时假设A发出的第一个请求到达B,B误以为是A再次请求连接,B建立连接,如果采用两次握手,此时连接建立,而A又不发送数据,浪费了B的资源。

TCP的四次挥手

数据传输结束后,通信双方都可以释放连接。
1.现在A和B都处于ESTABLISHED状态,A的应用进程向其TCP发出连接释放报文段,主动关闭TCP连接。A进入FIN_WAIT1(终止等待1)状态。
2.然后B确认,B进入CLOSE_WAIT(关闭等待)状态。此时TCP处于半关闭状态,A已经没有数据要发送了,如果B仍要发送数据,A仍然接收。
3.A收到B的确认后,就进入FIN_WAIT2(终止等待2)状态,等待B发出连接释放报文。 如果B已经没有向A发送的数据,则B发送请求释放报文,B进入LAST_ACK(最后确认)阶段,等待A的确认。
4.A在收到B的请求后,要发出确认,然后进入TIME_WAIT(时间等待)状态。此时,连接还未释放,必须等待时间等待计时器设定的时间的2MSL后,A才进入CLOSED状态。
图片说明

为什么最后要等一个TIME_WAIT时间呢?

  1. 为了保证最后一个ACK能够到达B,防止丢失了。如果走失了,B会重传,断开后A就不能回复确认了。
  2. 是为了防止之前提到的“已经失效的连接请求报文段“出现在连接中”。A发送完最后一个ACK,再经过时间2MSL,可以使本连接产生的所有请求报文从网络中消失。

TCP如何保证可靠性

• 数据包校验
• 超时重传机制
• 应答机制


• 对失序数据包重排序
• TCP还能提供流量控制