连接管理
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发送出去。TCP与此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端。) 。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。
可以使用TCP首部用于控制的字段来管理TCP连接(也叫控制域。更多细节请参考6.7节。) 。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(建立一个TCP连接需要发送3个包。这个过程也称作“三次握手”。) 。
下面是TCP连接管理的主要过程:
1.建立连接(Three-Way Handshake):在发送方准备发送数据之前,需要先建立TCP连接。这是通过一个称为三次握手的过程完成的。发送方首先发送一个带有SYN(同步)标志的TCP报文段给接收方,表明它想要建立连接。接收方收到后,回复一个带有SYN/ACK(同步/确认)标志的报文段作为响应,表示同意建立连接。最后,发送方再回复一个带有ACK(确认)标志的报文段,确认接收方的响应。这样,连接就建立起来了。
2.数据传输:一旦连接建立,发送方可以开始向接收方发送数据。数据被分割成TCP报文段,并通过连接传输。TCP使用序列号来保证数据的有序传输,并使用确认号来确认已经接收到的数据。
3.连接维护与超时重传:TCP连接的维护涉及到保持连接状态以及处理可能出现的错误情况。每个TCP报文段都会包含一个序列号和确认号。发送方发送数据后,会启动一个计时器,在一定时间内等待接收方的确认。如果确认没有及时到达,发送方会认为数据丢失,并重新发送这些数据。
4.关闭连接(Four-Way Handshake):当数据传输完成或者需要终止连接时,发送方和接收方需要进行连接的关闭。关闭连接需要一个称为四次握手(Four-Way Handshake)的过程。发送方首先发送一个带有FIN(结束)标志的报文段给接收方,表示它希望关闭连接。接收方收到后,回复一个带有ACK标志的报文段作为确认。然后,接收方也发送一个带有FIN标志的报文段给发送方,表示它也希望关闭连接。最后,发送方回复一个带有ACK标志的报文段,确认接收方的关闭请求。这样,连接就被双方关闭了。
TCP以段为单位发送数据
在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS:Maximum Segment Size)。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。
TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。
MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小(为附加MSS选项,TCP首部将不再是20字节,而是4字节的整数倍。如下图所示的+4。) 。然后会在两者之间选择一个较小的值投入使用(在建立连接时,如果某一方的MSS选项被省略,可以选为IP包的长度不超过576字节的值(IP首部20字节,TCP首部20字节,MSS 536字节)。) 。
在TCP传输过程中,数据被分割成称为TCP段(TCP segment)的较小单元进行传输。
TCP段是由TCP协议在传输层封装的数据单元,它包含了TCP报文头和数据部分。TCP报文头中包含了一些控制信息,如源端口号、目标端口号、序列号、确认号、窗口大小等。数据部分则是要传输的有效载荷数据。
由于网络中的数据传输可能会面临不同的限制,如带宽限制、MTU(Maximum Transmission Unit)限制等,因此TCP需要将数据分割成适合网络传输的段大小。每个TCP段都会带有序列号,用于保证数据的有序传输和重组。
接收方在接收到TCP段后,会根据序列号进行重组,并向发送方发送确认(ACK)信息,表示已经接收到了哪个序列号之前的所有数据。如果发送方没有收到确认信息,它会根据超时重传机制重新发送相应的段。
通过将数据分割成段的方式,TCP能够适应不同网络条件下的数据传输,并保证数据的可靠性和有序性。这是TCP协议在互联网中广泛应用的重要原因之一。