目录
- 0 引言
- 1 TCP 的特性
- 1.1 拓展:全双工、单工、半双工通信
- 2 TCP报文段结构
- 3 TCP如何实现RDT
- 4 TCP 流量控制
- 4.1 题外话:算法感悟
- 5 TCP连接3次握手、断开连接4次握手
- 5.1 连接
- 5.2 断开连接
- 6 拥塞控制
- 6.1 拥塞控制原理
- 6.2 TCP拥塞控制
- 🙋♂️ 作者:海码007
- 📜 专栏:计算机四大基础专栏
- 📜 其他章节:网络快速入门系列、计网概述、计网应用层详解、计网Web和HTTP、计网FTP、计网EMail、计网DNS、计网P2P
- 💥 标题:【计算机网络 TCP】 中科大笔记 (十 二)
- ❣️ 寄语:书到用时方恨少,事非经过不知难。
- 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正
0 引言
其实之前就已经学了 TCP
协议了,但是只是概略的学习,今天就详细的学习一下 TCP
协议的原理。
参考文章:知乎
1 TCP 的特性
TCP(Transmission Control Protocol)
是一种面向连接、点到点、可靠、全双工的传输层协议。以下是TCP协议的主要特性:
- 面向连接:
- TCP在通信之前必须先建立连接,通信完成后需要释放连接。连接的建立和释放过程分别是三次握手和四次挥手。
- 可靠性:
- TCP通过序号、确认和重传机制来确保数据的可靠传输。每个TCP报文段都有一个唯一的序号,接收方会确认已成功接收的数据,并对未成功接收的数据进行重传。
- 流控制:
- TCP使用滑动窗口机制进行流控制。接收方可以告知发送方它的接收窗口大小,从而限制发送方发送的数据量,防止接收方不堪重负。
- 拥塞控制:
- TCP通过拥塞窗口和慢启动等机制来进行拥塞控制。拥塞窗口控制发送方的数据流量,以避免网络拥塞。慢启动机制在连接刚建立时,通过逐渐增加发送窗口的大小来适应网络状况。
- 全双工通信:
- TCP是全双工通信的,意味着在一个TCP连接中,数据可以在两个方向上同时传输。
- MSS:最大报文段的大小(Max Segment Size)
- 面向字节流:
- TCP是面向字节流的,它不保留消息的边界。发送方将数据流分割成适当大小的报文段,而接收方则负责重新组装这些报文段。(
字节流的数据是没有字符编码的,所以想以正确方式进行输出打印,还需要进行正确的解码操作
)
- TCP是面向字节流的,它不保留消息的边界。发送方将数据流分割成适当大小的报文段,而接收方则负责重新组装这些报文段。(
- 头部信息:
- TCP报文头部包含了很多信息,包括源端口、目标端口、序号、确认号、窗口大小、控制标志等,以控制连接的建立、维护和数据传输。
- 超时与重传:
- TCP使用超时与重传机制来处理丢失的数据。如果发送方在一定时间内未收到确认,触发超时,重新发送相应的数据。
- 可插拔:
- TCP是一种可插拔的协议,它可以在不同的网络环境中运行,而上层应用无需关心底层网络的细节。
总体而言,TCP提供了一种高度可靠的数据传输服务,适用于那些对数据可靠性要求高、能够容忍一些延迟的应用,例如文件传输、Web浏览等。 TCP的特性和机制确保了数据的完整性、有序性和可靠性。
1.1 拓展:全双工、单工、半双工通信
他们三者描述了通信设备之间信息流动的方向和能力。
全双工通信(Full-Duplex Communication)
在全双工通信中,通信的双方可以同时发送和接收数据,而且这两个方向的通信是相互独立的。这意味着在同一时间内,设备 A 可以发送数据给设备 B,同时设备 B 也可以发送数据给设备 A,实现了双方之间的双向通信。电话对讲机、互联网电话和计算机网络中的TCP协议等都是全双工通信的例子。
单工通信(Simplex Communication)
在单工通信中,通信的双方只能有一个方向的通信。其中一个设备只能发送数据,而另一个设备只能接收数据,不能同时发送和接收。通信是单向的,类似于广播或电视广播,其中信息只能从一个地方传输到另一个地方,而反向通信是不可行的。
半双工通信(Half-Duplex Communication)
在半双工通信中,通信的双方可以在不同的时间段内进行双向通信,但不能同时进行。设备 A 在某一时刻发送数据给设备 B,然后在另一时刻设备 B 发送数据给设备 A。对讲机通信就是半双工通信的一个例子。
总结
-
全双工通信: 双方可以同时发送和接收数据,实现双向通信。
-
单工通信: 通信双方只能有一个方向的通信,不能同时发送和接收。
-
半双工通信: 双方可以进行双向通信,但不能同时进行,需要切换发送和接收的方向。
选择使用哪种通信模式取决于特定的应用需求和通信设备的能力。在许多实际应用中,全双工通信更为常见,因为它提供更高的灵活性和效率。
2 TCP报文段结构
TCP报文的Body部分就是存储的应用层的数据。例如应用层是HTTP协议,那么TCP报文的Body就是存储的请求报文或者响应报文。
TCP(Transmission Control Protocol)报文段是在TCP通信中传输数据的基本单元。TCP报文段的结构如下:
- 源端口号(Source Port):
- 占用2个字节,用于标识发送方应用程序的端口号。
- 目标端口号(Destination Port):
- 占用2个字节,用于标识接收方应用程序的端口号。
- 序号(Sequence Number):
- 占用4个字节,表示本报文段的第一个数据字节在完整数据流中的序号。用于按序传递数据。
- 确认号(Acknowledgment Number):
- 占用4个字节,如果设置了ACK标志位,则表示期望接收的下一个数据字节的序号。用于确认已经成功接收的数据。
- 数据偏移(Data Offset):
- 占用4个位,表示TCP报文段头部的长度,以4个字节为单位。最大值为15,因此头部长度最大为60字节。
- 保留(Reserved):
- 占用6个位,保留字段,未使用。
- 标志位(Flags):
- 占用6个位,包括URG、ACK、PSH、RST、SYN、FIN等标志,用于指示TCP报文段的各种状态和控制信息。
- 窗口大小(Window Size):
- 占用2个字节,表示发送方愿意接收数据的窗口大小。用于流量控制。
- 校验和(Checksum):
- 占用2个字节,用于检测TCP报文段头部和数据的错误。
- 紧急指针(Urgent Pointer):
- 占用2个字节,如果URG标志被置位,则表示紧急数据的偏移量。用于指示紧急数据。
- 可选项(Options):
- 长度可变,最长为(Data Offset - 5) * 4 字节,用于传递一些可选的信息,如最大报文段大小(MSS)、时间戳等。
- 数据(Data):
- 包含
应用层数据
的部分。可以是0个或多个字节。
TCP报文段的头部是固定长度的,但其选项和数据部分的长度是可变的。报文段的结构提供了对数据传输的控制和管理,包括流量控制、错误检测、序号和确认号的管理等。除了数据部分之外,TCP报文段的所有信息都包含在TCP报文头部。
3 TCP如何实现RDT
TCP(Transmission Control Protocol)是一种在IP(Internet Protocol)网络上实现可靠数据传输的协议。IP本身是一种无连接、不可靠的数据包交换协议,它主要负责在网络中传递数据包,并将数据包从源地址传输到目标地址。然而,TCP在IP的基础上提供了一种可靠的、面向连接的通信服务。
下面是TCP如何在IP不可靠的基础上实现可靠数据传输的基本原理:
-
建立连接(Three-Way Handshake):
- 在进行数据传输之前,发送方和接收方需要建立一个连接。这是通过三次握手来完成的。
- 第一步,客户端向服务器发送一个请求(SYN)以建立连接。
- 第二步,服务器收到请求后,回复一个确认(ACK),并发送自己的SYN。
- 第三步,客户端收到确认后,回复一个确认,完成连接的建立。
-
可靠数据传输:
- 一旦连接建立,数据的传输就会开始。
- 数据被划分成小的数据块,称为数据段(segment)。
- 发送方将数据段发送到接收方,并等待接收方的确认。
- 如果发送方在一定时间内未收到确认,它会重新发送相同的数据段。
-
流量控制(Flow Control):
- TCP使用滑动窗口机制来进行流量控制。发送方和接收方都有一个窗口大小的概念。
- 接收方通过发送窗口大小告诉发送方自己能够接收的数据量。
- 发送方根据接收方的窗口大小来控制发送数据的速率,以防止数据丢失或拥塞。
-
拥塞控制(Congestion Control):
- TCP通过拥塞窗口来进行拥塞控制。
- 当网络拥塞时,TCP会减小拥塞窗口的大小,降低发送速率,以减轻网络压力。
- 当网络条件好转时,拥塞窗口会逐渐增大,提高发送速率。
-
顺序控制:
- 接收方通过对接收到的数据包进行排序,确保数据包按正确的顺序组装。
- 如果接收方发现有丢失的数据包,它会要求发送方重新发送这些数据包。
-
连接的关闭(Four-Way Handshake):
- 数据传输完成后,双方需要进行连接的关闭。
- 关闭是通过四次握手来完成的,包括发送方和接收方各发送一个FIN(Finish)报文,表示数据传输结束。
- 对方收到FIN后,回复一个确认,表示同意关闭连接。这个过程分为两个步骤,先由客户端发送FIN,然后由服务器发送FIN。
通过这些机制,TCP实现了在IP网络上的可靠数据传输。它提供了一种面向连接、有序、可靠、流式的传输服务,使得应用层可以在不同的设备之间进行可靠的数据交换。
4 TCP 流量控制
TCP实现流量控制的主要机制是通过滑动窗口(Sliding Window)
来调整发送方的发送速率,以适应接收方的处理能力和网络状况。滑动窗口机制是TCP用于管理数据流的一种重要方式,以下是详细解剖流量控制原理的步骤:
-
接收方通告窗口大小:
- 接收方在TCP头部的窗口字段中通告自己的窗口大小,即接收方当前能够接收的数据量。
- 接收方动态调整窗口大小,根据自身处理能力和可用缓存的大小。
-
发送方的发送窗口:
- 发送方也有一个窗口大小的概念,称为发送窗口。
- 发送窗口大小表示发送方可以发送但还未被确认的数据量。
-
滑动窗口的原理:
- 发送方发送窗口的起始位置称为发送方的基序号(Sequence Number)。
- 发送方将数据按照窗口大小划分成多个段,每个段的大小不超过窗口大小。
- 发送方发送窗口会随着接收到对端的确认而滑动,即基序号向前移动。
- 滑动窗口的滑动过程是动态的,它根据接收方通告的窗口大小和网络状况来进行调整。
-
流量控制过程:
- 发送方发送数据,并等待接收方的确认。
- 接收方接收到数据后,根据自身处理能力和可用缓存的大小通告发送方自己的窗口大小。
- 发送方根据接收方通告的窗口大小和当前未被确认的数据量来决定发送的数据量。
- 如果发送方的发送窗口超过了接收方通告的窗口大小,发送方需要等待接收方的确认,并调整发送窗口的大小。
-
窗口调整:
- 如果接收方的窗口变大,发送方可以增加发送窗口的大小,提高发送速率。
- 如果接收方的窗口变小,发送方需要适时减小发送窗口的大小,以防止发送过多的数据导致网络拥塞或接收方无法处理。
通过这种滑动窗口的机制,TCP实现了流量控制,使得发送方的发送速率可以根据接收方的处理能力和网络状况进行动态调整,从而保证在不同网络条件下的可靠数据传输。这种流量控制机制有效地防止了发送方发送过多的数据,以及接收方无法及时处理导致的问题。
4.1 题外话:算法感悟
学习算法是触类旁通的。算法是解决问题的一般方法,而不仅仅是应用于某一特定领域。很多常见的算法和数据结构在计算机科学的各个领域都有广泛的应用。滑动窗口算法就是一个很好的例子,它在多个领域都有用途,包括计算机网络、字符串处理、数组处理等。
学习算法具有以下优势:
-
通用性: 算法是解决问题的通用方法,可以应用于各种领域和情境。
-
解决复杂问题: 算法使得我们能够更有效地解决复杂的问题,提高程序的效率和性能。
-
思维模式: 学习算法有助于培养抽象思维和问题求解的能力。解决一个算法问题通常需要分析问题、设计解决方案并进行实现。
-
编码技能: 熟练掌握算法有助于提高编码技能,使代码更加清晰、高效和可维护。
-
面试和招聘: 在计算机科学领域,算法和数据结构是面试中常见的考察点,掌握这些知识可以提高在招聘过程中的竞争力。
当你学习一种算法时,你会学到解决特定问题的通用思维模式。这种思维模式可以应用于其他类似的问题,使你更容易理解和解决新的挑战。例如,学习了滑动窗口算法后,你可能会发现在其他领域的类似问题中也可以采用相似的思路。
总的来说,算法是计算机科学的基础,学习它们不仅有助于解决具体问题,还能够提高你在各种计算机科学领域的问题解决能力。
5 TCP连接3次握手、断开连接4次握手
5.1 连接
三次握手可以解决半连接和接受老数据的问题。
TCP(Transmission Control Protocol)连接的三次握手是在建立 TCP 连接时进行的一系列步骤,以确保通信的双方都能够理解并同意建立连接。这三个步骤是:
-
第一次握手(SYN):
- 客户端发送一个 TCP 报文段,其中包含一个设置了 SYN(Synchronize)标志的序列号(Sequence Number)。这表示客户端请求建立连接。
- 客户端选择一个初始的序列号,用于后续数据传输的标识。
-
第二次握手(SYN + ACK):
- 服务器收到客户端的 SYN 请求后,如果同意建立连接,会发送一个包含 SYN 和 ACK(Acknowledgment)标志的 TCP 报文段作为响应。
- 服务器也选择一个初始的序列号用于后续数据传输,并确认收到了客户端的序列号。
-
第三次握手(ACK):
- 客户端收到服务器的 SYN + ACK 后,向服务器发送一个带有 ACK 标志的 TCP 报文段,表示连接已经建立。
- 服务器收到客户端的 ACK 后,双方正式建立连接,可以开始进行数据传输。
这个过程确保了双方都同意建立连接,同时也用于同步双方的初始序列号。这种三次握手机制可以防止已失效的连接请求导致的问题,并确保每一方都具有相同的连接参数。在连接建立后,双方就可以进行正常的数据传输。
5.2 断开连接
可以将连接看作两个不同方向的连接。分别是客户端到服务端方向的传输、服务器到客户端的传输。两次握手只能断开一个方向的连接,所以总共需要四次握手。
TCP连接的四次握手是在关闭连接时进行的一系列步骤,以确保双方都愿意终止连接。这四个步骤是:
-
第一次握手(FIN):
- 主动关闭方(通常是客户端)发送一个 TCP 报文段,其中包含设置了 FIN(Finish)标志的序列号。
- 这表示主动关闭方不再发送数据,但仍然可以接收数据。
-
第二次握手(ACK):
- 被动关闭方(通常是服务器)收到关闭方的 FIN 后,向关闭方发送一个带有 ACK 标志的报文段,确认收到了关闭方的 FIN。
- 此时被动关闭方进入半关闭状态,可以继续发送数据给主动关闭方。
-
第三次握手(FIN):
- 被动关闭方向主动关闭方发送一个 FIN 报文段,表示被动关闭方也准备关闭连接。
- 主动关闭方收到 FIN 后,进入等待状态,继续发送数据。
-
第四次握手(ACK):
- 主动关闭方收到被动关闭方的 FIN 后,向被动关闭方发送一个 ACK 报文段,表示收到了 FIN。
- 此时连接正式关闭。
这个过程确保了双方都有足够的时间完成尚未完成的数据传输,并且都同意关闭连接。在四次握手完成后,连接被完全释放。
需要注意的是,TCP 的四次握手过程是为了保证数据的完整性和可靠性。在实际应用中,可能存在 TIME_WAIT 状态,即连接关闭后一小段时间内,系统会保持连接的信息以确保已传输的数据被接收方完全接收。这可以防止连接中残留的数据干扰下一次连接。
对称释放,并不完美!