标签: 网络

  • TCP拥塞控制算法的实现

    基于对google提出的bbr算法源码阅读的一些学习:

    https://github.com/torvalds/linux/blob/master/net/ipv4/tcp_bbr.c#L39

    并不详细介绍bbr的原理,也不逐行解释

    拥塞接口

    TCP底层的拥塞控制通过若干个定义在TCP层的接口被模块化了,不同的算法就可以直接hook对应需要的回调来实现不同的TCP拥塞控制算法。

    Linux内核机制

    • 内核模块化,通过module_init和module_exit来初始化和卸载一个模块。
    • 模块开发不能使用常规的库函数,例如printf, malloc,需要使用内核提供的:printk, kmalloc。
    • 模块是系统的一部分,所以模块卸载需要自己卸载干净,系统不会帮忙进行回收。
    • 模块内开发不能直接对用户指针的对象取值或者复制,因为那是用户空间的地址,在内核空间会没有映射导致有问题,需要使用put_user给用户空间的内存地址复制。
    • 与上类似的函数还有:copy_to_user,copy_from_user,get_user,put_user。
    • 拥塞控制的结构体是:tcp_congestion_ops,定义了一系列的事件函数,通过hook这些函数实现不同的TCP拥塞控制算法。
    static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = {
        .flags      = TCP_CONG_NON_RESTRICTED,
        .name       = "bbr",
        .owner      = THIS_MODULE,
        .init       = bbr_init,                         // 初始化函数
        .cong_control   = bbr_main,                   // 在拥塞状态下,发包前的回调,用于更新拥塞窗口和传输速度
        .sndbuf_expand  = bbr_sndbuf_expand,        // 返回给tcp_sndbuf_expand使用的乘数
        .undo_cwnd  = bbr_undo_cwnd,                // 损失后cwnd的新值
        .cwnd_event = bbr_cwnd_event,               // 当发生拥塞时的回调
        .ssthresh   = bbr_ssthresh,                   // 返回慢启动的阈值
        .min_tso_segs   = bbr_min_tso_segs,           // 系统sysctl_tcp_min_tso_segs的重写
        .get_info   = bbr_get_info,                   // 获取inet的日志信息
        .set_state  = bbr_set_state,                // ca_state变化前会调用
    };
    
    static int __init bbr_register(void)
    {
        BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE);
        return tcp_register_congestion_control(&tcp_bbr_cong_ops);
    }
    
    static void __exit bbr_unregister(void)
    {
        tcp_unregister_congestion_control(&tcp_bbr_cong_ops);
    }
    
    module_init(bbr_register);
    module_exit(bbr_unregister);
    • BUILD_BUG_ON是编译时的检测,为了保证bbr的结构体小于等于内核准备的空间大小。
    • 不同的机器的ICSK_CA_PRIV_SIZE值可能不同,但是编译确定下来还有bbr的空间大小和分布,所以一个系统编译,其他系统也是能够使用的。
    • do_div表示除法函数mod = do_div(x, y),结果存储在x中,余数存储在mod中。
  • TCP-Jersey拥塞控制介绍

    介绍

    TCP-Jersey拥塞控制算法在中文世界里的描述非常的少,有点好奇信号和丢包共同控制的算法是怎样的,就翻译了这篇论文,链接在最后。

    传统TCP拥塞控制

    传统TCP的拥塞控制算法是使用拥塞控制窗口来实现的,TCP发送端在发送时除了要兼容接收端的接收窗口,自己这边的发送窗口,还需要考虑拥塞控制窗口。在发送时,取min(w_{r}, w_{s}, w_c),其中w_r是接收窗口,w_s是发送窗口,w_c是拥塞窗口。

    发生丢包事件时,拥塞控制窗口的长度会缩小到一半,然后线性增加逐步增加,即加性增,乘性减(AIMD),这样的设计维护了网络的相对公平和稳定,但是在当今的环境下,移动网络占了互联网流量的很大一部分,移动网络有一个特点就是存在一定的信道丢包,即在发送消息时,本身可能因为信号和干扰的原因,导致发送失败。

    在传统TCP拥塞控制算法里会认为这次丢包是发生了拥塞,进而会缩小拥塞窗口,进而降低TCP的发送速度,但实际情况只是发生了一次丢包,而并没有拥塞。

    TCP-Jersey拥塞控制算法

    这个算法的设计初衷是为了提高无线网络以及无线-有线混合网络通信的传输速度,TCP主要慢的原因是无法区分网络拥塞和无线链接原因的丢包。本协议具有区分这两者的能力,TCP-Jersey包含两个关键部分,可用带宽估计(ABE)算法和拥塞警告(CW)路由配置。

    ABE是一个在发送端持续估计连接的可用带宽,并且在发生拥塞时指导传输速率的算法。

    CW是一个在有迹象发生网络拥塞时,在终端警告的网络路由的配置。CW网络配置对封包进行的标记,可以帮助TCP连接的发送方区分丢包是网络拥塞导致的还是无线链路有问题导致的。

    对比

    在NS-2网络模拟中,当无线网络拥有1%的丢包率,无拥塞的情况下,TCP-Jersey对比TCP-Westwood和TCP-Reno,吞吐量分别提升了17%和85%。

    在发生拥塞,丢包率为1%的无线网络中,TCP-Jersey对比TCP-Westwood和TCP-Reno,吞吐量分别提升了9%和76%。

    TCP-Jersey

    本协议的目标就是将丢包的原因细化,从由拥塞导致的丢包和无线网传输导致的丢包区分开。

    A.可用带宽预估(ABE)

    传统TCP是通过增大窗口,直到发生丢包来判断可用带宽大小。

    TCP-Westwood协议提出了一个有效的办法,在当发送端在t_k时刻收到ACK,记录带宽的采样为:

    b_k=\frac{d_k}{t_k-t_{k-1}}

    其中d_k是ACK确认的数据长度,t_{k-1}是前一个ACK收到的时间。然后再使用Tustin双线性方法近似计算低通滤波,公式如下:

    \hat {b_{k}}=\frac{\frac{2\tau}{t_k-t_{t-1}} - 1}{\frac{2\tau}{t_k+t_{t-1}}+1} \hat b_{k-1}+\frac{b_k+b_{k-1}}{\frac{2\tau}{t_k-t_{k-1}}+1}

    其中\hat b_k表示在t_k时刻的平滑后的预估可用带宽,其中1/\tau是低通频率的截止频率。此外,TCP-Westwood还是用了一个定时器,如果\tau/m(m>2)时间内没有收到ACK则相当于收到了一个b_k = 0的采样。同时受到三个重复的ACK时被TCP-Westwood判定为发生拥塞,将TCP拥塞控制中的ssthreshold设置为:

    ssthresh=\frac{BWE\times RTT_{min}}{seg\_size}

    其中BWE就是预估的带宽,RTT_{min}是TCP预估的最小往返延时,seg\_size是分段大小(segment size,就是MSS中的SS)。如果cwnd>ssthresh并且不在慢启动状态里,拥塞窗口cwnd的被设置为ssthresh,然后并没有明确的指导如何设置\tau和m。

    这里TCP-Jersey采用了相同的估计最大可用带宽的方法:发送方通过观察ACK返回速度,但是采用了一个更加简单的预估。我们提出的方法是基于时间滑动窗口做预估的(TCP-Westwood使用的近似低通滤波器)。

    TCP-Jersey通过监控收到ACK的速度来预估TCP连接的可用带宽,然后是用这个预估来优化拥塞窗口。我们在每个RTT计算一次最佳拥塞窗口,当CW通知需要减小窗口时,TCP-Jersey将cwnd和ssthresh设置为最佳拥塞窗口,ABE的公式如下:

    R_n=\frac{RTT/times R_{n-1}+L_n}{(t_n-t_{n-1})+RTT}

    其中R_n表示在t_n时刻收到第n个ACK之后预估的带宽,t_{n-1}表示前一个ACK到达时间,L_n是第n个ACK确认的数据长度,RTT是TCP估计的往返时间。最佳拥塞控制窗口(ownd)公式如下:

    ownd_n=\frac{RTT\times R_n}{seg\_size}

    其中seg\_size表示分段大小。

    我们的模型有几个优点:

    • 我们对带宽估计的计算很快
    • 不需要配置参数;
    • 同窗口滤波器一样,会随着时间衰减,适合非静态的带宽延迟网络,这是有线-无线混合网络的特性。

    在文中的模拟里,TCP-Jersey的预估带宽对比TCP-Westwood的更加准确。

    B.拥塞警报

    现在的ECN协议会在平均队列长度在min_{th}到max_{th}之间会随机标记封包,路由器不仅会通知发送者发生了拥塞,并且会通过随机标记封包进而影响连接的拥塞控制窗口。

    ECN信息的往返需要时间,而网络情况变化很快,尽管ECN提供了宝贵的信息,但是就在几乎所有的情况下此信息不够及时,使得发送方无法准确快速的应对网络状态变化。而且RED和ECN对参数设置都非常敏感,错误的参数会降低TCP的性能。因此我们提出了一种更简单的通知方案,即拥塞警告(CW),具有更少需要配置的参数,同样能给发送方提供敏感准确的拥塞状况。

    我们建议当平均队列大于某个阈值时,路由器标记所有的封包,并由TCP的发送方来决定如何控制窗口策略。使用IP帧头中的CE位和TCP报头中的ECE和CWR位来传递拥塞信息。这样兼容自1990s时定制的这几个标志位的含义,可以和其他没有CW功能的路由器共同工作。

    后面就不继续翻译了,主要的思路已经描述完了。

    引用

  • 一本书读懂TCP/IP 读书笔记

    TCP/IP是什么

    互联网包含因特网,因特网包含万维网。

    物理层

    物理层解决最基础的传送通道,涉及问题主要是建立、维护和释放物理链路所需的机械的、电气的/光学的、功能的和规程的特性

    数据链路层

    在相邻的网络节点之间提供简单的、传输以帧为单位的数据,同时它还负责数据链路的流量控制、差错控制。大家要理解,这条链路不具备任何路径选择和转发功能,你可以把它仅仅理解为“一条封闭的路”,除了两端,没有额外出入口。

    本层要提供一定的差错检验和纠正机制。以太网就属于这一层。所以你会经常听到“以太网帧”这一术语。

    传统IP技术就是无连接服务,而改造为MPLS(多协议标签交换)网络后,就属于面向连接的服务了。

    网络层最知名的协议就是IP。

    大名鼎鼎的TCP和UDP就属于传输层。

    表示层就处理通信进程之间交换数据的表示方法,包括语法转换、数据格式的转换、加密与解密、压缩与解压缩等。

    OSI是哲学,而不仅仅是技术!

    以太网是IP通信中数据链路层最常见的形式,除此之外还有PPP、HDLC等。10Gbit/s以下的以太网一般应用于局域网,而PPP、HDLC则应用于广域网范围内居多。

    TCP是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP还要处理端到端的流量控制。UDP是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。

    由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭

    令牌环网的设计

    高效利用率,但是容错不行,通过抢夺一个令牌互相发言

    以太网的设计点,直接发言,冲突了就随机等待,

    以太网的优点:简单,灵活

    以太网的缺点,不能控制流量和优先级,

    ip层

    ip层以下只认识mac地址,所以局域网内的查找需要先广播一次,然后记住ip对应的mac地址。

    一般查找dns的顺序是dns缓存->hosts文件->dns服务器

    端口:有两种,一种是硬件的路由的端口这种,另一种是应用层的逻辑端口,例如www是80端口。

    在基础层 无连接的技术 > 有链接的技术

    局域网中枢——以太网交换机

    通常情况下,网络中实际的数据流特性与人们在局域网普及之前的估计不同,如果要花大力气去研究数据流特征并用复杂的方案去应对每个细节,不如用一些简单的技术体制来满足大部分的要求。谁最简单?当然非以太网莫属喽!

    今天的全球以太网市场上,三巨头鼎力:思科网络、华为、惠普。

    这一设计简单、便捷、灵活性强,随时可以添加、删除主机,方便非专业人士组网。

    CSMA/CD(载波侦听多路复用-冲突检测),这是以太网的精髓所在!

    当今的以太网大都以以太网交换机为核心来进行网络连接和组织,这样,以太网的拓扑结构就成了星型。

    交换机记录的是每个mac地址的物理接口是哪个,路由器则是用路由表 二层交换机

    因此有人把VLAN称为“广播域”。

    在一个以太网内的主机,如果被划分在不同的VLAN里,他们之间的通信,必须经过路由设备(路由器或者三层交换机)进行

    勤奋的引路者——路由器

    路由器是组成IP网络最主要的选路设备

    路由器专门执行各种路由协议(后面章节将专门介绍路由协议),并进行数据包的转发工作。

    每台路由器都可以按照一定规则动态更新它的记忆,也就是更新自己的路由表(这叫动态路由)。

    核心路由器(也可称作“骨干层路由器”,CR)、汇聚路由器(有人称作“分发层路由器”,BR)和接入路由器(又称“访问层路由器”,AR)

    一般要采用控制部件热备份、双电源热备份、双数据通路等技术保障硬件可靠性。

    信息大脑——主机

    在IBM创立之初,该公司的主要业务是商用打字机、员工计时系统、磅秤(雷倒!)、自动切肉机(再次雷倒!),而后转为文字处理机、穿孔卡片设备等。第二次世界大战期间,IBM甚至还造过武器。 今天的IBM是一艘工业企业的超级航母,在多个领域都有很高造诣。

    不可否认的是,当前主流的操作系统都包含了大量的应用程序,Windows就自带各种游戏、记事本、写字板、网页浏览器(Internet Explorer)等,这些都是商业运作的需要,而非操作系统的初衷。

    人们按照数据模型原理,将数据库系统分成网状数据库、层次数据库和关系型数据库三类。

    IP世界的道路构成

    为了区分单模光纤和多模光纤,人们把单模光纤外套做成黄色,而多模光纤做成桔红色或者灰色。

    TCP/IP经营管理者

    世界上没有绝对的自由。哲学家说:自由是相对的,不自由是绝对的。 世界上没有绝对的开放。IP专家说:IP的开放是相对的。

    关键规则之一:以太网编码规则

    MAC地址长度为48位二进制,前24位由设备商标识符,后24位是设备商自行分配的序列号,常表示为12位的十六进制数。

    关键规则之二:IPv4地址的定义

    不带子网掩码的IP地址是无效的IP地址。

    10.0.0.0/8:10.0.0.0~10.255.255.255; 172.16.0.0/12:172.16.0.0~172.31.255.255; 192.168.0.0/16:192.168.0.0~192.168.255.255。

    关键规则之十一:安全法

    不安全是绝对的,安全是相对的。

    传输层的TCP协议被用来提供IP的可靠传输,但并非安全传输。

    安全问题和效率问题,都是相对的。网络建设者需要把握其中的尺度,避免造成资源浪费和用户体验度的降低。而之所以设计三层安全机制,就是从安全和效率两方面综合评估而制定的。

    关键规则之十二:网络地址转换法

    NAT英文全称是“Network Address Translation”

    LAN概述

    VLAN所指的LAN是广播域,即广播帧(目标MAC地址全部为1)所能传递到的范围,亦即能够直接通信的范围。

    常见中继设备介绍

    一个数据包从一台网络设备到另一台,端口号、源和目的IP地址在过程中不会改变,MAC地址会随之发生变化。

    三层交换就是二层交换技术+三层转发技术

    路由协议

    路由协议是为了满足路由器获取路由表的需要而制定的标准化协议

    应用

    移动互联网——为内容而战

    游戏、导航、音乐、视频、图片、电影、图书、管理软件……在应用商店里应有尽有。 苹果的创造性激发了全行业的思维模式的解放。步后尘的企业一个接着一个。

    PTV、OTT TV网络电视技术

    不论是IPTV还是OTT TV对广电冲击很大,原本电脑、手机、互联网都是工信部的天下,而电视屏幕、各种内容是广电总局的地盘,两者井水不犯河水,现在大家都看好客厅电视屏幕这一块市场,电信运营商搞IPTV,互联网公司搞“盒子”,吃肉吃到广电总局碗里来了,它当然坐不住了,绞尽脑汁,维护自己的利益。先是下发文件,要求:互联网电视集成平台不能与设立在公共互联网上的网站进行相互链接,不能将公共互联网上的内容直接提供给用户。互联网电视集成机构所选择合作的互联网电视终端产品,只能唯一连接互联网电视集成平台,终端产品不得有其他访问互联网的通道,不得与网络运营企业的相关管理系统、数据库进行连接。按照这个规定,盒子不能提供优酷、土豆、Youtube……的内容,甚至连上网浏览都是打擦边球。

    IPRAN分组传送技术

    人们白天在工作区上班,使用手机连上B基站上网(友情提醒,上班时候上网违反劳动纪律)

    云计算

    SaaS: 软件即服务,用户无需安装软件,而是用标准客户端(浏览器)即可使用软件服务,如Google Docs。

    IaaS: 基础设施即服务,用户无需购买硬件,而是租赁云计算提供商的基础设施,部署自己的OS,进行自己的计算,这里的用户一般是商业机构而不是终端消费者。IaaS最有名的提供商是亚马逊的AWS。

    PaaS:与IaaS类似,只是用户不再控制OS,而是利用云计算提供商提供的OS和开发环境做开发。

    物联网

    物联网(Internet of Things)是通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网连接起来,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络。

    SDN软件定义网络

    SDN的本质就是软件定义网络,也就是说希望应用软件可以参与对网络的控制管理,满足上层业务需求,通过自动化业务部署简化网络运维,这是SDN的核心诉求。

    其他思考

    对于这些知识,要了解到什么样的深度呢。取决于阅读的目的,或者是需要解决的问题,现在我就不需要详细阅读每一个实现的标准细节,但是又要了解具体的过程细节。

    我的目的就是解决游戏卡顿,了解网络标准的细节。