TCP通信原理

TCP协议是可靠的、面向连接的传输。下面以客户端、服务器连接为例进行说明。

TCP建立连接

在TCP协议中,当服务器与客户端建立连接时需要至少交换3个数据报文,也就是所谓的3次握手事件,如下图所示为3次握手建立连接的示意图。

  1. 首先服务器被动打开,准备接收外来的连接。
  2. 客户端主动打开发送同步序号(SYN= 1)以及初始序号(seq=x),并在这个不携带数据的报文中要指明想要连接的服务器的端口。
  3. 服务器确认收到客户端发来的SYN信号,并在发送确认信息(ACK= 1)的同时也发送同步序号(SYN=1)信号,包含服务器在同一连接中要发送的初始序号(seq=y)。ACK确认信号中的序号(ack=x+1)为客户端的初始序号值x加1来对客户端的连接进行确认,同样也为自己选择一个初始序号(seq= y)。
  4. 最后客户端再回传确认信号(ACK= 1)对服务器发来的SYN信号进行确认北立连接.这时ack=y+1.seq=x+1。

TCP通信传输数据过程

  1. 客户端在发送数据前先将数据存放在发送缓冲区内,再用TCP建立一个段,段内包含指明该段序列号的报头。
  2. 该数据段被封装成IP数据报,传输给服务器。
  3. 当TCP发出一一个段后,就启动一个定时器,等待目的端确认收到这个段。此时该段仍保留在发送缓冲区内。如果不能及时收到一个确认,将重发这个段。
  4. 服务器收到客户端的数据后,将发送一一 个确认,指明已经接收的字节数目。通常这个确认在推迟几分之一秒后发送。 该确认中包含有当前窗口的尺寸。
  5. 客户端收到确认后.将确认的段从发送缓冲区删除,并重传未得到确认的段。确认将向前移动窗口以发送新的段。

TCP通信的可靠性概述

  1. TCP实体把应用程序划分为合适的数据块,加上TCP报文头,生成数据段。
  2. 当TCP实体发出数据段后,立即启动计时器,如果源设备在计时器清零后仍然度有收到目的设备的确认报文,重发数据段。
  3. 当对端TCP实体收到数据,发回一个确认。
  4. TCP包含一个端到端的校验和字段,检测数据传输过程的任何变化。如果目的设备收到的数据校验和计算结果有误,TCP将丢弃数据段,源设备在前面所述的计时器清零后重发数据段。
  5. 由于TCP数据承载在IP数据包内,而IP提供了无连接的、不可靠的服务,数据包有可能会失序。TCP 提供了重新排序机制,目的设备将收到的数据重新排序,交给应用程序。
  6. TCP提供流量控制。TCP连接的每一端都有缓冲窗口。目的设备只允许源设备发送自己可以接收的数据,防止缓冲区溢出。
  7. TCP支持全双工数据传输。

TCP断开连接

在TCP断开连接时,需要进行4个数据包的交换,即4次握手,如下图所示。

  1. 在数据传输结束后客户端主动关闭,并向服务器端发送结束信号(FIN=1)。
  2. 服务器在接收到FIN后,向响应需要结的应用程序传送文件结束符,通知应用进程进行被动关闭,并向发来信号的客户端返回一个确认信号ACK.此时客户端进人等待状态等待服务器关闭相应进程并传回确认信号。
  3. 等待一段时间.收到文件结束符的服务器程序关闭后,向对应客户端发送一个结束符号FIN以及一个确认关闭信号ACK。
  4. 在客户端收到该信号后会进人等待状态(等待时间2s,之后会进行关闭,防止服务器发来的确认报文丢失而造成无法释放连接的情况),并回复一个确认信息ACK.当服务器接收到这个信息后会断开连接(此时会存在一个保活时间,即使客户端突然死机了,服务器电会在保活时间到了之后发送一个探测消息来决定是否要断开连接)。