【计网 面向连接的传输TCP】 中科大笔记 (十 二)

目录

  • 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协议的主要特性:

  1. 面向连接:
    • TCP在通信之前必须先建立连接,通信完成后需要释放连接。连接的建立和释放过程分别是三次握手和四次挥手。
  2. 可靠性:
    • TCP通过序号、确认和重传机制来确保数据的可靠传输。每个TCP报文段都有一个唯一的序号,接收方会确认已成功接收的数据,并对未成功接收的数据进行重传。
  3. 流控制:
    • TCP使用滑动窗口机制进行流控制。接收方可以告知发送方它的接收窗口大小,从而限制发送方发送的数据量,防止接收方不堪重负。
  4. 拥塞控制:
    • TCP通过拥塞窗口和慢启动等机制来进行拥塞控制。拥塞窗口控制发送方的数据流量,以避免网络拥塞。慢启动机制在连接刚建立时,通过逐渐增加发送窗口的大小来适应网络状况。
  5. 全双工通信:
    • TCP是全双工通信的,意味着在一个TCP连接中,数据可以在两个方向上同时传输。
    • MSS:最大报文段的大小(Max Segment Size)
  6. 面向字节流:
    • TCP是面向字节流的,它不保留消息的边界。发送方将数据流分割成适当大小的报文段,而接收方则负责重新组装这些报文段。(字节流的数据是没有字符编码的,所以想以正确方式进行输出打印,还需要进行正确的解码操作
  7. 头部信息:
    • TCP报文头部包含了很多信息,包括源端口、目标端口、序号、确认号、窗口大小、控制标志等,以控制连接的建立、维护和数据传输。
  8. 超时与重传:
    • TCP使用超时与重传机制来处理丢失的数据。如果发送方在一定时间内未收到确认,触发超时,重新发送相应的数据。
  9. 可插拔:
    • 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报文段的结构如下:

  1. 源端口号(Source Port):
    • 占用2个字节,用于标识发送方应用程序的端口号。
  2. 目标端口号(Destination Port):
    • 占用2个字节,用于标识接收方应用程序的端口号。
  3. 序号(Sequence Number):
    • 占用4个字节,表示本报文段的第一个数据字节在完整数据流中的序号。用于按序传递数据。
  4. 确认号(Acknowledgment Number):
    • 占用4个字节,如果设置了ACK标志位,则表示期望接收的下一个数据字节的序号。用于确认已经成功接收的数据。
  5. 数据偏移(Data Offset):
    • 占用4个位,表示TCP报文段头部的长度,以4个字节为单位。最大值为15,因此头部长度最大为60字节。
  6. 保留(Reserved):
    • 占用6个位,保留字段,未使用。
  7. 标志位(Flags):
    • 占用6个位,包括URG、ACK、PSH、RST、SYN、FIN等标志,用于指示TCP报文段的各种状态和控制信息。
  8. 窗口大小(Window Size):
    • 占用2个字节,表示发送方愿意接收数据的窗口大小。用于流量控制。
  9. 校验和(Checksum):
    • 占用2个字节,用于检测TCP报文段头部和数据的错误。
  10. 紧急指针(Urgent Pointer):
  • 占用2个字节,如果URG标志被置位,则表示紧急数据的偏移量。用于指示紧急数据。
  1. 可选项(Options):
  • 长度可变,最长为(Data Offset - 5) * 4 字节,用于传递一些可选的信息,如最大报文段大小(MSS)、时间戳等。
  1. 数据(Data):
  • 包含应用层数据的部分。可以是0个或多个字节。

TCP报文段的头部是固定长度的,但其选项和数据部分的长度是可变的。报文段的结构提供了对数据传输的控制和管理,包括流量控制、错误检测、序号和确认号的管理等。除了数据部分之外,TCP报文段的所有信息都包含在TCP报文头部。

3 TCP如何实现RDT

TCP(Transmission Control Protocol)是一种在IP(Internet Protocol)网络上实现可靠数据传输的协议。IP本身是一种无连接、不可靠的数据包交换协议,它主要负责在网络中传递数据包,并将数据包从源地址传输到目标地址。然而,TCP在IP的基础上提供了一种可靠的、面向连接的通信服务。

下面是TCP如何在IP不可靠的基础上实现可靠数据传输的基本原理:

  1. 建立连接(Three-Way Handshake):

    • 在进行数据传输之前,发送方和接收方需要建立一个连接。这是通过三次握手来完成的。
    • 第一步,客户端向服务器发送一个请求(SYN)以建立连接。
    • 第二步,服务器收到请求后,回复一个确认(ACK),并发送自己的SYN。
    • 第三步,客户端收到确认后,回复一个确认,完成连接的建立。
  2. 可靠数据传输:

    • 一旦连接建立,数据的传输就会开始。
    • 数据被划分成小的数据块,称为数据段(segment)。
    • 发送方将数据段发送到接收方,并等待接收方的确认。
    • 如果发送方在一定时间内未收到确认,它会重新发送相同的数据段。
  3. 流量控制(Flow Control):

    • TCP使用滑动窗口机制来进行流量控制。发送方和接收方都有一个窗口大小的概念。
    • 接收方通过发送窗口大小告诉发送方自己能够接收的数据量。
    • 发送方根据接收方的窗口大小来控制发送数据的速率,以防止数据丢失或拥塞。
  4. 拥塞控制(Congestion Control):

    • TCP通过拥塞窗口来进行拥塞控制。
    • 当网络拥塞时,TCP会减小拥塞窗口的大小,降低发送速率,以减轻网络压力。
    • 当网络条件好转时,拥塞窗口会逐渐增大,提高发送速率。
  5. 顺序控制:

    • 接收方通过对接收到的数据包进行排序,确保数据包按正确的顺序组装。
    • 如果接收方发现有丢失的数据包,它会要求发送方重新发送这些数据包。
  6. 连接的关闭(Four-Way Handshake):

    • 数据传输完成后,双方需要进行连接的关闭。
    • 关闭是通过四次握手来完成的,包括发送方和接收方各发送一个FIN(Finish)报文,表示数据传输结束。
    • 对方收到FIN后,回复一个确认,表示同意关闭连接。这个过程分为两个步骤,先由客户端发送FIN,然后由服务器发送FIN。

通过这些机制,TCP实现了在IP网络上的可靠数据传输。它提供了一种面向连接、有序、可靠、流式的传输服务,使得应用层可以在不同的设备之间进行可靠的数据交换。

4 TCP 流量控制

TCP实现流量控制的主要机制是通过滑动窗口(Sliding Window)来调整发送方的发送速率,以适应接收方的处理能力和网络状况。滑动窗口机制是TCP用于管理数据流的一种重要方式,以下是详细解剖流量控制原理的步骤:

  1. 接收方通告窗口大小:

    • 接收方在TCP头部的窗口字段中通告自己的窗口大小,即接收方当前能够接收的数据量。
    • 接收方动态调整窗口大小,根据自身处理能力和可用缓存的大小。
  2. 发送方的发送窗口:

    • 发送方也有一个窗口大小的概念,称为发送窗口。
    • 发送窗口大小表示发送方可以发送但还未被确认的数据量。
  3. 滑动窗口的原理:

    • 发送方发送窗口的起始位置称为发送方的基序号(Sequence Number)。
    • 发送方将数据按照窗口大小划分成多个段,每个段的大小不超过窗口大小。
    • 发送方发送窗口会随着接收到对端的确认而滑动,即基序号向前移动。
    • 滑动窗口的滑动过程是动态的,它根据接收方通告的窗口大小和网络状况来进行调整。
  4. 流量控制过程:

    • 发送方发送数据,并等待接收方的确认。
    • 接收方接收到数据后,根据自身处理能力和可用缓存的大小通告发送方自己的窗口大小。
    • 发送方根据接收方通告的窗口大小和当前未被确认的数据量来决定发送的数据量。
    • 如果发送方的发送窗口超过了接收方通告的窗口大小,发送方需要等待接收方的确认,并调整发送窗口的大小。
  5. 窗口调整:

    • 如果接收方的窗口变大,发送方可以增加发送窗口的大小,提高发送速率。
    • 如果接收方的窗口变小,发送方需要适时减小发送窗口的大小,以防止发送过多的数据导致网络拥塞或接收方无法处理。

通过这种滑动窗口的机制,TCP实现了流量控制,使得发送方的发送速率可以根据接收方的处理能力和网络状况进行动态调整,从而保证在不同网络条件下的可靠数据传输。这种流量控制机制有效地防止了发送方发送过多的数据,以及接收方无法及时处理导致的问题。

4.1 题外话:算法感悟

学习算法是触类旁通的。算法是解决问题的一般方法,而不仅仅是应用于某一特定领域。很多常见的算法和数据结构在计算机科学的各个领域都有广泛的应用。滑动窗口算法就是一个很好的例子,它在多个领域都有用途,包括计算机网络、字符串处理、数组处理等。

学习算法具有以下优势:

  1. 通用性: 算法是解决问题的通用方法,可以应用于各种领域和情境。

  2. 解决复杂问题: 算法使得我们能够更有效地解决复杂的问题,提高程序的效率和性能。

  3. 思维模式: 学习算法有助于培养抽象思维和问题求解的能力。解决一个算法问题通常需要分析问题、设计解决方案并进行实现。

  4. 编码技能: 熟练掌握算法有助于提高编码技能,使代码更加清晰、高效和可维护。

  5. 面试和招聘: 在计算机科学领域,算法和数据结构是面试中常见的考察点,掌握这些知识可以提高在招聘过程中的竞争力。

当你学习一种算法时,你会学到解决特定问题的通用思维模式。这种思维模式可以应用于其他类似的问题,使你更容易理解和解决新的挑战。例如,学习了滑动窗口算法后,你可能会发现在其他领域的类似问题中也可以采用相似的思路。

总的来说,算法是计算机科学的基础,学习它们不仅有助于解决具体问题,还能够提高你在各种计算机科学领域的问题解决能力。

5 TCP连接3次握手、断开连接4次握手

5.1 连接

三次握手可以解决半连接和接受老数据的问题。

TCP(Transmission Control Protocol)连接的三次握手是在建立 TCP 连接时进行的一系列步骤,以确保通信的双方都能够理解并同意建立连接。这三个步骤是:

  1. 第一次握手(SYN):

    • 客户端发送一个 TCP 报文段,其中包含一个设置了 SYN(Synchronize)标志的序列号(Sequence Number)。这表示客户端请求建立连接。
    • 客户端选择一个初始的序列号,用于后续数据传输的标识。
  2. 第二次握手(SYN + ACK):

    • 服务器收到客户端的 SYN 请求后,如果同意建立连接,会发送一个包含 SYN 和 ACK(Acknowledgment)标志的 TCP 报文段作为响应。
    • 服务器也选择一个初始的序列号用于后续数据传输,并确认收到了客户端的序列号。
  3. 第三次握手(ACK):

    • 客户端收到服务器的 SYN + ACK 后,向服务器发送一个带有 ACK 标志的 TCP 报文段,表示连接已经建立。
    • 服务器收到客户端的 ACK 后,双方正式建立连接,可以开始进行数据传输。

这个过程确保了双方都同意建立连接,同时也用于同步双方的初始序列号。这种三次握手机制可以防止已失效的连接请求导致的问题,并确保每一方都具有相同的连接参数。在连接建立后,双方就可以进行正常的数据传输。

5.2 断开连接

可以将连接看作两个不同方向的连接。分别是客户端到服务端方向的传输、服务器到客户端的传输。两次握手只能断开一个方向的连接,所以总共需要四次握手。

TCP连接的四次握手是在关闭连接时进行的一系列步骤,以确保双方都愿意终止连接。这四个步骤是:

  1. 第一次握手(FIN):

    • 主动关闭方(通常是客户端)发送一个 TCP 报文段,其中包含设置了 FIN(Finish)标志的序列号。
    • 这表示主动关闭方不再发送数据,但仍然可以接收数据。
  2. 第二次握手(ACK):

    • 被动关闭方(通常是服务器)收到关闭方的 FIN 后,向关闭方发送一个带有 ACK 标志的报文段,确认收到了关闭方的 FIN。
    • 此时被动关闭方进入半关闭状态,可以继续发送数据给主动关闭方。
  3. 第三次握手(FIN):

    • 被动关闭方向主动关闭方发送一个 FIN 报文段,表示被动关闭方也准备关闭连接。
    • 主动关闭方收到 FIN 后,进入等待状态,继续发送数据。
  4. 第四次握手(ACK):

    • 主动关闭方收到被动关闭方的 FIN 后,向被动关闭方发送一个 ACK 报文段,表示收到了 FIN。
    • 此时连接正式关闭。

这个过程确保了双方都有足够的时间完成尚未完成的数据传输,并且都同意关闭连接。在四次握手完成后,连接被完全释放。

需要注意的是,TCP 的四次握手过程是为了保证数据的完整性和可靠性。在实际应用中,可能存在 TIME_WAIT 状态,即连接关闭后一小段时间内,系统会保持连接的信息以确保已传输的数据被接收方完全接收。这可以防止连接中残留的数据干扰下一次连接。

在这里插入图片描述

对称释放,并不完美!

6 拥塞控制

6.1 拥塞控制原理

6.2 TCP拥塞控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于python协同过滤推荐算法的音乐推荐与管理系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python的协同过滤推荐算法的音乐推荐与管理系统是一个集成了音乐推荐和管理的系统,它使用协同过滤算…

HarmonyOS应用开发者基础认证【题库答案】

HarmonyOS应用开发者高级认证【题库答案】 一、判断 首选项preferences是以Key-Value形式存储数据,其中Key是可以重复。(错)使用http模块发起网络请求时,必须要使用on(‘headersReceive’)订阅请求头,请…

一、Spring_IOCDI(1)

🌻🌻 目录 一、前提介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 二、Spring相关概念2.1 初始Spring2.1.1 Spring家族2.1.2 了解 Spring 发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2…

JBase到JRT

JBase之前是站在之前基础上新做的java框架。所以带入一些老的历史习惯,比如库和空间都以LIS开头,实体只能是LIS.Model等。为了做到更通用的框架,需要剔除LIS特性,实体肯定不能只能叫LIS.Model了。同时之前只关注业务脚本化的事忘了…

2023年程序设计迎新赛(第二届个人程序设计大赛)

7-1 找规律 请从所给的四个选项中&#xff0c;选择最合适的一个填入问号处&#xff0c;使之呈现一定的规律性。 输入格式: 无 输出格式: 大写字母 输入样例: 输出样例: #include<stdio.h> int main(){printf("D");return 0; }7-2 蜡烛燃烧时间 有粗细不同…

【推荐系统】MMOE笔记 20231126

paper阅读 任务差异带来的固有冲突实际上会损害至少某些任务的预测&#xff0c;特别是当模型参数在所有任务之间广泛共享时。&#xff08;在说ESMM&#xff09; 共享底层参数可以减少过拟合风险&#xff0c;但是会遇到任务差异引起的优化冲突&#xff0c;因为所有任务都需要在…

MySQL的undo log 与MVCC

文章目录 概要一、undo日志1.undo日志的作用2.undo日志的格式3. 事务id&#xff08;trx_id&#xff09; 二、MVCC1.版本链2.ReadView3.REPEATABLE READ —— 在第一次读取数据时生成一个ReadView4.快照读与当前读 小结 概要 Undo Log&#xff1a;数据库事务开始之前&#xff0…

【nowcoder】BM4 合并两个排序的链表

题目&#xff1a; 题目分析&#xff1a; 题目分析转载 代码实现&#xff1a; package BMP4;import java.util.List;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM4 {/*** 代码中的类名、方法名、参数名已经指定…

记一次Kotlin Visibility Modifiers引发的问题

概述 测试环境爆出ERROR告警日志java.lang.IllegalStateException: Didnt find report for specified language&#xff0c;登录测试环境ELK查到如下具体的报错堆栈日志&#xff1a; java.lang.IllegalStateException: Didnt find report for specified language at com.aba.…

数组栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 栈中的数据元素遵守后进先出LIFO,&#xff08;Last In First Out&#xff09;的原则 压栈&…

如何将 Python 运用到实际的测试工作中

1、自动化测试脚本编写&#xff1a; Python广泛用于编写自动化测试脚本&#xff0c;以执行各种测试任务。可以使用Selenium、Appium或PyTest等库来辅助测试脚本的编写。 下面是一个示例&#xff1a; from selenium import webdriver import unittestclass LoginTest(unittes…

MIT 6.824 -- MapReduce Lab

MIT 6.824 -- MapReduce Lab 环境准备实验背景实验要求测试说明流程说明 实验实现GoLand 配置代码实现对象介绍协调器启动工作线程启动Map阶段分配任务执行任务 Reduce 阶段分配任务执行任务 终止阶段 崩溃恢复 注意事项并发安全文件转换golang 知识点 测试 环境准备 从官方gi…

鸿蒙开发-ArkTS 语言-状态管理

鸿蒙开发-ArkTS 语言-基础语法 3. 状态管理 变量必须被装饰器装饰才能成为状态变量&#xff0c;状态变量的改变才能导致 UI 界面重新渲染 概念描述状态变量被状态装饰器装饰的变量&#xff0c;改变会引起UI的渲染更新。常规变量没有状态的变量&#xff0c;通常应用于辅助计算…

案例026:基于微信的原创音乐小程序的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

单片机学习7——定时器/计数器编程

#include<reg52.h>unsigned char a, num; sbit LED1 P1^0;void main() {num0;EA1;ET01;//IT00;//设置TMOD的工作模式TMOD0x01;//给定时器装初值&#xff0c;50000,50ms中断20次&#xff0c;就得到1sTH0(65536-50000)/256;TL0(65536-50000)%256;TR01; // 定时器/计数器启…

从0开始学习JavaScript--JavaScript中的对象原型

JavaScript中的对象原型是理解该语言核心概念的关键之一。本文将深入探讨JavaScript对象原型的作用、使用方法以及与继承相关的重要概念。通过详细的示例代码和全面的讲解&#xff0c;将能够更好地理解和运用JavaScript对象原型&#xff0c;提高代码的可维护性和扩展性。 Java…

wangeditor实时预览

<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…

日本运营商启动先进边缘云技术研发

摘要&#xff1a;日本运营商乐天移动最近启动了为 5G 之后的下一个通信标准开发边缘平台功能的研发工作。 乐天移动&#xff08;Rakuten Mobile&#xff09;表示&#xff0c;其面向下一代通信的先进边缘云技术研发&#xff08;R&D&#xff09;项目已被日本国家信息通信技术…

【Linux】信号

Linux 信号 1.信号介绍2.core dump3.发送信号3.1.kill3.2.send3.3.abort 4.信号产生4.1.软件条件产生信号4.1.1.SIGPIPE4.1.2.SIGALRM 4.2.硬件异常产生信号 5.信号处理6.可重入函数 & volatile7.SIGCHLD 1.信号介绍 信号本质是一种通知机制。 而进程要处理信号&#xff0…

windows通过regsvr32注册dll文件失败

1、注册dll文件失败 最近在研究中文输入法&#xff0c;下载SampleIME源码后编译得到SampleIME.dll&#xff0c;最后只需要将输入法安装&#xff08;即注册&#xff09;就可以使用了。 但是通过命令&#xff1a; regsvr32 C:\Windows\System32\SampleIME.dll 注册时却提示错…