我试图了解HTTP服务器和客户端内部的基本知识,了解它们如何传输数据。我已经阅读了很多关于HTTP如何工作的文章,但我没有找到任何可以回答我的一些问题的文章。 我想通过加载网页的过程来理解它,如果你让我注意到我弄错了,我将不胜感激。
当我访问某个网站时,我的浏览器会向服务器请求一个HTML文件,为此我的浏览器会创建一个套接字,将其绑定到我的ip地址,并将其连接到该网站服务器的监听套接字我正在参观。为了将浏览器的套接字连接到服务器,我需要端口号和主机名,端口号为80,因为这是HTTP,主机名是通过DNS解析获得的。现在,套接字之间存在连接,我的浏览器发送GET请求。该请求是一个ASCII文件,其内容对应于HTTP请求。我的浏览器将ASCII原始字节写入套接字并写入服务器的套接字。
服务器将我请求的HTML文件写回套接字。服务器发送的HTML只是一个ASCII文件,服务器将逐字节写入套接字。
我的浏览器收到ASCII文件并解析它。让我们假设它找到了一个图像标签。浏览器发送该图像文件的HTTP请求。这是我不明白的事情。服务器如何响应?据我所知,服务器必须发回一个由一组标题后跟一个CRLF形成的ASCII文件,然后发送消息正文。在这种情况下,假设我的浏览器要求.jpeg,服务器是否将头文件作为ASCII明文写入套接字,然后将图像的原始字节写入套接字?
如果HTML文件有多个图像,我们是否为每个图像(每个请求)打开一个套接字?
让我们假设我的浏览器现在找到了一个javascript标记。当服务器回答我对该脚本的请求时,服务器是否将脚本源的ASCII字节写入套接字? js库会发生什么?服务器是否必须为每个源代码发送所有源代码?
在向套接字写入数据时:写(2)是在套接字之间进行所有这些写操作的正确方法吗?
关于大文件的传输:如果我点击网站上允许我下载大型PDF的按钮,服务器如何完成?我假设服务器试图将其传输成碎片。据我所知,有一个chunked编码选项。这是这样的吗?如果是,是将文件分成块,并将这些文件附加到ASCII响应中并逐字节写入套接字?
最后,视频如何传输?我知道视频编码和传输需要整本书才能得到详细解释,但如果你能说一下视频传输的一般性(例如在youtube中),我将不胜感激。
您可以在套接字级别上谈论有关HTTP的任何内容。感谢。
答案 0 :(得分:1)
下面我的所有答案都与HTTP / 1.1有关,而不是HTTP / 2:
3.-我的浏览器收到ASCII文件并解析它。让我们假设它找到了一个图像标签。浏览器发送该图像文件的HTTP请求。这是我不明白的事情。服务器如何响应?据我所知,服务器必须发回一个由一组标题后跟一个CRLF形成的ASCII文件,然后发送消息正文。在这种情况下,假设我的浏览器要求.jpeg,服务器是否将头文件作为ASCII明文写入套接字,然后将图像的原始字节写入套接字?
是的,通常是这样。它可能以不同的格式(gzip,brotli)编码,或者如果未设置Content-Length
则可能会被分块。
4.-如果HTML文件有多个图像,我们是否为每个图像(每个请求)打开一个套接字?
在HTTP / 1现代浏览器中,每个主机最多可以打开6个插槽但不能更多。如果有超过6个请求进入同一主机,它将等待直到收到其他响应。
5.-让我们的浏览器现在找到一个javascript标签。当服务器回答我对该脚本的请求时,服务器是否将脚本源的ASCII字节写入套接字? js库会发生什么?服务器是否必须为每个源代码发送所有源代码?
通常是的,每个javascript文件需要1个http请求。有一些服务器端工具将javascript源及其依赖项组合在一个javascript“文件”中。请注意,javascript源通常是UTF-8,而不是ASCII。
6.-在向套接字写入数据时:写(2)是在套接字之间进行所有这些写入的正确方法吗?
说不上!不是C家伙
7.-关于大文件的传输:如果我点击网站上允许我下载大型PDF的按钮,服务器如何完成?我假设服务器试图将其传输成碎片。据我所知,有一个chunked编码选项。这是这样的吗?如果是,是否将文件分成块,并将这些文件附加到ASCII响应中并逐字节写入套接字?
不,chunked
用于HTTP响应,其内容长度未提前知道。您正在谈论的“拆分”是在IP / TCP级别上完成的,而不是在HTTP协议级别上完成的。从HTTP的角度来看,它只是一个连续的流。
最后,视频是如何传播的?我知道视频编码和传输需要整本书才能获得详细的解释,但如果你能说一下视频传播的一般性(例如在youtube中),我将不胜感激。
对我来说太宽泛了。
答案 1 :(得分:0)
HTTP,套接字,流媒体和包传输是不同的主题。
HTTP是一种请求或发送数据的通信协议。 Web开发人员不会定期使用套接字,因为它们不是非常网络友好,因为需要持久连接。您的浏览器如何管理HTTP请求通常不应该是您真正关心的问题。
对于像视频这样的大块数据,流式传输可能是最好的技术,因为您不需要在客户端和服务器之间进行同步,或者像套接字一样需要始终有效的连接。 流式传输的方式仅取决于您和服务器上用于共享内容的语言。
如果您想了解有关HTTP的更多信息,建议您阅读一些关于RFC RFC 7230或RFC 7231的内容。 要了解数据的传输方式,您应该真正了解Abstraction Layers的基础,对于视频流,您可能会学习如何使用NodeJ制作一个视频流服务器(您可能会选择您喜欢的另一种语言),或者只是搜索并安装一个已经为你完成这项工作的NPM软件包。