TCP协议原理

0 阅读8分钟

TCP是什么?

TCP是一种面向连接的、可靠的传输层协议,主要用于在计算机网络中提供可靠的数据传输服务。它确保数据在传输过程中不丢失、不重复、并且按顺序到达。

TCP报文段结构

image.png TCP报文段结构=TCP头部+数据部分。

TCP的三次握手(建立连接)

三次握手的过程

客户端在和服务端建立TCP连接时,会进行三次握手,三次握手的过程如下:

第一次握手: 客户端会向服务端发送一个SYN包,请求建立连接,然后进入SYN_SENT状态

第二次握手: 服务端在收到来自客户端的SYN包后,如果同意建立连接,则会发送一个SYN-ACK报文作为响应给客户端,同时进入SYN_RCVD状态。

第三次握手: 客户端在收到服务端的SYN-ACK报文后,会发送一个ACK报文作为最终响应,之后服务端和客户端都会进入ESTABLISHED状态,表示连接建立成功。

为什么需要三次握手?

通过三次握手,客户端和服务端都能够确认对方的接收和发送能力。第一次握手服务端确认了客户端是能发送数据的,第二次握手客户端确认了服务端是可以收发数据的;第三次握手服务端确认了客户端是可以收到数据的,从而确保了双方的通道都是可用的。

如果只使用两次握手的话,在第一次握手中,如果发生了网络延迟,导致客户端已经断开了网络连接,而服务器在收到SYN包后误以为是新的连接请求,此时直接同意连接,而在此连接上客户端根本就不存在,也就浪费了服务器的内存和端口资源。

还有一个问题就是丢包的问题。我们分几种情况进行讨论,首先就是客户端发给服务器的SYN包丢了该怎么处理?也就是说服务器压根不知道有这个包,客户端等不到SYN-ACK报文,超时后会进行重传SYN,重传几次失败后会断开连接。然后就是服务端发送的SYN-ACK报文丢失了或者客户端回给服务端的ACK报文丢失了,服务器在规定的时间内未收到ACK报文,会进行超时重传,同理是有限次尝试然后放弃。

TCP的四次挥手(断开连接)

四次挥手的过程

四次挥手不分服务端和客户端,分为主动关闭方和被动关闭方。为方便讲述,不妨令客户端为主动关闭方,其过程如下:

第一次挥手: 客户端发送FIN报文给服务端,表示自己要断开连接,报文中会指定一个序列号seq=x。然后,客户端进入FIN-WAIT-1状态。

第二次挥手: 服务端在收到FIN报文之后,回复ACK报文给客户端,确认号ack=x+1,并携带自己的序列号seq=y。然后服务端进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。

第三次挥手: 服务端也要断开连接时,发送FIN报文给客户端,指定序列号seq=u。然后,服务端进入LAST_ACK状态。

第四次挥手: 客户端收到FIN报文后,回复ACK报文进行应答,确认号ack=u+1,并携带自己的序列号seq=v。此时客户端进入TIME_WAIT状态。服务端在收到客户端的ACK报文后进入CLOSE状态。如果客户端等待2MSL没有收到可能存在的重传,则关闭连接。

为什么需要四次挥手?

TCP是全双工通信,数据在两个方向上是独立传输的,关闭连接时,需要分别关闭两个方向上的数据传输,主动关闭方在发送完最后一个ACK后进入TIME_WAIT状态,这是为了确保被动关闭方能够收到最终的ACK,如果被动关闭方没有收到,可以重发FIN报文,主动方可以再次发送ACK。同时等待2MSL(报文最大生存时间)可以保证网络中的旧报文全部丢失,避免影响新的连接。

TCP的可靠传输机制

TCP的可靠传输依赖以下六大机制:

1.序列号: 每个TCP段都有一个序列号,确保数据包的顺序正确。

2.确认应答: 接收方发送ACK,确认收到的数据。如果发送方在一定时间内没有收到确认,会重新发送数据。核心就两步,发送数据,确认数据有没有收到,未收到就重发。

3.超时重传: 发送方设置一个定时器,如果在定时器超时之前没有收到确认,发送方会重传数据。

4.数据校验: 数据在发送之前,会进行校验和的计算,用来检测传输过程中是否出现错误。如果接收方对数据计算后不等于校验和,则说明数据发送错误,会直接丢弃该数据包,等待重传。不过如果数据和校验和同时错误,且计算后相等,错误就会被掩盖,不过这个几率非常小可以忽略不计。

5.流量控制: TCP通过滑动窗口机制进行流量控制,确保接收方能够处理发送方的数据量。

6.拥塞控制: TCP通过算法如慢启动拥塞避免快重传快恢复等来控制数据发送的速率,防止网络拥塞。

TCP流量控制

流量控制就是让发送方发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实现流量控制,主要方法就是动态调整发送方和接收方之间的数据传输速率。

  • 滑动窗口大小: 在TCP通信中,每个报文都携带窗口字段,表示接收方当前允许发送方发送的最大字节数。
  • 接收方窗口大小: 接收方通过TCP报文中的窗口字段告诉发送方自己当前可接收窗口的大小,表示接收方缓冲区中还有多少可用空间。
  • 流量控制的目标: 流量控制的目标是确保发送方不要发送超过接收方缓冲区容量的数据。如果接收方的缓冲区快满了,它会减少窗口大小,通知发送方暂停发送,以防止溢出。
  • 动态调整: 发送方会根据接收方窗口的大小动态调整发送数据的速率。如果接收方的窗口大小增加,发送方可以加速发送数据,如果窗口大小减小,发送方将减缓发送数据的速率。
  • 确认机制: 发送方可以连续发送数据,不必发送一段就等待ACK,接收方按照序列号将数据存入缓存,只对连续、正确的数据回复ACK。如果出现丢包或错误,发送方会因超时未收到ACK,自动重传对应数据。这与流量控制密切相关,因为接收方可以通过ACK报文中的窗口字段告知发送方它当前窗口的大小。

TCP拥塞控制

TCP拥塞控制可以在网络出现拥塞时动态调整数据传输的速率,以防止网络过载。TCP拥塞控制的主要机制主要包括以下几个方面:

  • 慢启动: 初始阶段,TCP发送方会以较小的发送窗口开始传输数据。随着每次成功收到确认的数据,发送方会逐渐增加发送窗口的大小,实现指数级的增长,这称为慢启动。这有助于网络在刚开始传输时逐步增加速率,以避免引发拥塞。
  • 拥塞避免: 一旦达到慢启动阈值,TCP发送方就会进入拥塞避免阶段。在拥塞避免阶段,发送方以线性增加的方式增加发送窗口的大小,而不再是指数级增长。这有助于控制发送速率,以便引起网络拥塞。
  • 快重传: 如果发送方连续收到相同的ACK确认,他会认为发生了数据包的丢失,并会快速重传未确认的数据包,而不必等待超时。这有助于更快地恢复由拥塞引起的数据包丢失。
  • 快恢复: 再发生快速重传后,TCP进入快速恢复阶段。在这个阶段,发送方不会回到慢启动阶段,而是将慢启动阈值设置为当前窗口的一半,并将拥塞窗口大小设置为慢启动阈值加上已确认但未被快速快速重传的数据块的数量。这有助于更快地从拥塞中恢复。