关于tcp:深入理解TCP解答这10个关键问题

6次阅读

共计 4094 个字符,预计需要花费 11 分钟才能阅读完成。

TCP 介绍

TCP(Transmission Control Protocol,传输控制协议)是一种面向连贯、牢靠的传输层协定,它提供了数据传输的可靠性,保障了数据传输的有序性和完整性。具备一下特点:

  1. 可靠性:TCP 保障数据传输的可靠性,确保数据可能精确地达到接管方,并且可能依照发送方发送的程序进行重组。
  2. 面向连贯:TCP 在传输数据前须要先建设连贯,数据传输结束后再断开连接,这种形式能够保证数据的可靠性。
  3. 面向字节流:TCP 把传输的数据看成一个间断的字节流,而不是数据块,这样可能更好地控制传输过程。
  4. 拥塞管制:TCP 可能依据网络拥塞的水平来调整发送速率,防止网络拥塞而导致数据失落或提早。
  5. 全双工通信:TCP 容许发送方和接管方同时进行数据传输,这样能够进步数据传输的效率。

TCP 连贯为什么须要三次握手?

TCP 连贯建设须要三次握手的起因是确保单方都认可对方的初始序列号并且建设起牢靠的通信信道。具体来说,三次握手的步骤如下:

  1. 客户端发送 SYN 包给服务器,示意客户端申请建设连贯,并随机生成一个初始序列号 seq。此时客户端处于 SYN_SEND 状态。
  2. 服务器收到 SYN 包后,回复 ACK 包和 SYN 包给客户端,ACK 包确认收到客户端的 SYN 包,SYN 包示意服务器批准建设连贯,并且服务器也随机生成一个初始序列号 seq+1。此时服务器处于 SYN_RECEIVED 状态。
  3. 客户端收到服务器的 ACK 包和 SYN 包后,回复 ACK 包给服务器,ACK 包确认收到服务器的 SYN 包,此时客户端和服务器均建设起了连贯,并能够进行数据传输。此时客户端处于 ESTABLISHED 状态。

三次握手的过程中,客户端和服务器都能够确保对方认可了本人的初始序列号,并建设起了牢靠的连贯。同时,三次握手也能够避免因为提早的 ACK 导致的谬误连贯,以及避免因为旧的连贯申请信息反复发送而导致的谬误连贯。因而,TCP 连贯建设须要三次握手来确保连贯的可靠性。

TCP 协定如何保障可靠性?

TCP 协定通过序列号和确认应答、超时重传、流量管制和拥塞管制等机制来保障传输的可靠性。

  1. 序列号和确认应答:每个 TCP 报文段都蕴含一个序列号,用于批示发送方发送的数据的字节流中的地位。接管方收到 TCP 报文段后会发送确认应答,通知发送方收到了哪个序列号之前的数据。如果发送方没有收到确认应答,它就会重传这些数据。
  2. 超时重传:如果发送方没有在肯定工夫内收到确认应答,就会认为数据包失落了,并且会从新发送这些数据。
  3. 流量管制:接管方能够通过 TCP 窗口大小来通知发送方能够发送多少数据。这个窗口大小会依据接管方的可用缓冲区大小动静调整,以避免接管方的缓冲区溢出。
  4. 拥塞管制:TCP 应用拥塞窗口来管制网络中的拥塞水平。如果网络拥塞,发送方会升高拥塞窗口的大小,以缩小发送的数据量,从而加重网络拥塞。

TCP 连贯如何放弃沉闷状态?

TCP 连贯的放弃沉闷状态通常有两种形式:

  1. TCP keepalive 机制:TCP keepalive 机制是一种放弃 TCP 连贯状态的办法。当一段时间内没有数据传输时,TCP keepalive 会向对端发送一个探测包。如果对端收到了探测包,则会回复一个确认包,证实连贯依然存在。如果对端没有回复,则会在肯定工夫内重试探测,若重试屡次后依然没有回复,则会认为连贯曾经断开。TCP keepalive 的默认设置是 2 小时。
  2. 应用层心跳包:应用层心跳包是一种应用层协定,用于放弃 TCP 连贯状态。应用层心跳包是由应用程序发送的一个小的数据包,用于通知对端连贯依然存在。个别状况下,应用层心跳包的发送频率会比 TCP keepalive 要高一些,能够依据具体的业务需要进行调整。

这两种形式都能够放弃 TCP 连贯状态,然而 TCP keepalive 机制是在 TCP 协定层面实现的,而应用层心跳包则须要应用程序本人实现。

什么是 TCP 窗口大小?

TCP 窗口大小指的是接收端主机能够接管的数据量大小。在 TCP 连贯建设时,单方会替换窗口大小信息,以便发送方发送适宜接管方的数据量,避免发送方发送过多的数据导致接管方无奈及时处理而失落数据或呈现阻塞。

TCP 窗口大小的单位是字节(byte),通常是由接收端主机来设置和管制。接收端主机通过设置窗口大小来通知发送端主机,本人能够接管多少数据,发送端主机在发送数据时就不会超过这个窗口大小,以确保数据可能被接收端主机及时处理和接管。

TCP 窗口大小的优化能够通过调整零碎参数、硬件优化以及网络拓扑构造等形式来实现,从而进步 TCP 连贯的传输效率和稳定性。

TCP 协定的流量管制是如何实现的?

TCP 协定的流量管制是通过窗口机制实现的。每个 TCP 连贯都会有一个发送窗口和一个接管窗口,它们管制着数据的流动。

发送窗口:发送方通过发送窗口的大小通知接管方本人还能够发送多少数据。发送窗口的大小由接管方动静调整,取决于接管方的可用缓存空间和网络情况。

接管窗口:接管方通过接管窗口的大小通知发送方本人还能接管多少数据。接管窗口的大小由发送方动静调整,取决于发送方的发送速率和网络情况。

通过这种窗口机制,TCP 协定能够在不失落数据的前提下控制数据的流动速度,避免发送方发送过多数据导致接管方无奈及时处理,从而实现流量管制。

TCP 拥塞管制的机制是什么?

TCP 拥塞管制是一种管制网络拥塞的机制,它通过调整发送方的数据发送速率和接管方的数据接管速率来防止网络拥塞和网络解体。TCP 拥塞管制的次要机制有以下几个:

  1. 慢启动:在开始时,TCP 发送方会以指数级别递增数据的发送速率,直到达到网络的最大容量。
  2. 拥塞防止:一旦发送方确定了网络的最大容量,就会以线性增长的形式逐渐减少数据的发送速率,直到呈现拥塞。
  3. 快重传:当 TCP 发送方接管到一个反复的 ACK(确认),示意有些数据曾经达到接管方,它将立刻从新发送最近发送的没有确认的数据段,而不是期待超时重传计时器超时。
  4. 快复原:在接管到反复的 ACK 时,TCP 发送方会缩小数据发送速率,并立刻发送曾经确认的但还未发送的数据,以便更快地复原数据的发送速率。
  5. 拥塞超时:如果发送方没有在指定工夫内收到 ACK 确认,则假设数据包曾经失落并重传数据,同时将数据发送速率减半。

这些机制组合起来,能够无效地管制 TCP 连贯的数据发送速率,从而防止网络拥塞和解体。

如何实现 TCP 多路复用?

TCP 多路复用指的是在一个 TCP 连贯中同时发送和接管多个数据流,它能够显著进步网络通信的效率和吞吐量。在 TCP 多路复用中,能够应用以下两种形式来实现:

  1. 应用多线程或多过程:每个线程或过程解决一个数据流,通过对不同的数据流进行解决,从而实现多路复用。
  2. 应用 select、poll 或 epoll 等 I / O 多路复用机制:在应用这种机制的时候,应用程序只须要在一个过程中创立一个 TCP 连贯,而后应用 I / O 多路复用机制来同时监听多个数据流的 I / O 事件,从而达到多路复用的成果。

应用 I / O 多路复用机制的形式能够更好地利用系统资源,防止了多线程或多过程的上下文切换开销,同时也缩小了代码的复杂性。因而,在实现 TCP 多路复用时,倡议应用 I / O 多路复用机制来实现。

TCP 传输中呈现超时或提早,如何解决?

TCP 传输中呈现超时或提早,能够通过以下形式进行解决:

  1. 调整超时工夫:TCP 协定中有一个超时重传机制,当数据包发送后肯定工夫内没有收到 ACK 确认,就会进行重传。能够通过调整超时工夫来优化网络提早,比方减小超时工夫能够使数据包更快地被重传,放慢数据传输速度。
  2. 应用疾速重传:疾速重传是指当发送方间断接管到 3 个反复的 ACK 确认时,就能够认为数据包曾经失落,立刻进行重传,而不用期待超时重传。这能够减小重传的延迟时间,进步数据传输速度。
  3. 减少拥塞窗口:当网络拥塞时,能够通过减少拥塞窗口来进步网络吞吐量。拥塞窗口是指在一个 RTT(Round Trip Time,往返工夫)内容许发送的数据量,能够依据网络拥塞水平动静调整。
  4. 查看网络链路:有时超时和提早是由网络链路问题导致的,能够通过查看网络链路状态,排查故障并解决问题。
  5. 应用更疾速的传输协定:如果 TCP 协定无奈满足需要,能够思考应用更疾速的传输协定,如 UDP 或 QUIC。这些协定不仅能够提供更快的传输速度,还具备更好的适应性和鲁棒性,可能适应不同的网络环境和传输需要。

什么是 TCP 协定中的 TIME_WAIT 状态?它的作用是什么?

TCP 协定中的 TIME_WAIT 状态指的是 TCP 连贯敞开后,期待 2 倍的 MSL 工夫(Maximum Segment Lifetime,最大分段生存工夫)后才会敞开的状态。MSL 是指一个 TCP 分段在网络中最长的生存工夫,通常为 2 分钟。

TIME_WAIT 状态的作用是确保网络中所有的分段都曾经被接管并且被正确处理。在 TCP 连贯敞开后,可能还会有一些未达到的分段存在于网络中,这些分段可能会在敞开连贯之后达到,如果不期待这些分段达到并被正确处理,可能会导致后续的连贯呈现问题,因而 TCP 协定会通过 TIME_WAIT 状态来期待这些分段的达到和解决。

此外,TIME_WAIT 状态还能够避免旧的连贯申请被误认为是新连贯的申请,从而确保连贯的安全性和可靠性。

如何在 Linux 零碎中查看 TCP 连贯状态?

在 Linux 零碎中,能够应用 netstatss 命令查看 TCP 连贯状态。

应用 netstat 命令:

perlCopy code
netstat -ant | grep ESTABLISHED

该命令能够列出所有已建设的 TCP 连贯,其中 -a 选项示意显示所有连贯,包含已建设、正在期待和曾经敞开的连贯;-n 选项示意以数字模式显示 IP 地址和端口号;-t 选项示意只显示 TCP 连贯;grep ESTABLISHED 示意只显示已建设的连贯。

应用 ss 命令:

perlCopy code
ss -ant | grep ESTAB

该命令与 netstat 相似,其中 -a 选项示意显示所有连贯,包含已建设、正在期待和曾经敞开的连贯;-n 选项示意以数字模式显示 IP 地址和端口号;-t 选项示意只显示 TCP 连贯;grep ESTAB 示意只显示已建设的连贯。

另外,还能够应用 tcpdump 命令捕捉和剖析 TCP 数据包,以进一步理解 TCP 连贯状态和传输状况。

正文完
 0