关于网页浏览器和文件下载/上传的问题?

时间:2010-12-27 15:30:57

标签: networking network-programming browser

我想知道网络浏览器是如何工作的。我刚刚查看了我的网络教科书。以下是我狂野的想象和问题。

Web浏览器通常使用HTTP协议。所以第一个问题是:

  • 谁负责支持HTTP协议?

我认为HTTP协议应该在Web浏览器中实现,而TCP,UDP,IP等协议应该在OS中实现。这就是HTTP协议被称为 应用程序级协议 的原因。 (如果我错了,请纠正我。

回到HTTP通信场景。

在客户端

当在Web浏览器中键入地址时,Web浏览器将选择正确的HTTP方法并制作完整的HTTP请求。此HTTP请求只是纯ASCII文本。然后浏览器选择一个专用端口号,并使用TCP协议将文本位流发送到服务器。在此过程中,如果URL不是IP地址,则进行DNS查询。

在服务器端

当某个TCP数据包到达服务器时,会检查它是否以80端口为目标。如果是这样,它将被传递到服务器进程,现在TCP协议已完成其工作,并且是服务器程序开始运行的时候了。服务器程序需要实现HTTP协议,以便它可以解析从TCP数据包中提取的客户端浏览器的HTTP请求。然后将必要的HTML文件返回给客户端。这些HTML文件可以是静态的,也可以使用ASP.NET等技术动态生成。

上传和下载文件的情况下,我认为可以有两种不同的方法。

  • 无论文件的格式是什么,我们都可以将它们编码为Base64字符串,因此我们可以将它们作为网页的一部分嵌入。我想知道是否可以将jpeg文件编码为Base64字符串并将其嵌入网页中。(如果我错了,请纠正我。

  • 另一种方法不是将文件内容嵌入网页,而是直接使用TCP连接进行传输。此方法不需要Base64编码,应具有更好的性能。 (如果我错了,请纠正我。

我可能为上述问题和声明选择了一个糟糕的标题。

我希望主持人不要把这个问题作为主题。

非常感谢。

3 个答案:

答案 0 :(得分:2)

我看到一些我相信的事情不是百分之百正确......

  

然后浏览器选择一个专用端口号,并使用TCP协议将文本位流发送到服务器。

这里似乎你说浏览器选择一个本地端口并将其分配给正在打开的TCP流,这是不正确的,因为操作系统是跟踪已使用/未使用的端口,并将端口分配给流何时建立新连接。

  

当某个TCP数据包到达服务器时,会检查它是否以80端口为目标。如果是这样,它将被传递到服务器进程,现在TCP协议已经完成了它的工作,现在是服务器程序开始运行的时候了。

这里我看到两个细节:首先,从文本看来,单个TCP数据包包含所有HTTP消息,这可能不是真的(由于多种原因,它可能在许多TCP数据包中被拆分,但主要是因为数据包具有固定的最大长度,并且消息可能长于该长度)。其次,假设Web服务器在端口80上运行,这通常是这种情况,但并非总是如此,例如我相信Apache Tomcat Web Server的默认端口是8080,并且在大多数情况下是Web服务器的端口可以配置监听(我不知道任何100%固定到特殊端口的网络服务器)。

最后,当你说

  

当在Web浏览器中输入地址时,Web浏览器将选择正确的HTTP方法并制作完整的HTTP请求。

我认为在这种特殊情况下(用户键入地址并按下回车),浏览器将始终选择GET方法,因为在向服务器提交信息时使用POST。

起初,HTTP非常简单,但有很多细节会增加它的复杂性。我远不是这方面的专家,但也许这可以帮助进一步:) http://www.faqs.org/rfcs/rfc2616.html

答案 1 :(得分:1)

TCP是一种传输协议。它描述了如何从一个网络点到另一个网络点获取任意数据流。这几乎是每个网络应用程序都需要做的事情,所以将它内置到操作系统中是有意义的(不用考虑,但现在每个流行的操作系统都是标准的)。

在两台机器/应用程序之间进行数据交换还不够 - 他们需要就如何格式化数据(协议)达成一致。数据的格式化方式有很多种,最佳方式取决于数据类型和应用类型。

HTTP专门设计为TCP之上的请求/响应协议,但它可以在任何传输协议上运行。您不需要在HTTP中使用base64数据,因为收件人无需检查数据有效负载以查找何时结束,有效负载可以包含任何内容。 HTTP使用长度标头来通知收件人邮件包含多少数据。

其他应用程序可能会选择其他协议来放在TCP之上。例如,除了响应请求之外,HTTP无法允许服务器向客户端发送消息。如果需要,另一种协议会更适合,这就是websockets试图实现的目标。

答案 2 :(得分:0)

仅回答您关于文件上传/下载的问题:

如果仅限于HTTP,则文件下载通常由浏览器发送,该链接指向可下载文件的链接,在该文件上为该内容发送GET请求。数据通过HTTP连接以与发送网页相同的方式发送。

对于文件上传,最常见的情况是表单提交;用户选择一个文件作为表单的一部分。单击提交按钮后,浏览器会向服务器发送POST。作为POST的一部分,分配了分隔符字符串,并且在分隔符字符串之间发送文件的字节,以便服务器可以识别它。

还有其他选择,但这些选项最常见。

没有内置到HTTP的方式来支持将文件作为base64字符串加载。网页中包含的文件(如图片)在单独的请求中请求:使用GET请求检索每个资源。但是,可以使用javascript解析包含的base64字符串中的数据,并将其重新组合到资源中。由于需要完成的复杂代码和处理,这是不可能的,但是可能。

至于你对网络通信的分析,对我来说似乎非常正确。