TCP的三次握手和四次挥手

TCP的特性

  1. TCP提供一种面向连接的、可靠的字节流服务。
  2. 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
  3. TCP使用校验和,确认和重传机制来保证可靠传输。
  4. TCP给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复。
  5. TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。

三次握手与四次挥手

TCP的三次握手和四次挥手

三次握手(Three-way Handshake)

建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

1)第一次握手(SYN=1, SEQ=x)

客户端发送一个TCP报文段,SYN=1,指明客户端打算连接的服务器的端口,以及第一个数据字节的序列号 SEQ=x。发送完毕后,客户端进入SYN_SEND状态。

2)第二次握手(SYN=1, ACK=x+1, SEQ=y)

服务器收到连接请求报文后,发回确认报文,SYN=1,ACK=x+1。服务器端选择自己 ISN 序列号y。发送完毕后,服务器端进入 SYN_RCVD 状态。

3)第三次握手(ACK=y+1)

客户端通知上册应用进程,连接已建立,客户端进入ESTABLISHED状态。服务器收到客户端发送的确认报文ACK=y+1,也通知器上层应用进程,连接已建立,服务器端也进入ESTABLISHED状态。

四次挥手(Four-way handshake)

客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

1)第一次挥手(FIN=1,SEQ=u)

注意这里的u等于前面已经传送过的数据最后一个字节的序号加1。
假设客户应用进程向其TCP发出连接释放请求,它发送一个报文给服务器端,FIN=1,SEQ=u。发送完毕后,客户端进入 FIN_WAIT_1 状态。

2)第二次挥手(ACK=u+1)

服务器端TCP收到客户端发来的释放连接请求立即发出确认,ACK=u+1。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
此后服务器不再接受客户端发来的数据,但若服务器还有数据要发给客户端,则可继续发送。

3)第三次挥手(FIN=1,SEQ=v,ACK=u+1)

注意y等于前面已传送过的数据的最后一个字节的序号加1。
服务器端向其应用进程释放TCP连接。服务器端向客户端发送连接释放报文段,FIN=1,SEQ=v,重复上次发送过的ACK=u+1。服务器处于LAST_ACK状态,客户端处于TIME_WAIT状态。

4)第四次挥手(ACK=v+1)

客户端发送ACK=v+1,将客户端到服务器端的连接释放掉。服务器处于CLOSED状态。客户端再向其应用进程报告,整个连接已全部释放。