传输控制协议(TCP)是TCP/IP体系中面向连接的运输层协议,它提供全双工的和可靠交付的服务。TCP与UDP最大的区别就是,TCP是面向连接的,而UDP是无连接的。TCP比UDP要复杂得多,除了具有面向连接和可靠传输的特性外,TCP还在运输层使用了流量控制和拥塞控制机制。
1. TCP的主要特点
TCP是TCP/IP体系中非常复杂的一个协议。下面介绍TCP最主要的几个特点。
(1)面向连接
TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP传送数据之前,必须先建立TCP连接。建立连接的目的是让通信双方为接下来的数据传送做好准备,初始化各种状态变量,分配缓存等资源。在传送数据完毕后,必须释放已建立的TCP连接,即释放相应的资源和变量。这个过程与打电话类似:通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2)点对点的连接
每一条TCP连接只能有两个端点,即每一条TCP连接只能是点对点的(一对一)。TCP连接唯一地被通信两端的端点所确定,而每个端点由二元组(IP地址,端口号)唯一标识,即一条TCP连接由两个套接字(Socket)地址标识。
(3)提供可靠交付
TCP提供可靠交付的服务。这就是说,通过TCP连接传送的数据无差错、不丢失、不重复,并且按序到达。
(4)全双工通信
TCP提供全双工通信,允许通信双方的应用进程在任何时候发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
(5)面向字节流
TCP中的“流”(Stream)指的是流入进程或从进程流出的字节序列。 “面向字节流”的含义是,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成一连串的无结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小。
2. TCP报文段的发送
图5-7是TCP发送报文段的示意图。发送方的应用进程按照自己产生数据的规律,不断地把数据块(其长短可能各异)陆续写入TCP的发送缓存。TCP再从发送缓存中取出一定数量的数据,将其组成TCP报文段(Segment)逐个传送给IP层,然后发送出去。
需要注意的是,图5-7中的TCP连接是一条虚连接,而不是一条物理连接。TCP连接是一种抽象的逻辑连接。这个概念非常重要,一定要逐步地深入理解。
3. TCP报文段的格式
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。TCP报文段分为首部和数据部分,而TCP的全部功能都体现在它首部中各字段的作用。图5-8是TCP报文段及其首部的格式:
(1)源端口和目的端口:各占2字节。与UDP用户数据报一样,该字段定义了在主机中发送和接收该报文段的应用程序的端口号,用于运输层的复用和分用。
(2)序号:占4字节。序号从0开始,到232-1为止,共232(即4294967296)个序号。TCP是面向数据流的。TCP传送的报文段可看成连续的数据流。在一个TCP连接中传送的数据流中的每一个字节都按顺序编号。
(3)确认号:占4字节,是期望收到的对方下一个报文段的第一个数据字节的序号。TCP提供的是双向通信,一端在发送数据的同时对接收到的对端数据进行确认。
(4)数据偏移:占4位,它指出TCP报文段的数据部分起始处距离TCP报文段的起始处有多远。这实际上就是TCP报文段首部的长度。
(5)保留:占6位,保留为今后使用,但目前应置为0。
(6)URG(紧急指针) :URG=1表明紧急指针字段有效。它告诉接收方TCP此报文段中有紧急数据,应尽快交付应用程序(相当于高优先级的数据)。
(7)ACK:只有当ACK=1时确认号字段才有效;当ACK=0时,确认号字段无效。
(8)PSH(推送) :出于效率的考虑,TCP可能会延迟发送数据或向应用程序延迟交付数据。
(9)RST(复位) :RST=1表明TCP连接中出现严重差错,必须释放连接,然后重新建立运输连接。
(10)SYN(同步) :用来建立一个连接。SYN=1而ACK=0,表明这是一个连接请求报文段。
(11)FIN(终止) :用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,要求释放运输连接。
(12)窗口:占2字节。窗口值指示该报文段发送方的接收窗口大小,用来控制对方发送的数据量。
(13)检验和:占2字节。检验和字段检验的范围包括首部和数据部分。
(14)选项:长度可变。这里我们只介绍一种选项字段,即最大报文段长度(MSS)。
4. 总结
通过本文,您应该对TCP协议的基础概念、主要特点、报文段发送和报文段格式有了一个清晰的了解。希望这些内容能帮助基础小白快速掌握TCP协议的核心知识,为进一步深入学习打下坚实基础。
图文来源:《计算机网络教程》第六版微课版