趣谈网络协议-笔记(3)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 第十一、十二节 TCPTCP包结构TCP解决的问题:顺序丢包连接维护,有始有终流量控制,把握分寸,不撑死不饿死拥塞控制,知进退连接建立的三次握手:保证两端都一发一收,基本可靠;包起始序号随机生成。
第十一、十二节 TCP
  • TCP包结构


    img_8cf7d3163afe14d61cc4e7f192dc1e23.jpe
  • TCP解决的问题:
    • 顺序
    • 丢包
    • 连接维护,有始有终
    • 流量控制,把握分寸,不撑死不饿死
    • 拥塞控制,知进退
  • 连接建立的三次握手:保证两端都一发一收,基本可靠;包起始序号随机生成。状态时序图:


    img_05523c0263ce1745711e146c06945fa1.jpe
  • 连接断开的四次挥手
    • MSL:max segment lifetime, 最大报文生存时间
    • TTL:time to live, 网络包传输的最大跳数
    • RTT: round-trip time, 网络包来回时间


      img_902783e3882de31201bb2e928647fdaf.jpe
  • 状态机


    img_b188b97df934813ab5cb9936315f4cda.jpe
前面解决了连接维护问题,下面解决其他4个问题。
  • 滑动窗口rwnd:解决顺序、丢包、流量控制问题


    img_b9abd9e23304cd0445bb5f7618ae126a.jpe
    发送端

    接收端会给发送端报一个窗口大小,叫Advertised window,可动态调整


    img_2d2fcfa14d466bcd3eeb25bab2b80f85.jpe
    接收端
  • 确认与重发机制

    • 超时重试:超时时间必须大于RTT,也不宜过长。自适应重传算法。每次超时重传,都会将下一次的超时时间double
    • 快速重传算法:丢掉的包的前一个包的ack发三次
    • SACK:ack地图
  • 拥塞窗口cwnd:拥塞控制,尽量把水管灌满。通道容量 = 带宽 * RTT。

    • 目的:避免包丢失和重传
    • 面临的问题:丢包不代表通道满了,也可能本来就漏水;填满才控制也不对。
    • 升级版: bbr算法


      img_d82de6d07719e95f604b4038c9015d35.jpe
第十三节 socket(插槽,插座)

socket编程进行端到端的通信,只能设置端到端协议之上的网络层和传输层的协议,如ipv4还是ipv6,tcp还是udp。

  • TCP socket编程模型

    • 内核中为每个socket维护两个队列:已连接队列established和还没完全连接队列syn_rcvd。
    • 服务端监听socket和真正传输数据的socket是2个独立的。


      img_b2ef1679e2f8affbb5607169b84ba2f1.jpe
    • socket就是一个文件,每个进程都有一个数据结构task_struct。缓存sk_buff里面是完整的包结构


      img_855e2c9609a294999f7fc83cab4cb720.jpe
  • UDP socket调用过程


    img_dbcd85ceff59f1592bdfec02e658eae2.jpe
  • 最大连接数限制

    • 文件描述符限制:socket是一个文件
    • 内存限制: socket占用内存
  • C10K 就是 Client 10000 问题,即:在同时连接到服务器的客户端数量超过 10000 个的环境中,即便硬件性能足够, 依然无法正常提供服务

  • 提高最大连接数的方式

    • 多进程方式 下图为进程fork示意图,父进程的文件描述符会被子进程获得


      img_1395ebb59f5e5f8ae0aecaea2f2ac56d.jpe
    • 多线程方式:文件描述符、进程空间还是共享的,只是多了个引用而已


      img_68166e413c7bb6bffbcbd7a30eb86607.jpe
    • IO多路复用,轮询socket状态是否更新
    • IO多路复用,epoll注册callback,主动通知


      img_0aca1be3e3a245e4b6358dc1d4d15205.jpe
第十四节 http协议
  • http请求报文格式


    img_eaa5e6dcc9450708f88c223be95d3e3f.jpe
  • nginx做接入层,拦截静态请求


    img_b977ee2913139cb7e95a453f2bb3c374.jpe
  • http返回报文格式


    img_a6c826508a2d5471f24f5205703d46a4.jpe
  • http2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能
  • QUIC协议(google)
    • 自定义连接机制:基于UDP
    • 自定义重传机制
    • 无阻塞多路复用
    • 自定义流量控制
第十五节 https
img_fd12781addf1af72fb594f3f89fea8ec.jpe
  • 两端各产生一个随机数,最后再发一个pre-master随机数,结合起来,生成对称密钥。
  • 重放与篡改问题:timestamp&nonce解决
第十六节 流媒体协议
  • 视频 = 快速播放一连串的图片。一张图片称为一帧, fps = frame per second。
  • 视频压缩原理
    • 空间冗余: 单张图片的相邻像素有相关性
    • 时间冗余: 相邻图片之间内容相似
    • 视觉冗余: 人类视觉系统对一些细节不敏感
    • 编码冗余: 不同像素值出现概率不同
  • 直播流程


    img_4d9f2f345919fdb9e5cc6336f9c9db93.jpe
    • 服务端接流后进行转码,以适应各种客户端
  • 编码
    • I帧: 关键帧
    • P帧:跟之前一个I帧的差别
    • B帧:本帧和前后帧的差别,压缩率最高
  • 时序编码, NALU(network abstraction layer unit)网络提取层单元。排序好的NALU,按照RTMP包的格式进行包装,RTMP的包会拆分成chunk传输


    img_b5d4edc52a991a73886b66c9d85e37f9.jpe
  • 推流:RTMP协议,基于TCP,交换版本号、时间戳


    img_0c451217bc925d4f497edb8a7c44b1db.jpe
  • 分发网络


    img_8cbf944541f3de21e8affc32d8f4b0f2.jpe
第十七节 p2p协议
  • 解决http或ftp下载文件, 存在的单一服务器压力问题。资源并不集中存储在某些设备上,而是分散存储在多台设备。
  • 种子文件:保存tracker url(中心化的调度服务器地址)和文件信息
  • 去中心化网络:DHT(Distributed Hash Table)
第十八节 DNS协议
  • 一般基于UDP
  • DNS服务器树状结构


    img_29d1711451fcf2521a6b796c32e2d17d.jpe
    • 根DNS:返回顶级域DNS服务器ip地址
    • 顶级域DNS服务器:返回权威DNS服务器ip地址
    • 权威DNS服务器:返回相应主机的ip地址
  • 解析流程
    • 先访问本地缓存,如/etc/hosts
    • 访问本地dns服务器:如果用的是dhcp,由网络服务商(isp)自动分配,通常就在你的网络服务商的某个机房
    • 上一步没有,则访问根dns服务器,全球仅13个,不直接做域名解析,但可以指明道路。
    • 转向顶级域名服务器,再被导到权威域名服务器
    • 在权威dns服务器处得到ip地址,本地dns服务器再将ip地址返回给客户端
  • 负载均衡:一个域名多个ip地址
  • 全局负载均衡:北京用户访问北京服务器,上海用户访问上海服务器
  • 流程:GSLB(Global Server Load Balance)全局负载均衡器,是一个专门的设备或服务器,通过自定义策略实现负载均衡


    img_f5bc815f701f5000eeb56733fcae2634.jpe
    • 第一层GSLB:区分运营商
    • 第二层GSLB:区分地域,区分依据都是本地dns服务器所在地址或运营商
第十九节 httpdns
  • 跨机房的负载均衡和容灾多使用DNS来实现
  • httpdns就是基于http协议,自己搭建的dns服务器集群,分布在多个网点和运营商。使用httpdns需要绕过默认的dns路径,就不能使用默认的客户端。在手机上就是嵌入支持httpdns的客户端sdk。
  • 解决的2大问题:
    • 解析速度和更新速度的平衡问题
    • 智能调度
  • 缓存更新2大机制:同步&异步
第二十节 CDN
  • CDN分发系统架构


    img_89b6c40e6ecbea914e5949d3ee801d2c.jpe
  • 防盗链:时间戳加密
  • 支持流媒体协议:流媒体数据量大,往往主动推、预处理(转码、分片等)
第二十一节 数据中心
  • 三层网络结构


    img_5c9ec179f758393de7cfe8b014ff2de5.jpe
    • 接入层:服务器连接到接入层


      img_3df3d789a73f83724b0665a856aa346c.jpe
    • 汇聚层:再然后是汇聚层


      img_8ff8d699c63c1a01452035df550ca6ff.jpe
    • 核心层:核心层外面是边界路由器和安全设备
  • 大二层
    三层设备通过等价路由,二层设备通过TRILL协议(强化版的ARP)


    img_d23a8fc18fcb92251887fdadf6729e2f.jpe
  • 东西流量问题:叶脊网络(Spine/Leaf)

下一篇:趣谈网络协议-笔记(4)

目录
相关文章
|
3月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
264 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
3月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
70 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
3月前
|
机器学习/深度学习 数据可视化 Windows
深度学习笔记(七):如何用Mxnet来将神经网络可视化
这篇文章介绍了如何使用Mxnet框架来实现神经网络的可视化,包括环境依赖的安装、具体的代码实现以及运行结果的展示。
62 0
|
3月前
|
机器学习/深度学习 编解码 算法
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
MobileNetV3是谷歌为移动设备优化的神经网络模型,通过神经架构搜索和新设计计算块提升效率和精度。它引入了h-swish激活函数和高效的分割解码器LR-ASPP,实现了移动端分类、检测和分割的最新SOTA成果。大模型在ImageNet分类上比MobileNetV2更准确,延迟降低20%;小模型准确度提升,延迟相当。
89 1
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
|
3月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
121 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
3月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
206 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
3月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
73 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
3月前
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
65 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
3月前
|
机器学习/深度学习 Python
深度学习笔记(九):神经网络剪枝(Neural Network Pruning)详细介绍
神经网络剪枝是一种通过移除不重要的权重来减小模型大小并提高效率的技术,同时尽量保持模型性能。
88 0
深度学习笔记(九):神经网络剪枝(Neural Network Pruning)详细介绍
|
3月前
|
机器学习/深度学习 算法 TensorFlow
深度学习笔记(五):学习率过大过小对于网络训练有何影响以及如何解决
学习率是深度学习中的关键超参数,它影响模型的训练进度和收敛性,过大或过小的学习率都会对网络训练产生负面影响,需要通过适当的设置和调整策略来优化。
603 0
深度学习笔记(五):学习率过大过小对于网络训练有何影响以及如何解决

热门文章

最新文章