计算机网络:运输层 —— TCP 协议概述与 TCP 报文段首部格式
文章目录
- 基本概念
- 主要特点和功能
- TCP报文段的首部格式
- 字段
- 标志位
- 扩展首部
传输控制协议(Transmission Control Protocol,TCP
)协议是互联网上最常用的传输层协议之一,它负责提供可靠的端到端数据传输服务。TCP
协议采用连接导向的通信方式,通过三次握手建立连接,使用序号和确认机制确保数据的可靠传输。
基本概念
使用 TCP 通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
TCP 为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等。TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。
TCP 协议在许多应用中被广泛使用,特别适用于需要可靠传输的应用如网页浏览、文件传输、电子邮件等。它通过提供可靠的数据传输和连接管理,确保数据的顺序和完整性,为应用层提供了方便、可靠的传输服务。
主要特点和功能
TCP 协议的主要特点和功能包括:
-
可靠传输:TCP 使用序号和确认机制来确保数据的可靠传输。发送方将数据分割成多个数据段,并为每个数据段分配一个序列号。接收方根据序列号确认已接收的数据,并发送确认消息给发送方。如果发送方没有收到确认消息或者数据段丢失,它将重传未确认的数据。
-
流量控制:TCP 使用滑动窗口流量控制机制来控制数据的传输速率。发送方根据接收方的处理能力和网络状况动态调整发送数据的速度,避免数据的丢失和网络拥塞。
-
拥塞控制:TCP 使用拥塞窗口控制机制来避免网络拥塞。当网络出现拥塞时,TCP 通过减小发送方的拥塞窗口大小来减少发送的数据量,从而降低网络负载。
-
连接管理:TCP 通过三次握手建立连接和四次挥手断开连接。三次握手通信过程中,客户端向服务器发送连接请求,服务器确认并回复连接响应,客户端再次确认连接。四次挥手过程中,客户端发送连接断开请求,服务器确认并发送连接断开响应,客户端再次确认连接断开。
-
面向字节流:TCP 以字节流的方式传输数据,没有消息边界,应用层无需关心数据的分割和重组,可以连续地读取和写入字节流。
TCP报文段的首部格式
发送方的TCP把应用进程交付下来的应用报文仅仅看作一连串的,无结构的字节流,TCP并不知道这些待传输的字节流的含义,仅将它们编号并存储在自己的发送缓存中。TCP根据发送策略,从发送缓存中提取一定数量的字节,并给其添加一个首部,使之成为TCP报文段并进行发送。
接收方的TCP,一方面从所接收到的TCP报文段中,取出数据载荷并存储在接收缓存中,另一方面,将接收缓存中的一些字节向上交付给应用进程。
TCP的全部功能需要依靠其首部中的各字段来实现。
字段
-
源端口字段:存储源端口号
-
目的端口字段:存储目的端口号
TCP实现可靠传输的相关字段为以下三个字段:
-
序号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 232−1。当序号增加到最后一个时,下一个序号又回到0。用来指出本TCP报文段数据载荷的第一个字节的序号。
-
确认号字段:占32比特,取值范围0~ 2 32 − 1 2^{32}-1 232−1。当确认号增加到最后一个时,下一个确认号又回到0。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
对已接收且按序到达的最后一个TCP段进行确认
确认号为 n 则表明到序号 n-1 为止的所有数据都已正确接收,期望接收序号为 n 的数据
-
确认标志位ACK:只有当ACK取值为1时,确认号字段才有效。ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后,所有传送的TCP报文段都必须把ACK置1。
- 数据偏移字段:占4比特,该字段的取值以4字节为单位。指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,这实际上指出了TCP报文段的首部长度。
-
保留字段:占6比特,保留为今后使用,目前应置为0
-
窗口字段:占16比特,该字段的取值以字节为单位,指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间大小,这用来表征接收方的接收能力。
在计算机网络中,经常用接收方的接收能力的大小来控制发送方的数据发送量,这就是所谓的流量控制。
-
检验和字段:占16比特,用来检查整个TCP报文段在传输过程中是否出现了误码。
与UDP类似,在计算检验和时,要在TCP报文段的前面,加上12字节的伪首部,伪首部的格式与UDP用户数据报的伪首部一样。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。
TCP首部检验和计算方法与IPv4数据报首部检验和的计算方法类似,差别仅在于IPv4数据报只对首部进行检验,而TCP检验和对整个TCP报文段进行检验。
-
紧急指针字段:占16比特,以字节为单位,用来指明紧急数据的长度。
当发送方有紧急数据时,可将紧急数据“插队”到发送缓存的最前面,并立刻封装到个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
接收方收到紧急标志位为1的TCP报文段,会按照紧急指针字段的值,从报文段数据载中取出紧急数据并直接上交应用进程,而不必在接收缓存中排队。
标志位
-
同步标志位SYN:用于TCP“三报文握手”建立连接
当 SYN=1 且 ACK=0 时,表明这是一个TCP连接请求报文段。对方若同意建立连接,则应在响应的TCP报文段的首部中使 SYN=1 且 ACK=1。
SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段。 -
终止标志位FIN:用于TCP“四报文挥手”释放连接。
当 FIN=1 时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接 -
复位标志位RST:用于复位TCP连接。当RST=1时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立连接。
RST
置1还用来拒绝一个非法的 TCP 报文段或拒绝打开一个TCP连接。 -
推送标志位PSH:发送方 TCP 把
PSH
置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。接收方 TCP 收到
PSH
为 1 的 TCP 报文段,就尽快地交付给应用进程而不再等到接收到足够多的数据才向上交付,出于效率的考虑,TCP 的发送方可能会延迟发送数据,而 TCP 的接收方可能会延迟向应用进程交付数据。这样可以一次处理更多的数据。
但是当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用进程可以通知TCP使用推送(PUSH)操作。
-
紧急标志位URG:当
URG=1
时,紧急指针字段有效。当URG=0
时,紧急指针字段无效。
扩展首部
-
选项字段:长度可变,最大40字节,增加选项可以增加TCP的功能
-
最大报文段长度
MSS
选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段的长度 -
窗口扩大选项:用来扩大窗口,提高吞吐率。
-
时间戳选项:用于计算往返时间
RTT
。也用于处理序号超范围的情况,又称为防止序号绕回PAWS
。 -
选择确认选项:用来实现选择确认功能。
-
-
填充字段:若选项字段的长度加上20字节固定首部的长度,不能被4字节整除时,需要填充相应数量的比特0(因为首部长度字段以4字节为单位),以确保首部长度能被4字节整除,与IPv4数据报首部中的填充字段作用一样。