TCP协议详解

本文介绍了TCP协议,它是面向连接、可靠的传输层协议。阐述了其特点,如可靠性、有序性等,说明了报文格式、连接建立与断开过程。还介绍了基于TCP的应用层协议、端口号,以及TCP保证可靠性、实现拥塞控制的方法,对比了长连接和短连接。

概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,它负责在网络上可靠地传输数据。

  1. 面向连接:TCP 是一种面向连接的协议,这意味着在通信之前,发送方和接收方必须在彼此之间建立一个连接。连接的建立包括三次握手过程,确保双方都已准备好进行数据传输。
  2. 可靠性:TCP 提供了可靠的数据传输机制,确保数据按顺序、完整地传输到目的地。它使用序列号和确认应答机制来跟踪每个发送的数据段,并且在出现丢失、重复、损坏或乱序的情况下进行处理。
  3. 流量控制:TCP 使用滑动窗口机制来进行流量控制,确保发送方不会以过快的速度向接收方发送数据,避免发生数据丢失或网络拥塞。接收方可以通过调整窗口大小来告知发送方自己的接收能力。
  4. 拥塞控制:TCP 使用拥塞控制算法来避免网络拥塞并提高网络性能。通过检测网络拥塞的迹象,TCP 可以动态调整发送速率,以减少数据丢失和传输延迟。
  5. 面向字节流:TCP 是基于字节流的传输协议,这意味着它不会将数据分割为固定大小的数据包,而是将数据视为连续的字节流。接收方需要根据应用层协议的要求来拆分数据并进行处理。
  6. 全双工通信:TCP 支持全双工通信,即双方可以同时进行数据传输和接收,从而实现了双向的数据交换。
  7. 数据传输方式:TCP 使用面向连接的方式传输数据,这意味着在通信结束时,需要显式地释放连接,以释放资源。在连接建立期间,TCP 使用可靠的三次握手来确保通信双方都准备好进行数据传输。
    总的来说,TCP 协议是一种可靠的、面向连接的传输层协议,它通过提供数据的可靠传输、流量控制、拥塞控制等功能,为应用层提供了高效、可靠的数据传输服务。TCP 在互联网通信中扮演着重要的角色,被广泛应用于各种网络应用中。
    TCP协议是一种可靠的,基于字节流的,面向连接的传输层双工协议。它有以下三个特征:
    1、通信双方的数据传输是稳定的,即便是在网络不好的情况下,也能够保证数据传输到目标端。
    2、TCP通信双方的数据包传输是通过字节流来实现传输的
    3、数据传输之前,必须要建立一个连接,然后基于这个连接进行数据传输

TCP 的特点

可靠性:TCP 使用确认和重传机制来确保数据的可靠传输。接收方会向发送方发送确认消息,告知数据已经接收到,如果发送方没有收到确认,将会重传数据。
有序性:TCP 保持发送数据的顺序,接收方按照发送方发送的顺序进行重组,保证数据的有序性。
流量控制:TCP 使用滑动窗口机制进行流量控制,通过调整窗口大小来控制发送方发送数据的速率,确保接收方能够处理接收的数据。
拥塞控制:TCP 使用拥塞窗口机制来控制数据的发送速率,当网络拥塞时,TCP 会减小发送窗口的大小以降低网络负载。
面向连接:TCP 在通信之前需要建立连接,数据传输完毕后需要断开连接。连接的建立和断开需要经过三次握手和四次挥手的过程。

TCP 报文格式

TCP 报文由报头和数据部分组成,报头包含了多个字段,用于控制和管理数据传输的各个方面,例如源端口、目标端口、序列号、确认号、窗口大小等。
TCP 的连接建立和断开过程
○ 连接建立:TCP 连接的建立需要进行三次握手,即发送方发送 SYN(同步)报文,接收方返回 SYN+ACK 报文,最后发送方返回 ACK 报文。这个过程用于确保双方都能够正常通信。
○ 连接断开:TCP 连接的断开需要进行四次挥手,即发送方发送 FIN 报文,接收方返回 ACK 报文,然后接收方发送 FIN 报文,最后发送方返回 ACK 报文。这个过程用于逐步关闭连接。

TCP 的应用

○ Web 浏览器和服务器之间的 HTTP 通信基于 TCP 协议。
○ 电子邮件传输使用 TCP 协议。
○ 文件传输协议(FTP)也使用 TCP 协议。
○ 远程登录协议(SSH)使用 TCP 协议。
TCP 是一种可靠的、面向连接的传输层协议,用于在网络中保障数据传输的可靠性。它提供了有序传输、流量控制、拥塞控制等功能,确保数据的完整性和可靠性。
可靠性。TCP 在众多应用中被广泛使用,成为构建可靠通信的基础。

基于TCP的应用层协议

● HTTP
● HTTPS
● SSH
● Telnet
● FTP
● SMTP
也包括自己写TCP程序时自定义的应用层协议

端口号

● 端口号用来识别同一台主机中进行通信的不同应用程序
● 传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输
● IP 地址 + 端口号 + 协议来唯一识别一个应用程序,也就是不同的协议可以使用相同的端口
● 知名端口号:分布在 0~1023 之间,例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的
● 端口号在 1024~49151 之间,这些端口号可以用于任何的通信用途
● 一般情况下服务器需要确认端口号,但是客户端在连接服务端时完全不用用户自己指定,由操作系统动态分配 49152~65535 之间的端口号

TCP 如何保证可靠性

首先,TCP 的连接是基于三次握手,而断开则是四次挥手。确保连接和断开的可靠性。
其次,TCP 的可靠性,还体现在有状态;TCP 通过校验和、ACK 应答、超时重传来记录哪些数据发送了,哪些数据被接受了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。
再次,TCP 的可靠性,还体现在可控制。通过流量控制(滑动窗口)和拥塞控制来控制发送方发送速率。
TCP协议是传输层的协议。
是面向连接的
是可靠的
全双工通信
每一条TCP连接只能是点对点。也就是一对一。
1.TCP是面向连接的传输层的协议(物理层-数据链路层-网络层-传输层-会话层-应用层)。
也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。数据传输完毕以后,必须释放已经建立的TCP的连接
2.每一条TCP连接必须是(一对一)的
3.TCP提供可靠交付的服务。通过TCP连接传输的数据,不丢失、不重复、无差错,并且按需到达。
4.TCP提供全双工通信。TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据存入缓存,上层的应用程序在合适的时候读取缓存中的数据。
5.面向字节流。TCP中“流(Stream)”指的是流入到进程或从进程流出的字节序列。
面向字节流的含义是:虽然应用程序和TCP的交互式一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,具有以下原因保障其可靠性:

  1. 重传机制:TCP使用了基于确认和重传的机制来确保数据的可靠传输。当发送方发送数据后,会等待接收方的确认消息,如果在超时时间内未收到确认,则发送方会重新发送数据。
  2. 序列号与确认:发送方会给每个发送的数据包分配一个序列号,并在数据包的首部包含接收方期望收到的下一个序列号。接收方收到数据包后,会发送确认消息,其中包含期望收到的下一个序列号,以此告知发送方数据已经成功接收。
  3. 滑动窗口:TCP使用滑动窗口机制进行流量控制和拥塞控制。通过动态调整窗口大小,发送方和接收方可以根据网络状况进行调节,确保发送速率和接收处理能力的平衡。
  4. 检验和:TCP在每个数据包的首部添加检验和字段,用于检测数据是否出现错误。接收方在接收到数据包后会计算检验和,与发送方发送的检验和进行比较,以判断数据是否被篡改。
  5. 流量控制:TCP使用滑动窗口机制来进行流量控制,防止发送方发送过多的数据导致接收方无法处理。接收方可以通过调整窗口大小来告知发送方自己的处理能力,以实现流量控制。
  6. 拥塞控制:TCP使用拥塞控制算法来避免网络拥塞。通过监测网络的拥塞程度,在发现拥塞时采取相应的动作,如减少发送速率或执行快速重传等,以保持网络的稳定性和公平性。
    综上所述,TCP通过这些机制和算法,确保数据的可靠传输、流量控制和拥塞控制,从而保障了TCP协议的可靠性。

TCP 长连接和短连接

我们知道 TCP 在进行读写之前,server 与 client 之间必须提前建立一个连接。建立连接 的过程,需要我们常说的三次握手,释放/关闭连接的话需要四次挥手。这个过程是比较消耗 网络资源并且有时间延迟的。
所谓,短连接说的就是 server 端 与 client 端建立连接之后,读写完成之后就关闭掉连 接,如果下一次再要互相发送消息,就要重新连接。短连接的优点很明显,就是管理和实现都 比较简单,缺点也很明显,每一次的读写都要建立连接必然会带来大量网络资源的消耗,并且 连接的建立也需要耗费时间。 长连接说的就是 client 向 server 双方建立连接之后,即使 client 与 server 完成一次读 写,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。长连接的可以省 去较多的 TCP 建立和关闭的操作,降低对网络资源的依赖,节约时间。对于频繁请求资源的 客户来说,非常适用长连接。
TCP可以通过长连接和短连接
TCP可以通过长连接(也称为持久连接)和短连接来建立和管理网络连接。

  1. 长连接:长连接是指在客户端和服务器之间建立一次连接后,该连接可以被重复使用多次。客户端在发送请求后,保持与服务器的连接处于打开状态,以便后续的请求和响应能够在同一个连接上进行。在长连接中,客户端和服务器之间可以进行多个请求和响应操作,而无需每次都重新建立连接。长连接的特点是连接持久存在,可以减少连接的建立和断开开销,适用于需要频繁通信的场景,例如Web应用中的AJAX技术。
  2. 短连接:短连接是指在每次请求和响应完成后,客户端和服务器之间的连接会立即关闭。在短连接中,每个请求都需要重新建立连接,并在获得响应后立即关闭连接。短连接的特点是每次通信都需要经过连接的建立和断开过程,适用于只需要偶尔通信或通信频率较低的场景。例如,传统的HTTP协议中,默认采用的就是短连接。
    TCP可以通过长连接(也称为持久连接)和短连接来建立和管理网络连接。
  3. 长连接:长连接是指在客户端和服务器之间建立一次连接后,该连接可以被重复使用多次。客户端在发送请求后,保持与服务器的连接处于打开状态,以便后续的请求和响应能够在同一个连接上进行。在长连接中,客户端和服务器之间可以进行多个请求和响应操作,而无需每次都重新建立连接。长连接的特点是连接持久存在,可以减少连接的建立和断开开销,适用于需要频繁通信的场景,例如Web应用中的AJAX技术。
  4. 短连接:短连接是指在每次请求和响应完成后,客户端和服务器之间的连接会立即关闭。在短连接中,每个请求都需要重新建立连接,并在获得响应后立即关闭连接。短连接的特点是每次通信都需要经过连接的建立和断开过程,适用于只需要偶尔通信或通信频率较低的场景。例如,传统的HTTP协议中,默认采用的就是短连接。
    选择长连接或短连接取决于具体的应用场景和需求:
    ● 长连接适用于需要频繁通信并要求较低的连接建立和断开开销的场景,可以提高通信效率和性能。
    ● 短连接适用于通信频率较低或只需要偶尔通信的场景,可以避免空闲连接占用资源。
    需要注意的是,长连接和短连接都需要根据实际情况合理设置超时时间和保活机制,以确保连接的可靠性和资源的合理利用。

TCP 怎么实现拥塞控制

所谓拥塞控制,就是防止过多的数据注入到网络,使得网络中的通信设备和通信线缆不至于过载而导致网络性能大大下降。网络中通信设备具有数据处理转发性能、通信链路具有的传输带宽,而其中某台设备包处理性能或链路的最小带宽就是这个网络可用来传输数据的最大带宽。如果传输的数据量过大,超过网络的承载范围,那么不可避免的会出现网络拥塞,从而导致丢包现象。拥塞控制就是通过调节网络中传输的数据量使其在最大传输带宽以下,保证数据的正常传输。
TCP的拥塞控制有以下四种方法:
慢启动
拥塞避免
快速重传
快速恢复

TCP 实现拥塞控制主要通过以下几种机制来调整数据传输速率,以避免网络拥塞和提高网络性能:

  1. 慢启动(Slow Start):在连接刚建立时,TCP 发送方会将拥塞窗口 cwnd 的大小设置为一个较小的值,然后每经过一个往返时间(RTT),拥塞窗口 cwnd 就会加倍,即指数增长,直到达到一个阈值(慢启动阈值 ssthresh)为止。这样可以快速适应网络的带宽,同时避免引起网络拥塞。
  2. 拥塞避免(Congestion Avoidance):一旦拥塞窗口 cwnd 达到慢启动阈值 ssthresh,TCP 就会进入拥塞避免阶段。在拥塞避免阶段,拥塞窗口 cwnd 的大小会线性增长,即每经过一个往返时间(RTT),拥塞窗口 cwnd 只会增加 1 个 MSS(最大报文段长度),而不是指数增长。
  3. 快重传(Fast Retransmit):当 TCP 发送方连续接收到三个重复的确认报文时,表明有报文丢失,TCP 发送方会立即重传丢失的报文段,而不必等待超时重传计时器超时。这样可以更快地恢复丢失的数据,减少网络拥塞的影响。
  4. 快恢复(Fast Recovery):在进行快重传后,TCP 进入快恢复阶段,此时将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半,同时将拥塞窗口 cwnd 设置为 ssthresh 加上接收到的重复确认报文数量。在快恢复阶段,拥塞窗口 cwnd 的大小逐渐增长,直到再次发生拥塞。
    通过以上机制,TCP 能够在数据传输过程中动态调整拥塞窗口的大小,使得发送方和接收方之间的数据传输速率能够根据网络的拥塞情况进行自适应调整,从而有效控制网络拥塞,提高网络的吞吐量和性能。

TCP 的连接队列

● 正等待连接请求的一端有一个固定长度的连接队列,该队列中保存着已被 TCP 接受的连接(即三次握手已经完成),但还没有被应用层所接受
● TCP 每接受一个连接,也就是完成三次握手就将其放入这个队列,而应用层每接受一个连接时将其从该队列中移出
● 应用层将指明该队列的最大长度,这个值通常称为积压值(backlog),它的取值范围是 0~5 之间的整数
● 当一个连接请求(即 SYN )到达时,该 TCP 监听端口的连接队列中还有空间,TCP 模块将对 SYN 进行确认并完成连接的建立
● 如果对于新的连接请求,连接队列中已没有空间,TCP 将不理会收到的 SYN,也不发回任何报文段(即不发回 RST),客户的主动打开最终将超时

MSS(Maximum Segment Size)

● 在建立 TCP 连接的同时会计算两端之间的传输的数据包大小,该数据包的大小被称其为 MSS(最大消息长度)
● MSS 的大小不包含 TCP Header 和 TCP Option,只包含 TCP Payload
● 最理想的情况是,MSS 正好是 IP 中不会被分片处理的最大数据长度,减少 IP 层数据分片和重传的消耗
● TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送,进行重发时也是以 MSS 为单位
● 两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小,然后会在两者之间选择一个较小的值进行使用
通信序列号
● 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号
● 接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答发送回去
● 通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输
● 为了解决序列号冲突问题,TCP 每个连接都从不同的序列号开始,这个序号的起始序号是随着时间而变化的

重发机制

● TCP 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔
● 如果超过这个时间仍未收到确认应答,发送端将进行数据重发
● 最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”
● 自适应重传算法(Adaptive Retransmission Algorithm):
估计往返时间,需要 TCP 通过采样 RTT 的时间,然后进行加权平均,算出一个值,而且这个值还是要不断变化的,因为网络状况不断地变化。除了采样 RTT,还要采样 RTT 的波动范围,计算出一个估计的超时时间
● 在 BSD 的 Unix 以及 Windows 系统中,超时都以 0.5 秒为单位进行控制,因此重发超时都是 0.5 秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右
● 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以 2 倍、4 倍的指数函数延长
● 数据也不会被无限、反复地重发,达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接,并且通知应用通信异常强行终止
● TCP 重传时不一定要重传相同的报文段,可以进行重新分组而发一个更大的报文段

滑动窗口

概念:
如果 TCP 以 1 个段为单位,每发送一个段进行一次确认应答的处理,这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。为解决这个问题,TCP 引入了滑动窗口这个概念,确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,通过滑动窗口的机制,发送端主机在发送了一个段以后不必要一直等待确认应答,而是可以继续发送。
窗口大小:
● 窗口大小是指无需等待确认应答而可以继续发送数据的最大值
● 接收方在收到 ACK 时顺带将窗口大小返回给发送方
● 接收方每次 ACK 的回来的窗口大小不一定是固定的,ACK 只是表示接受到了数据,但是可能这些数据应用程序根本来不及处理,还存在 TCP 缓存区里面,此时滑动窗口的大小就是剩余缓存区的大小
● 有些情况下可能缓存区已经满了,这时接收方在 ACK 时告诉发送方通告窗口大小为 0,无法接受数据,后面会等待缓存区释放以后,接收方再发送一个 ACK (更新窗口),此时并不确认任何数据,只是用来更新窗口
● 如果设置为 0 的话,发送方也会定时发送窗口探测数据包,看是否有机会调整窗口的大小
累积确认应答(cumulative acknowledgment):
为了保证不丢包,接收方对于发送的包都要进行应答,但是这个应答也不是一个一个来的,而是会应答某个之前的 ID,表示这个 ID 之前的所有包都收到了,这种模式称为累计确认或者累计应答。通过累积确认应答减少传输次数,提高传输效率。
延时发送 ACK:
通常 TCP 在接收到数据时并不立即发送 ACK,相反它推迟发送,以便将 ACK 与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带 ACK),绝大多数实现采用的时延为 200 ms,也就是说,TCP 将以最大 200 ms 的时延等待是否有数据一起发送
滑动窗口中的重发控制:
● 当滑动窗口在一定程度较大时,即使有少部分的确认应答丢失也不会重发,可以通过下一个确认应答进行确认
● 当接收方收到一个序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是它就会发送冗余的 ACK,而当客户端收到三个冗余的 ACK 后,就会在定时器过期之前,重传丢失的报文段,这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制

TCP/IP 协议涉及哪几层架构

应用层 传输层 互连网络层 网络接口层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值