一、定义
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP旨在适应支持多网络应用的分层协议层次结构。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。因此,TCP协议的出现,解决了这一问题。
二、TCP协议报文格式
TCP协议报文格式主要包括以下几个部分:
1. 源/目的端口号:
表示数据是从哪个进程来,到哪个进程去。
2. 4位TCP报头长度:
表示该TCP头部有多少个32位bit(有多少个4字节)。TCP头部最大长度是15(2的5次方-1)*4=60字节,即选项内容最多40字节。
3. 6位标志位:
• URG:紧急指针是否有效。
• ACK:确认号是否有效。
• PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走。
• RST:对方要求重新建立连接;携带RST标识的称为复位报文。
• SYN:请求建立连接,携带SYN标识的称为同步报文段。
• FIN:通知对方,本端要关闭了,携带FIN标识的为结束报文。
4. 16位校验和:
发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部。
5. 16位紧急指针:
标识哪部分数据是紧急数据。当紧急指针置为1,操作系统会优先读取该报文,再读取紧急指针找到紧急数据。
6. 16位窗口大小:
表示当前接受数据的剩余空间。
此外,TCP协议报文格式还包括32位序号和32位确认序号,用于确认应答机制。
三、TCP协议特点
TCP协议具有以下几个主要特点:
1. 面向连接:
TCP是一种面向连接的协议,通信双方在传输数据之前需要先建立连接,然后再进行数据的传输。这种连接方式保证了数据传输的可靠性和顺序性。
2. 可靠传输:
TCP提供可靠的数据传输,通过序列号、确认应答和重传机制来确保数据的完整性和顺序性。如果数据包在传输过程中丢失或损坏,TCP会负责重新发送。
3. 流控制:
TCP使用流控制机制来防止发送方发送速度过快,确保接收方能够处理并消化数据。这通过滑动窗口机制来实现。
4. 拥塞控制:
TCP具有拥塞控制机制,用于适应网络的拥塞情况,防止过多的数据注入网络导致性能下降。
5. 面向字节流:
TCP将传输的数据视为字节流,而不是像UDP那样按照消息边界进行划分。这意味着发送方传输的数据流和接收方接收的数据流是连续的。
6. 全双工通信:
TCP连接是全双工的,允许双方在同一时间既能发送数据又能接收数据。
四、TCP协议工作机制
1. 确认应答(ACK)机制
当客户端传输报文时,为了保证报文被服务端收到,需要服务端进行回应。确认应答机制就是这个原理,即收到请回复。32位序号用来标识发送报文的序号,确认序号则是在收到报文为了进行应答,将收到32号序号+1组成确认序号发生给对方进行应答。即32位确认序号=收到的32报文序号+1,用来表示确认序号之前的报文都收到了。
2. 捎带应答
当客户端给服务端发送报文后,服务端需要对发送的报文进行应答,如果在同时服务端也需要发送报文,那么应答和报文就会一起发送,称为捎带应答。例如,你和室友聊天,你问室友:"你吃了吗?"室友回复:"吃了,你作业写了吗?"这段对话中,室友的回复包含了应答,同时也传输了信息,就是捎带应答。
3. 连接管理机制
TCP连接管理主要包括三次握手建立连接和四次挥手断开连接。
(1)三次握手建立连接
以客户端主动发起连接为例,三次握手的过程如下:
• 第一次握手:客户端调用connect,发送同步报文段(SYN),进入SYN_SENT状态。
• 第二次握手:服务端监听到连接请求(同步报文段),将该连接放入内核等待队列中,并向客户端发送SYN确认报文和ACK确认报文,进入SYN_RCVD状态。
• 第三次握手:客户端收到服务端的确认报文,进入ESTABLISHED状态,开始读写数据。服务端收到客户端的确认报文,也进入ESTABLISHED状态,可以进行读写数据。
三次握手的原因:双方通过两次SYN报文的发送,可以保证全双工通信信道的畅通,同时双方会交换彼此的窗口大小和滑动窗口的头指针位置。三次握手中的最后一次ACK应答的可靠性是无法保证的,如果服务端没有收到客户端的ACK应答,则服务端内核将不会浪费资源构建连接相关的结构体,但是客户端在发送ACK应答后(无论ACK应答是否被对方收到),便默认连接建立成功。这种设计的意义在于连接建立失败的资源消耗成本由客户端来承担,从而减小服务器的负担。
(2)四次挥手断开连接
以客户端主动发起断开连接为例,四次挥手的过程如下:
• 第一次挥手:客户端主动调用close,向服务器发送结束报文段(FIN),同时进入FIN_WAIT_1状态。
• 第二次挥手:服务端收到客户端的结束报文段,返回确认报文段(ACK),进入CLOSE_WAIT状态。客户端收到服务端的确认报文段,进入FIN_WAIT_2状态,开始等待服务端的结束报文段。
• 第三次挥手:服务端准备关闭连接(需要处理完之前的数据),调用close关闭连接,向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)。
• 第四次挥手:客户端收到服务端的FIN,发出确认报文段(ACK),进入TIME_WAIT状态。服务端收到对FIN的ACK,彻底关闭连接。客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态。
TIME_WAIT状态主要是为了等待一些在网络中或者其他地方已经发送但是还没有到达的数据。如果不进行等待,当重新进行连接时,这些数据到达会引起混乱。
4. 滑动窗口
TCP使用滑动窗口机制来实现流控制,防止发送方发送速度过快,确保接收方能够处理并消化数据。滑动窗口的大小表示接收方当前接受数据的剩余空间。发送方在发送数据时,会根据接收方的窗口大小来调整自己的发送速度。当接收方的窗口大小变为0时,发送方会停止发送数据,直到接收方发送窗口更新报文,告知发送方自己的接收能力恢复。
5. 快重传
快重传是一种改进的TCP重传机制。当接收方收到一个失序的报文段时,会立即发送一个重复确认报文(即重复上一个报文段的确认序号),而不是等待超时后再发送。发送方收到连续三个或三个以上的重复确认报文时,会认为下一个报文段丢失了,立即进行重传,而不需要等待超时。这样可以减少数据传输的延迟,提高传输效率。
6. 拥塞控制
TCP具有拥塞控制机制,用于适应网络的拥塞情况,防止过多的数据注入网络导致性能下降。拥塞控制主要包括慢启动、拥塞避免、快重传和快恢复四个阶段。
• 慢启动:在连接建立初期,发送方会以一个较小的初始窗口大小开始发送数据,并逐渐增大窗口大小,直到达到一个预设的阈值或发生网络拥塞。
• 拥塞避免:当发送方的窗口大小达到阈值后,发送方会进入拥塞避免阶段,此时窗口大小的增长速度会减慢,以避免网络拥塞的发生。
• 快重传:如上所述,当接收方收到连续三个或三个以上的重复确认报文时,会认为下一个报文段丢失了,立即通知发送方进行重传。
• 快恢复:当发送方收到快重传的通知后,会立即进行重传,并将窗口大小减半(但不小于慢启动的初始窗口大小),然后重新进入拥塞避免阶段。这样可以更快地恢复数据传输的效率。
五、TCP协议应用示例
TCP协议在计算机网络中具有广泛的应用,以下是一些具体的应用示例:
1. Web浏览
HTTP协议使用TCP作为传输层协议,确保可靠的数据传输,适用于Web页面的加载和数据传输。当用户访问一个网页时,浏览器会向服务器发送HTTP请求,服务器接收到请求后,会将网页内容封装在HTTP响应中发送给浏览器。这个过程中,TCP协议负责保证数据的可靠传输和顺序性。
2. 电子邮件
SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol)等电子邮件协议使用TCP进行邮件的传输和接收。当用户发送一封电子邮件时,邮件客户端会向邮件服务器发送SMTP请求
总结
TCP(传输控制协议)是一种面向连接、可靠的传输层协议,由IETF定义,用于解决IP层不提供可靠流机制的问题。TCP报文格式包括源/目的端口号、报头长度、标志位、校验和、紧急指针、窗口大小等部分,通过序列号和确认序号实现确认应答机制。TCP具有面向连接、可靠传输、流控制、拥塞控制等特点,使用滑动窗口、快重传等机制提高传输效率。其工作机制包括三次握手建立连接、四次挥手断开连接等过程。TCP在Web浏览、电子邮件、文件传输等应用场景中发挥着重要作用,保证了数据的可靠传输和顺序性。