• 详解RFC 793文档-1


    1. 介绍

    传输控制协议 (TCP) 是高度可靠的用于端到端之间的协议,提供可靠的进程间通信。位于传输层,在网络层的上层

    TCP协议

    TCP向上连接着应用程序进程,向下连接到下面一级的协议,网络层协议。应用程序进程通过一组调用组成的接口驱动TCP协议

    所以,TCP的主要目的是在成对的进程之间提供可靠、安全的逻辑通道或连接服务。要在不太可靠的互联网通信系统之上提供此服务,需要在以下领域实施:

    • 基本数据传输
    • 可靠性
    • 流量控制
    • 多路复用
    • 连接
    • 优先权和安全性

    TCP在每个领域的实现为:

    • 基本数据传输

    TCP将一定数量的字节打包成段通过互联网系统传输,从而在其用户之间在每个方向上传输连续的字节流

    • 可靠性

    TCP能够从损坏、丢失、复制或乱序传送的数据中恢复。这是通过为每个传输的字节分配一个序列号来实现的,并且需要来自接收端TCP的肯定确认 (ACK)。如果在超时间隔内没有收到ACK,则重新传输数据。在接收端,序列号用于正确排序可能被乱序接收的段并消除重复。通过向每个传输的段添加校验和,在接收端对其进行检查并丢弃损坏的段来处理损坏

    • 流量控制

    TCP为接收方提供了一种控制发送方发送的数据量的方法。 这是通过返回一个“窗口”来实现的,每个ACK都指示成功接收到的最后一个段之外的可接受序列号的范围。 该窗口指示发送方在接收进一步许可之前可以传输的允许的字节数

    • 多路复用

    为了允许单个主机内的多个进程同时使用TCP通信设施,TCP在每个主机内为每个进程提供一个端口,与网络层的主机地址连接起来,形成一个套接字。一对套接字唯一地标识每个连接, 也就是说,一个套接字可以同时用于多个连接

    • 连接

    当两个进程希望通信时,它们的TCP必须首先建立连接(初始化每一端的状态信息)。当他们的通信完成时,连接将被终止或关闭以释放资源以供其他用途。由于必须在不可靠的主机之间以及通过不可靠的互联网通信系统建立连接,因此使用基于时钟的序列号的握手机制来避免连接的错误初始化

    • 优先权和安全性

    TCP的用户可以指示他们通信的安全性和优先级。规定在不需要这些功能时使用默认值

    2. 理论

    2.1 模型操作

    进程通过调用TCP并将数据缓冲区的数据作为参数进行传递。TCP将这些缓冲区中的数据打包成段,并调用网络层模块将每个段传输到目标TCP。接收端TCP将数据段中的数据放入用户的接收缓冲区并通知接收用户。包含在TCP段中的控制信息用来确保可靠有序传输数据段

    TCP被假为操作系统中的一个模块。用户访问TCP就像访问文件系统一样。假设网络的实际接口由设备驱动程序模块控制。TCP不直接调用网络设备驱动程序,而是调用互联网数据报协议模块(网络层模块),该模块又可以调用设备驱动程序

    2.2 接口

    TCP/用户接口允许用户在TCP上进行调用以打开或关闭连接、发送或接收数据,或获取有关连接的状态。这些调用类似于操作系统上用户程序的其他调用,例如打开、读取和关闭文件的调用

    TCP/Internet接口提供调用以发送和接收寻址到网络系统中任何位置的主机中的TCP模块的数据报。这些调用具有用于传递地址、服务类型、优先级、安全性和其他控制信息的参数

    接口调用

    2.3 可靠通信

    在TCP连接上发送的数据流在目的地可靠且有序地传递

    通过使用序列号(seq)和确认号(ack)使传输变得可靠。从概念上讲,每个字节的数据都分配有一个序列号。段中数据的第一个字节的序列号与该段一起传输,称为段序列号。段还携带一个确认号,它是对端传输的下一个预期数据字节的序列号。当TCP传输包含数据段时,它会将副本放入重传队列并启动计时器;当收到对该数据的确认时,将从队列中删除该段。如果在定时器用完之前没有收到确认,则重传该段

    TCP的确认并不能保证数据已经交付给最终用户,而只能保证接收方TCP承担了这样做的责任。为了管理TCP之间的数据流,采用了流控制机制。接收TCP向发送TCP报告一个“窗口”。此窗口指定了从确认号开始,接收TCP当前准备接收的字节数

    2.4 连接建立和清除

    为了识别TCP可以处理的单独数据流,TCP提供了一个端口标识符。由于端口标识符由每个TCP独立选择,它们可能不是唯一的。为了在每个TCP中提供唯一地址,我们将标识TCP的Internet地址与端口标识符连接起来,以创建一个套接字,该套接字在连接在一起的所有网络中都是唯一的

    OPEN调用通过本地端口和外部套接字参数指定连接。关于连接,有几件事情必须记住。 为了存储这些信息,我们假设有一个称为传输控制块 (TCB) 的数据结构。OPEN调用还指定是主动寻求连接建立,还是被动等待

    被动OPEN请求意味着进程想要接受传入的连接请求,而不是尝试启动连接。通常请求被动OPEN的进程会接受来自任何调用者的连接请求

    建立连接的过程使用同步 (SYN) 控制标志并涉及三个消息的交换。这种交换被称为三步握手。当序列号在两个方向上同步时,连接变为“建立”。连接的清除还涉及段的交换,在这种情况下携带FIN控制标志

    2.5 数据通信

    在连接上流动的数据可以被认为是字节流。发送用户在每个SEND调用中通过设置PUSH标志指示该调用(以及任何之前的调用)中的数据是否应立即推送给接收用户。允许发送TCP从发送用户那里收集数据,并在自己方便的时候分段发送该数据,直到推送功能发出信号,然后它必须发送所有未发送的数据。当接收TCP看到PUSH标志时,它在将数据传递给接收进程之前不能等待来自发送TCP的更多数据。任何特定段中的数据可能是单个SEND调用(全部或部分)或多个SEND调用的结果。 push功能和PUSH标志的目的是将数据从发送用户推送到接收用户

    每次PUSH标志与放入接收用户缓冲区的数据相关联时,即使缓冲区未填满,缓冲区也会返回给用户进行处理。如果在看到PUSH之前到达的数据填满了用户的缓冲区,则数据以缓冲区大小为单位传递给用户。TCP还提供了一种与数据接收者通信的方法,在数据流中的某个点比接收者当前正在读取的数据更远,有紧急数据。TCP 不会尝试定义用户在收到待处理紧急数据通知后具体做什么,但一般概念是接收进程将采取行动快速处理紧急数据


  • 相关阅读:
    aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)
    学习记忆——方法篇——联想记忆法、理解记忆法、谐音记忆法、歌诀记忆法、协同记忆法、浓缩记忆法、归类记忆法、房间表记忆法、地点定位记忆法
    js---js使用闭包是否会产生内存泄露及如何解决方案
    投票礼物打赏流量主小程序开发
    隐藏微信网页右上角的按钮、在微信网页中获取用户的网络状态,支付等
    C++面向对象:重写、重载、隐藏
    计算机网络-第2章物理层
    正则表达式定义
    Day04-Dockerfile与案例
    Spark---核心概念(Spark,RDD,Spark的核心构成组件)详解
  • 原文地址:https://blog.csdn.net/wjz110201/article/details/127391839