认识Web浏览器(五)——委托协议栈发送消息
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
委托协议栈发送消息(数字信息)
数据收发
- 收发数字信息的过程和向DNS服务器查询IP地址的操作都适用于任何网络应用程序。
- 需要按照指定顺序调用Socket库中的多个程序组件
- 图解:
- 因此可以把数据通道类比成管道:
(1)建立管道:
理论上关键在两端的数据出入口——套接字,再将套接字连接形成管道。
实际中服务器创建套接字,等待客户端连接套接字形成管道,客户端也创建套接字,继而延申出管道最终连接在服务器的套接字上。
(2)操作结束
管道断开,可以由客户端或服务器任意一方发起,断开后删除套接字。
(3)整个阶段都是由操作系统的协议栈完成
创建套接字(创建套接字阶段)
将管道连接到服务器端的套接字上(连接阶段)
收发数据(通信阶段)
断开管道并删除套接字(断开阶段)
创建套接字
1.即要调用 Socket 库中的 socket 程序组件。
2.当有多个套接字时,应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的。
连接管道
应用程序通过调用 Socket 库中的名为 connect 的程序组件来完成这一操作。这里的要点是当调用 connect 时,需要指定描述 符、服务器 IP 地址和端口号这 3 个参数。
三个参数:
第 1 个参数,即描述符,
-. 就是在创建套接字的时候由协议栈返回的那个描述符。
-. connect 会将应用程序指定的描述符告知协议栈,然后协议栈根据这个描述符来判断到底使用哪一个套接字去和服务器端的套接字进行 连接,并执行连接的操作 。
-. 当调用 Socket 库中的程序组件时,应用程序所指定的参数会通过 Socket 库的程序组件传递给协议栈,并由协议栈来实际执行相应的操作。
第 2 个参数,即服务器 IP 地址,
-. 通过 DNS 服务器查询得到的我们要访问的服务器的 IP 地址。
第 3 个参数,即端口号
-. 如果连接操作的对象是某个具体的套接字,必须要识别到具体的套接字。
-. 端口号就是这样一种方式。当同时指定 IP 地址和端口号时,就可以明 确识别出某台具体的计算机上的某个具体的套接字。
服务器上所使用的端口号是根据应用的种类事先规定好的,仅此而已。比如 Web 是 80 号端口,电子邮件是 25 号端口。
传递消息
发送消息通过 Socket 库委托协议栈使用 write 这个程序组件。
接收消息通过 Socket 库中的 read 程序组件委托协议栈来完成的。
- write
应用程序需要在内存中准备好要发送的数据。根据用户输入的网址生成的 HTTP 请求消息。当调用 write 时,指定描述符和发送数据(图 1.18 ③),协议栈再将数据发送到服务器。
由于套接字中已经保存了已连接的通信对象的相关信息,所以只要通过描述符指定套接字, 就可以识别出通信对象,并向其发送数据。
发送数据会通过网络到达我们要访问的服务器。 服务器执行接收操作,解析收到的数据内容并执行相应的操作,向客户端返回响应消息 。
- read
调用 read 时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。
当服务器返回响应消息时,read 负责将接收到的响应消息存放到接收缓冲区中。
注:由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。
断开管道
即调用 Socket 库的 close 程序组件进入 断开阶段(图 1.18 ④)。
连接在套接字之间的管道会被断开,套接字本身也会被删除。
断开的过程:
Web 使用的 HTTP 协议规定,当 Web 服务器发送完响应消息之后,应该主动执行断开操作 ,因此 Web 服务器会首先调用 close 来断开连接。断开操作传达到客户端之后,客户端的套接字也会进入断开阶段。接下来,当浏览器调用 read 执行接收数据操作时,read 会告知浏览器收发数据操作已结束,连接已经断开。浏览器得知后,也会调用 close 进入断开阶段。

浙公网安备 33010602011771号