我想知道网络浏览器是如何工作的。我刚刚查看了我的网络教科书。以下是我狂野的想象和问题。
Web浏览器通常使用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编码,应具有更好的性能。 (如果我错了,请纠正我。)
我可能为上述问题和声明选择了一个糟糕的标题。
我希望主持人不要把这个问题作为主题。
非常感谢。
答案 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字符串中的数据,并将其重新组合到资源中。由于需要完成的复杂代码和处理,这是不可能的,但是可能。
至于你对网络通信的分析,对我来说似乎非常正确。