首页 > 其他分享 >为什么TCP要做成流式协议,而非包?

为什么TCP要做成流式协议,而非包?

时间:2025-01-16 10:58:50浏览次数:3  
标签:协议 报文 流式 MTU 传输 TCP 非包

TCP被设计成流式协议而非包协议,主要有以下技术方面的原因:

适应早期硬件与网络环境:

    实现简单:在1970年代,硬件条件有限,如处理器速度慢、内存小等。字节流协议的实现相对简单,允许将控制信息插入字节序列空间,并和有效数据一样期望得到确认,比如SYN、FIN等控制位。这比处理复杂的包结构更适合当时的硬件环境。

    适配异构网络:当时IP尚未从TCP分离,作为整体的TCP底层逻辑需要包含分包(即分离后的IP分片)功能。无边界字节流允许将TCP载荷在需要的时候拆分合并成任意大小,以适配早期非常异构的网络环境,不同网络可能有不同的最大传输单元(MTU)等特性。

满足应用层需求:

    统一数据处理:早期应用以远程登录和文件传输为主。对于远程登录,会产生大量单字符报文;而文件传输则涉及块数据。字节流作为交集更具适应性,能统一处理这两类数据,相比将数据严格按照包来划分,更有利于提高传输效率和资源利用率。例如,在远程登录时,可以将多个连续的单字符报文合并传输,减少报文数量。

    减少传输开销:如果以包为单位,当主机为远程登录产生大量单字符报文时,每个字符都需要封装成一个包,会增加大量的包头开销,严重浪费网络带宽。而TCP作为流式协议,可以将多个连续的单字符或小数据量的报文合并重传,减少传输报文数量,缓解网络拥塞,提高传输效率。

提高传输效率与灵活性:

    自由分片与MTU适配:如果TCP承诺按用户提交的报文一次性完整传输(即作为包协议),当遇到中间承载设备(如以太网)的MTU较小时,就会出现问题。例如,用户发送一个大于MTU的报文,就需要在IP层进行分片,增加了额外的IP头开销,降低了传输效率,且在遇到传输错误和丢包时,处理也会变得复杂。而流式协议允许TCP协议栈根据底层网络的MTU自动计算并以最合适的大小传输报文,无需考虑用户数据组织,只要按顺序传输字节流即可,确保了数据高效安全传输。

    智能打包与缓冲区管理:TCP的流式特性允许其智能地把缓冲区未发送的数据尽量按MTU大小打包发送,每个报文都刚好填满MTU,充分利用底层硬件性能,同时减少“无用”的报头传输,提高网络利用率。此外,像Nagle算法等机制,还能在数据提交速度较慢时,主动等待积攒足够的数据后再发送大包,进一步提高网络整体利用率。

降低协议实现与使用复杂度:

    避免包大小限制问题:如果TCP是面向用户的包协议,就必须给包设计一个最大大小,否则TCP不知道要分配多大内存来接收数据。但上层应用可能无法提前知道一个包的大小,例如上传一个文件时,文件大小是不确定的。这会导致一系列问题,如recv接口在面对用户包大于接收buffer时,难以设计合理的行为,是返回一部分数据、返回错误、还是逼发送方手工拆包等,都会增加协议实现和使用的复杂度。

    简化协议语义与连接管理:若TCP同时提供面向包、面向流两种语义,需要定义“包连接”和“流连接”两种连接,各传各的数据,这会大大增加协议设计和使用的复杂度。特别是在一些复杂的业务场景中,如需要进行有序数据传输,开头是个包,包完了是流,TCP作为通用传输协议很难处理这种情况。而只采用流式协议,语义相对简单清晰,更有利于协议的实现、维护和广泛应用。

标签:协议,报文,流式,MTU,传输,TCP,非包
From: https://blog.csdn.net/chinansa/article/details/145115007

相关文章

  • 音视频文件提供流式传输之HTTP Range 请求
    在Web开发中,正确返回音频和视频流给前端的方式是确保服务器端以流的形式发送媒体文件,而不是将整个文件加载到内存中,然后再传输。这种做法可以提高性能,避免内存溢出,尤其是在处理大文件时。对于音频和视频流的处理,最常见的技术是HTTP流式传输(HTTPStreaming)Range请求。这些......
  • TCP 与 HTTP keepalive 关系
    1.概念介绍   TCPkeepalive     TCPkeepalive是一种TCP协议层面的机制。它的主要作用是在TCP连接处于空闲状态时,定期发送探测包来检测连接的对端是否还存活。例如,在一个长时间没有数据传输的TCP连接中,服务器端可能会按照配置好的时间间隔(如每隔7200秒)发送一个TCP......
  • 使用tcpdump 和 Wireshark进行简单TCP抓包分析
     一、tcpdump工具 (一)简介tcpdump是一个命令行的网络数据包分析工具,它允许用户在网络接口上捕获和显示TCP/IP和其他协议的数据包。主要用于在Linux和Unix系统上进行网络故障诊断、安全审计和网络性能分析等。 (二)基本语法常用的基本语法格式为:`tcpdump[-adeflnNOpqSt......
  • 深挖 Java8的Stream.flatMap:你不知道的流式操作技巧
    flatMap()是Java8StreamAPI的核心方法之一,主要用于将嵌套结构展开并生成一个新的流。它的强大之处在于能够处理复杂数据结构并将其转换为简单的线性流。以下是flatMap()的常见用法和应用场景:1.将嵌套集合展开为单一流用法处理嵌套的List或Set,将其扁平化为单一流。......
  • 揭秘10种主流PLC在ModbusTCP通信中的速度表现!
    大家好!我是付工。通透!终于把ModbusRTU弄明白了这样看来,ModbusTCP协议太简单了太简单了!C#轻松实现Modbus通信前面给大家介绍了一系列关于Modbus和ModbusTCP的知识。今天给大家来实测一下,对于不同品牌的PLC或板卡实现ModbusTCP通信时,通信速度有多快。一、测试界面我们使用自......
  • 【TCP协议】TCP Keepalive 指南
    1、什么是TCPKeepalive?TCPKeepalive是一种TCP协议内置的探测机制,用于检测长时间未活动的连接是否仍然存活。当启用了Keepalive后,TCP会在连接空闲一定时间后,定期向对端发送探测包,如果未收到对端的响应,则会尝试多次探测,最终关闭连接。用途:检测并清理死连接,防止资源长期......
  • TCP与UDP数据包分析
    注意:帧规定最小为64bytes,最大为1518byte;帧头部+尾部占18bytes(6(DesMAC)+6(SrcMAC)+2(type)+4(CRC32校验))IP包中包头占20bytesTCP包中包头占20bytes(TCP的大小没有规定,主要靠在IP层中分片)UDP包中包头占8bytes(在lntent中规定UDP包大小为556byte,在局域网内可以达到64k)1、概述首先......
  • tcp 粘包问题及其解决
    tcp粘包问题及其解决tcp粘包问题及其解决tcp及粘包介绍粘包原因粘包造成的现象粘包问题复现1.小数据包合并复现复现结果2.大数据包拆分复现复现结果粘包解决粘包的解决方式解决代码读写部分封装网络通信部分服务器端客户端编译运行结果结尾参考链接tcp......
  • 【详解】SQLServerJDBC到主机的TCP/IP连接失败
    目录SQLServerJDBC到主机的TCP/IP连接失败错误描述原因分析解决步骤1.检查SQLServer服务状态2.检查网络连接3.检查端口4.配置SQLServer接受TCP/IP连接5.检查JDBC驱动版本6.检查连接字符串解释:常见问题排查:1.0x2749(10061)-无法建立连接......
  • Kafka 是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时
    Kafka集群是什么?Kafka是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时数据流。Kafka集群是由多个Kafka服务器(称为Broker)组成的,它们共同工作以实现消息的高可用性、可靠性、可扩展性和容错性。Kafka集群的目的是确保消息的持久化和高效传输,同......