输入URL后浏览器侧处理之委托协议栈发送消息

2022-06-30  本文已影响0人  robot_test_boy

浏览器侧的处理流程包含输入URL,到生成请求消息,再到域名解析,最后委托操作系统发出消息。本文仅总结委托操作系统发出消息的过程。

知道IP地址之后,就可以委托操作系统内部的协议栈向这个web服务器的目标IP地址发送消息了。要发送给Web服务器的HTTP消息是一种数字信息(digital data),收发数字信息这一操作不仅限于浏览器,对于各种使用网络的应用程序来说都是共通的。

向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件。

在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。我们需要先创建套接字,然后再将套接字连接起来形成管道。

首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道。当服务器进入等待状态时,客户端就可以连接管道了。

客户端同样要先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。当双方的套接字连接起来之后,通信准备就完成了。只要将数据送入套接字就可以收发数据了。

当数据全部发送完毕之后,连接的管道将会被断开。管道在连接时是由客户端发起的,但在断开时可以由客户端或服务器任意一方发起。其中一方断开后,另一方也会随之断开,当管道断开后,套接字也会被删除。

注意:实际上,管道切断的顺序是根据应用程序的规则来决定的。在Web中,断开顺序根据HTTP版本的不同而不同,在HTTP1.0中,当服务器向客户端发送完所有Web数据之后,服务器一方会断开管道。

收发数据的操作大致分为4个阶段

(1)创建套接字(创建套接字阶段)

(2)将管道连接到服务器端的套接字上(连接阶段)

(3)收发数据(通信阶段)

(4)断开管道并删除套接字(断开阶段)

在每个阶段,Socket库中的程序组件都会被调用来执行相关的数据收发操作。

这4个操作都是由操作系统中的协议栈来执行的,浏览器等应用程序并不会自己去做连接管道、放入数据这些工作,而是委托协议栈来代劳。

创建套接字阶段

套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中。描述符是用来识别不同的套接字的。可以将描述符理解成给某个套接字分配的编号。

同一台计算机上可能同时存在多个套接字,就需要一种方法来识别出某个特定的套接字,这种方法就是描述符。

客户端和服务器之间收发数据操作的情形
连接阶段:把管道接上去

应用程序通过调用Socket库中connect的程序组件,将客户端创建的套接字与服务器那边的套接字连接起来。这里的要点是当调用connect时,需要指定描述符、服务器IP地址和端口号这3个参数。

描述符,在创建套接字的时候由协议栈返回的那个描述符。connect会将应用程序指定的描述符告知协议栈,然后协议栈根据这个描述符来判断到底使用哪一个套接字去和服务器端的套接字进行连接,并执行连接的操作。

同时指定IP地址和端口号时,就可以明确识别出某台具体的计算机上的某个具体的套接字。如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制。

通信阶段:传递消息

当套接字连接起来之后,只要将数据送入套接字,数据就会被发送到对方的套接字中。当然,应用程序无法直接控制套接字,因此还是要通过Socket库委托协议栈来完成这个操作。这个操作需要使用write这个程序组件。

首先,应用程序需要在内存中准备好要发送的数据。根据用户输入的网址生成的HTTP请求消息就是我们要发送的数据。接下来,当调用write时,需要指定描述符和发送数据然后协议栈就会将数据发送到服务器。由于套接字中已经保存了已连接的通信对象的相关信息,所以只要通过描述符指定套接字,就可以识别出通信对象,并向其发送数据。接着,发送数据会通过网络到达我们要访问的服务器

接下来,服务器执行接收操作,解析收到的数据内容并执行相应的操作,向客户端返回响应消息。

当消息返回后,需要执行的是接收消息的操作。接收消息的操作是通过Socket库中read程序组件委托协议栈来完成的。调用read时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区

当服务器返回响应消息时,read就会负责将接收到的响应消息存放到接收缓冲区中。由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。

断开阶段:收发数据结束

当浏览器收到数据之后,收发数据的过程就结束了。需要调用Socket库的close程序组件进入断开阶段。最终,连接在套接字之间的管道会被断开,套接字本身也会被删除。

HTTP协议将HTML文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送请求消息、接收响应消息、断开的过程。因此,如果一个网页中包含很多张图片,就必须重复进行很多次连接、收发数据、断开的操作。对于同一台服务器来说,重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在一次连接中收发多个请求和响应的方法。在HTTP版本1.1中就可以使用这种方法,在这种情况下,当所有数据都请求完成后,浏览器会主动触发断开连接的操作。

本文摘取自周自恒翻译的户根勤编写的《网络是怎样连接的》。

上一篇下一篇

猜你喜欢

热点阅读