套接字技术、视频加载技术、断点续传技术

发布于:2025-08-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

1、socket套接字技术

(1)socket的产生        

(2)本质

(3)一个 Socket 对象对接一个通信会话

2、视频加载技术与断点续传技术

(1)产生背景

(2)视频加载技术

(3)断点续传技术


1、socket套接字技术

(1)socket的产生        

网络通信涉及很多底层细节和繁琐步骤,像数据分包、添加各种协议头、维护连接状态、确认数据完整性等等,手动操作起来确实很麻烦。  

这时候就有了一个封装好了的工具即套接字--socket      

  • socket帮我们封装好了复杂的细节,我们只需要告诉它:

    • 要发送的数据

    • 目标的 IP 地址和端口号

  • socket 会帮我们自动:

    • 补充协议需要的各种信息(比如本机设备标志、序号、校验等)

    • 自动把大数据拆分成合适大小的包,并带上序号

    • 处理网络传输过程中的重发和确认

    • 收到数据后帮我们把拆包后的数据完整还原

  • 这样,我们的程序写起来更简单、更直观,不用管底层复杂的实现。

        但是同一局域网下 socket 默认拿不到对方 设备 MAC地址【因为socket API 工作在传输层/应用层,它关注的是“IP+端口”级别的通信,而不是底层的 MAC 级别】,这时候需要我们用程序补全此功能

(2)本质

最早是 C 语言在操作系统里提供的网络通信接口(系统调用),用来和 TCP/IP 协议栈打交道,

  • Java、Python、Go、C++ 等高级语言都在它的基础上做了封装,所以功能本质一样,只是语法不同。所以所有语言都有socket功能,可以进行网络编程通信。

  • 在应用层使用它收发数据,底层由操作系统帮我们完成 IP、MAC、端口等细节处理。

(3)一个 Socket 对象对接一个通信会话

  • 服务器端,常见做法是:创建一个“监听 socket”(只用来等待连接,不传数据)---->一旦有客户端连接,请求会交给一个新的 socket 对象来专门负责和该客户端通信

  • 因为 socket 会保存通信双方的唯一标识(四元组:源IP、源端口、目标IP、目标端口),所以一个 socket 实例只能跟一个客户端会话绑定。

一对多(服务器对多个客户端)

  • 服务器需要为每个客户端连接创建一个 socket 对象

  • 例如:10 个人在线聊天 = 10 个客户端连接 = 10 个 socket 对象

多对多(像群聊)

  • 服务器端是多组 socket(每个客户端都有自己的)

  • 服务器需要负责转发数据到对应 socket

  • 通常会用socket 列表 / 集合来维护所有在线连接

这里区分websocket,他和socket的关系就像雷峰塔和雷锋一样,毫无关系

2、视频加载技术与断点续传技术

(1)产生背景

文本 vs 文件 —— 网络传输的本质

相同点

  • 都是二进制数据(字节流 / 数组),网络层只关心“数据包”,不关心数据是什么类型

  • 传输方式类似:都要经过协议封装 → socket 发送 → 接收端还原

不同点(主要在应用层处理)

类型 编码特征 传输解析方式
文本 固定、简单编码(UTF-8、GBK等) 协议里通常会写明编码,接收方可直接解析成字符
文件 复杂、不固定编码(视频、图片、Word、PPT…) 一般“透传”,接收方不解析内容,只保存为原文件(需要知道文件名和扩展名)

        这样大文件传输时网络传输会把大文件拆成多个小数据包(TCP 会分段),接收端必须在全部收到后再排序 & 合并,只有在“全部接收完”才能合并文件 → 没法边看边传。。。。

痛点:底层传输协议(TCP/UDP)不支持“部分文件先播放”,必须整个文件收齐 → 排序合并 → 才能用

  • 视频必须下载完整才能播放

  • 下载中断(断电、断网)后要从头开始

于是才有了视频加载和断点续传两大技术来改善体验。

(2)视频加载技术

让接收端可以边接收边解码,而不是等所有分片下载完成再合并。其实就是文件切分

关键在应用层协议:

  • 允许分段数据“可独立播放”

  • 每段带有可播放的元信息(如视频关键帧、时间戳等)

【例】B 站、YouTube、爱奇艺为什么能“边播边看、随意拖动”???

        

        视频痛点:底层传输协议(TCP/UDP)不支持“部分文件先播放”,,必须整个文件收齐 → 排序合并 → 才能用。。文件太大(500MB+)下载时间长想看中间某一段必须等前面全部下完,但是不能直接改 TCP/HTTP(因为全网硬件都遵循现有协议)

       解决思路:传输之前,把“大文件”人为拆分成多个小文件(每个都可独立播放)

             ① 文件预处理:原始文件(500MB) → 拆成 N 个小文件(例如 50 个 10MB,或 500 个 1MB),每个小文件自带文件头(文件大小、编码信息、关键帧等),能独立播放。

             ② 传输过程:播放器先下载一个或几个小文件(很快,1MB~10MB) → 立即播放;如果用户拖动进度条到某个时间点 → 直接请求该位置对应的小文件--->后台按顺序/并发继续下载后续小文件.

(3)断点续传技术

断点续传 = 文件分片 + 双方约定记录机制

为什么浏览器没做断点续传??

        技术上需要“双方约定”:发送方(服务器)和接收方(客户端下载程序)必须能互相确认:

已经传了多少、哪些部分还没传,重新连接时只补传缺失部分,但是浏览器种类太多(Chrome、Firefox、Edge、360 等)、Web 服务器种类也多(Tomcat、Nginx、Apache、IIS、各种语言自写),双方没有统一标准去保存/读取这些断点信息,存储这些记录很麻烦(要区分是谁下载的、哪一天下载的、哪个文件)所以浏览器默认不做。

  断点续传能实现的前提:发送方和接收方最好是同一个公司的软件,双方可以约定切分方式 + 序号标记 + 记录机制

例如:

  • 文件先切成多个固定大小的小文件(如 1MB/份)

  • 每个分片有编号(#1、#2、#3…)

  • 接收方每收到一个就记录下来

  • 中断后重新连接时,把已完成的编号发给发送方,让它只补传剩余的

        浏览器没法做,是因为它和服务器之间没这个统一约定;而云盘、迅雷能做,是因为发送端和接收端都是自己家的。

数据粒度选择:

  • 按网络数据包切(64KB 左右) → 太细,记录量大,没必要

  • 按 1MB 或更大切 → 常用,记录量小、传输效率高

  • 例如:500MB 文件 → 切成 500 份 1MB 分片,假设收了 266 份 → 中断后补传剩余 234 份即可