小结:

1、

因为您对OSI模型的教育中缺少的一点是,它最初设想每个人都在编写应用层(7)API而不是传输层(4)API。
应该有像应用程序服务元素之类的 东西,它们可以以标准方式处理文件传输和消息传递等不同应用程序。
我认为人们越来越多地转向这种模式,特别是谷歌用go,QUIC驱动,protobufs等。
我之所以提到这一点,是因为谷歌和微软之间的对比。
微软拥有一个流行的操作系统,因此它的创新是由它在该操作系统中的功能所驱动的。
谷歌的创新是由它可以放在操作系统之上的。
然后有Facebook和亚马逊自己必须在谷歌提供它们的堆栈之上(或之外)进行创新。

关于HTTP/3背后你所不知道的 https://www.jdon.com/50807

 18-11-20  banq
 
#http3     

HTTP / 3将标准化,作为一个老协议人,我想我会写一些评论。

谷歌拥有最受欢迎的网络浏览器(Chrome)和两个最受欢迎的网站(#1 Google.com#2 Youtube.com)。因此,他们可以控制未来的Web协议开发。他们的第一次升级称为SPDY(发音为“speedy”),最终标准化为HTTP的第二个版本,即HTTP/2。他们的第二次升级称为QUIC(发音为“quick”),标准化为HTTP/3。

主要网络浏览器(Chrome,Firefox,Edge,Safari)和主要网络服务器(Apache,Nginx,IIS,CloudFlare)已经支持SPDY(HTTP/2)。许多最受欢迎的网站都支持它(即使是非谷歌网站),尽管你不太可能在线上看到它(用Wireshark或tcpdump嗅探),因为它总是用SSL加密。虽然标准允许HTTP/2通过TCP运行原始,但所有实现仅通过SSL使用它。

这里有一个关于标准的好教训。在互联网之外,标准通常是法律上的由政府管理,驱动所有主要利益相关者进入一个房间并将其拟定出来,然后使用规则迫使人们采用它。在互联网上,人们首先创建实现一个新事物,然后如果其他人喜欢它,他们也会开始使用它,因此,标准通常是事实上的。

RFC是针对已经在互联网上运行良好的内容编写的,记录了人们已经在使用的内容。浏览器/服务器采用SPDY不是因为它是标准化的,而是因为主要参与者开始使用它。QUIC正在发生同样的事情:它被标准化为HTTP/3的事实反映了它已被使用,而不是处于通往标准化实施里程碑阶段。

QUIC实际上是新版本的TCP(TCP / 2 ???)而不是新版本的HTTP(HTTP / 3)。它并没有真正改变HTTP / 2的作用,而是改变了传输的工作方式。因此,我在下面的评论侧重于传输问题而不是HTTP问题。

HTTP3主要特点是更快的连接设置和延迟

TCP需要在建立连接之前来回发送多个数据包。SSL再次需要在建立加密之前来回发送许多数据包。如果有很多网络延迟,例如当人们使用具有半秒ping时间的卫星互联网时,建立连接可能需要相当长的时间。通过减少往返次数,连接可以更快地进行设置,因此当您单击链接时,链接的资源会立即弹出

带宽

网络连接的源和目标之间始终存在带宽限制,这几乎总是由于拥塞。双方都需要发现一种速度级别,以这个速度他们能够以合适的速率发送数据包。发送数据包太快也不行,会被丢弃,导致其他人拥塞更多,这样并不会提高传输速率。发送数据包太慢也不行,意味着网络使用不当。

HTTP传统上这一点实现得很糟糕,使用单个TCP连接不适用于HTTP,因为与网站的交互需要同时传输多个内容,因此浏览器会打开多个连接(通常为6个)。但是,这会打破带宽估计,因为每个TCP连接都尝试独立完成,就像其他连接不存在一样。SPDY通过其多路复用  功能解决了这个问题,该功能将浏览器/服务器之间的多个交互放入一个连接。

QUIC扩展了这种多路复用,使得处理浏览器/服务器之间的多个交互变得更加容易,而没有任何一个交互阻止另一个交互,但都具有同样的带宽。从用户的角度来看,这将使交互更加顺畅,同时减少路由器遇到的拥塞。

用户模式堆栈

TCP的问题,特别是在服务器上,是TCP连接由操作系统内核处理,而服务本身在usermode中运行。跨内核/用户模式边界移动会导致性能问题。跟踪大量TCP连接会导致可伸缩性问题。有些人尝试将服务放入内核,以避免转换,这是一个糟糕的,因为它破坏了操作系统的稳定性。我自己的解决方案,使用BlackICE IPS和masscan,就是使用 硬件的用户模式驱动程序,将数据包从网络芯片直接传送到用户模式进程,绕过内核(参见PoC || GTFO#15),使用我自己的自定义TCP堆栈。近年来,这已成为DPDK的流行 套件。

但是,从TCP迁移到UDP可以在没有用户模式驱动程序的情况下获得相同的性能。 您可以调用recvmmsg()  一次接收一堆UDP数据包,而不是调用众所周知的recv()函数来一次接收一个数据包。它仍然是内核/用户模式转换,但是一次性收到的一百个数据包的开销,而不是每个数据包的转换。

在我自己的测试中,使用典型的recv()  函数限制为大约500,000 UDP /秒,但使用recvmmsg()和其他一些优化(使用RSS的多核),你可以在低端四核服务器上获得5,000,000 UDP /秒。由于每个核心的扩展性很好,因此迁移到具有64个核心的强大服务器应该可以进一步改进。

BTW,“RSS”是网络硬件的一项功能,它将传入的数据包分成多个接收队列。

多核可扩展性的最大问题是两个CPU核心需要同时读取/修改同一个东西,因此共享相同的UDP队列成为最大的瓶颈。

因此,首先英特尔和其他以太网供应商添加了RSS,为每个核心提供了自己的非共享数据包队列。Linux和其他操作系统升级UDP以支持单个套接字(SO_REUSEPORT)的多个文件描述符来处理多个队列。

现在,QUIC使用这些发展成果,允许每个核心管理自己的UDP数据包流,而没有与其他CPU核心共享内容的可扩展性问题。我之所以提到这一点,是因为我亲自与英特尔硬件工程师讨论过在2000年有多个数据包队列问题。这是一个常见的问题,也是一个明显的解决方案,在过去的二十年中,它看起来很有趣,直到它出现在高端的HTTP / 3。

如果没有网络硬件中的RSS,QUIC就不太可能成为标准。

移动支持

当您将笔记本电脑移动到不同的WiFI网络或随手机移动时,您的IP地址可能会发生变化。操作系统和协议不能正常关闭旧连接并打开新连接。但是,对于QUIC,连接的标识符不是“套接字”(源/目标端口/地址协议组合)的传统概念,而是分配给连接的64位标识符。

这意味着,当您四处移动时,即使IP地址发生变化,您也可以继续从YouTube不间断地继续流式传输,或者继续进行视频电话呼叫,而不会被丢弃。几十年来,互联网工程师一直在努力解决“移动IP”问题,试图提出一个可行的解决方案。他们专注于端到端原则,以便在您移动时以某种方式保持一个恒定的IP地址,这不是一个实际的解决方案。很高兴看到QUIC / HTTP / 3最终通过现实世界中的工作解决方案来解决这个问题。

如何使用这种新的运输?几十年来,网络编程的标准一直是传输层API,  称为“套接字”。你调用recv()之类的函数的地方 在您的代码中接收数据包。使用QUIC / HTTP / 3,我们不再拥有操作系统传输层API。相反,它是一个更高层的功能,您可以在go  编程语言中使用,或者在OpenResty nginx Web服务器中使用Lua。

我之所以提到这一点,是因为您对OSI模型的教育中缺少的一点是,它最初设想每个人都在编写应用层(7)API而不是传输层(4)API。应该有像应用程序服务元素之类的 东西,它们可以以标准方式处理文件传输和消息传递等不同应用程序。我认为人们越来越多地转向这种模式,特别是谷歌用goQUIC驱动,protobufs等。

我之所以提到这一点,是因为谷歌和微软之间的对比。微软拥有一个流行的操作系统,因此它的创新是由它在该操作系统中的功能所驱动的。谷歌的创新是由它可以放在操作系统之上的。然后有Facebook和亚马逊自己必须在谷歌提供它们的堆栈之上(或之外)进行创新。按顺序排名世界排名前五的公司是Apple-Google-Microsoft-Amazon-Facebook,因此每个公司推动创新都很重要。

结论

当TCP在20世纪70年代创建时,它是崇高的。它处理的事情,如拥塞,比竞争协议要好得多。从IPv4到IPv6的升级在很大程度上保持了IP的优势;从TCP到QUIC的升级同样基于TCP的优点,但将其扩展到现代需求。实际上,令人惊讶的是,TCP已经持续了这么长时间没有升级。

移动IP 它最初设想每个人都在编写应用层(7)API而不是传输层(4)API 对于QUIC,连接的标识符不是“套接字”(源/目标端口/地址协议组合)的传统概念,而是分配给连接的64位标识符的更多相关文章

  1. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  2. [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...

  3. socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...

  4. socket套接字(字节序、地址转换)

    什么是socket: socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上 不同主机之间的进程通信.IPv4套接口地址结构 struc ...

  5. 国产网络测试仪MiniSMB - 如何3秒内创建出16,000条源/目标MAC地址号递增流

    国产网络测试仪MiniSMB(www.minismb.com)是复刻smartbits的IP网络性能测试工具,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太 ...

  6. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  7. 从HTTP 2.0想到的关于传输层协议的一些事

    0.HTTP协议的历史 我也不知道... 1.关于HTTP 2.0 收到了订阅的邮件,头版是说HTTP 2.0的内容,我本人不是非常关注HTTP这一块儿.可是闲得无聊时也会瞟两眼的.HTTP 2.0的 ...

  8. http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解

    1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...

  9. 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程

    一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...

随机推荐

  1. flexbox父盒子align-items属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 使用 requests 访问 HTTPS

    当我们访问 HTTPS 的网站时,需要进行证书验证,在浏览器中可以自动处理验证问题,在 Python 中有以下两种做法: import requests //不进行证书验证,但这种方式会出现警告,如下 ...

  3. Unity绘制Png图片

    using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...

  4. 《转》Robot Framework 的安装配置和简单的实例介绍

    Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ...

  5. select选择option时触发的click事件google不兼容问题

    原先的方式,下面代码编写的问题在google浏览器下是触发不了click事件的,具体缘由不清楚,反正都可以概括为不兼容了 碰到问题时,百度到的一篇解决:http://blog.163.com/rihu ...

  6. 获取对象属性值=NPOI EXPORT

    使用dll ==== NPOI.dll 获取属性,设置属性=参考:http://blog.csdn.net/cestarme/article/details/6548126 额外的: 导出的时候碰到一 ...

  7. Linux设备驱动剖析之SPI(二)

    957至962行,一个SPI控制器用一个master来描述.这里使用SPI核心的spi_alloc_master函数请求分配master.它在drivers/spi/spi.c文件中定义: struc ...

  8. python爬虫---->scrapy的使用(一)

    这里我们介绍一下python的分布式爬虫框架scrapy的安装以及使用.平庸这东西犹如白衬衣上的污痕,一旦染上便永远洗不掉,无可挽回. scrapy的安装使用 我的电脑环境是win10,64位的.py ...

  9. Esper学习之十二:EPL语法(八)

    今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...

  10. spring mvc 跨域请求处理——spring 4.2 以上

    Controller method CORS configuration You can add to your @RequestMapping annotated handler method a  ...