TCP协议的全称是Transmission Control Protocol,中文名叫传输控制协议。TCP协议的主要目标是在不可靠的互联网络上提供可靠的端到端的网络服务,为了达成这个目标,TCP设计与实现了这样几个协议功能:网络连接的建立与释放、滑动窗口,拥塞控制等。
TCP协议头
源端口与目标端口指明了发送与接收TCP段的应用程序,TCP协议使用这两个端口与加上IP协议头上的目标IP与源IP,就可以在源端点与目标端点间建立一条连接。
序号字段是当前TCP字段的编号,TCP流中的每一个段都有自己的编号。确认号字段表示接收端期待接收的下一个TCP段。
因为选项字段是可选且不固定长度,因此TCP头长度字段指明了整个TCP段中头的长度,具体来说其值为头固定长度的20字节加上不固定长度的选项字段的字节数。
ACK字段为1表示确认号字段有效,为0表示该TCP段不包括确认信息。
SYN段在TCP建立连接即三次握手阶段起作用,配合着ACK一起使用。SYN=1/ACK=0表示Connection request,SYN=1/ACK=1则表示Connection Accepted。
FIN段用于发送端已经没有数据需要传输了,可以释放该TCP连接。
WIN字段指明从被确认的字节算起接收端还可以接收多少字节数据。该字段值为0表示接收端缓冲区已满,希望发送端暂停发送数据。
三次握手
三次握手流程是TCP协议中最经典的问题。上图中SYN表示TCP段中syn字段值为1,seq表示TCP段中的序号字段,ack表示确认号段,DATA表示正式发送TCP数据时的TCP段。
第一次握手:由客户端向服务段发送一个TCP段,SYN为1,seq值为x,发送后客户端进入等待服务端确认状态。
第二次握手:服务端接收到客户端的连接请求后,返回一个确认TCP段,SYN字段为1,ack值为x+1表示期望接收的下一个段序号为x+1,seq值为y表示服务端发送的TCP段初始序号为y。
第三次握手:客户端接收到服务端返回的确认字段后,同样也需要给服务返回对其初始序号为y的确认段。与前两次握手不同的是,本次确认可以与客户端将要发送的数据合并到一个TCP段中发送,这也是图中第三次握手使用DATA表示的原因。seq值为x+1,ack值为y+1。
之所以使用三次握手协议,是为了避免因网络传输导致的重复TCP连接问题:假设第一次握手发送的请求连接包延迟到达了服务端,如果服务端不向客户端发送确认ACK而直接建立连接,就会虚耗服务器资源。有了第二/三次握手,客户端可以通知服务端连接正式建立或者该次建立连接请求无效。
滑动窗口
当TCP连接建立起来后,协议通过滑动窗口来控制整个TCP流中数据的传输。窗口指的是发送端与接口端同时维护的两个缓冲区。发送端缓冲区保存的是已发送的TCP段,当其确认超时时可以重新发送。接收端缓冲区保存的是已接收到的数据供上层应用程序取用。
TCP通过在确认TCP段的WIN字段告诉发送端当前接收端缓冲区的剩余空间大小,发送端可以根据情况写入合适的数据大小或者直接阻塞等待接收端的进一步信号。
拥塞控制
网络拥塞指的是在一段时间内发送端发送的数据量超出了数据传输链路所能够及时传输的量。为防止拥塞的发生,发送端维护了一个拥塞窗口,该窗口表示的是在一个时间T内,发送端所能发送的TCP段的数量。根据当前网络情况动态地改变该窗口的大小,及时避免拥塞的发生。
TCP协议通过检测丢包信号来判断拥塞的发生。拥塞窗口的初始化阶段通过慢速启动的方式增长到其慢速启动阈值,变为线性增长,一但检测到丢包信号,窗口大小变为当前大小的一半,再次按线性的方式递增,直到再次检测到丢包信号。
总结
TCP协议通过上述算法达成了其在不稳定的网络环境上提供可靠的端到端的网络服务。HTTP等应用层协议才能在TCP的基础上构建起来。