探索浏览器(四) 委托协议栈发送消息
1.数据收发操作
见图 1.17,收发数据的两台计算机之间连接了一条数据通道。将数据通道想象成一条管道,数据可输入管道达到另一端,且这个管道是双向的。
总体来说收发过程分成四个阶段:
(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)
管道在连接时由客户端发起,断开时由双方。
2.创建套接字阶段
类似于访问 DNS 服务器一样,我们也需要调用 Socket 库特定程序组件。访问 DNS 服务器时,我们调用一个叫 gethostbyname 的程序组件(解析器),那么这次我们会按一定顺序调用 Socket 组件(图 1.18):
① 首先创建套接字,我们调用 Socket 库的 socket 程序组件即可,同调用解析器过程一样。
② 创建完后,协议栈返回描述符用来识别不同的套接字,即每一个数据收发操作都有不同的套接字。
③ 接下进入连接阶段,见第三节。
3.连接阶段:把管道接上去
现在需要把客户端的套接字和服务器端的套接字连接起来。通过 Socket 库中的 connect 组件可完成,它需要指定描述符、服务器 IP 地址和端口号这三个参数。
① 描述符
② 服务器 IP 地址:之前通过 DNS 服务器已经解析到了。
③ 端口号:由于客户端和服务器可以有多个套接字,仅凭 IP 地址无法识别是哪个套接字,所以再加上套接字即可完成。
【补充:描述符和端口号区别】
(1)描述符:应用程序用来识别本机套接字的机制(例如客户端可以有多个应用程序创建套接字,并连接不同的服务器。用描述符来识别属于本程序的套接字) (2)IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制(不同服务器有规定的端口号,如 Web 服务器规则为 80 端口,而客户端调用协议栈发放数据时,协议栈会随机分配一个端口号)
eg.为什么多个客户端可以连接同一个服务器端口
参考://blog.csdn.net/qq_25665807/article/details/77884936
4.通信阶段:传递消息
当套接字连接起来后,套接字即可完成传递操作:
① 首先用户输入网址生成的 HTTP 请求消息(发送数据)
② 调用 write 时候,需要指定些描述符和发送数据,然后委托协议栈将数据发送到服务器
③ 接下来,服务器收到树,并返回给客户端响应消息。
④ 客户端通过 Socket 库中的 read 程序组件委托协议栈接受响应消息,并存放在缓冲区内。
5.断开阶段:收发数据结束
收发数据结束,Socket 库的 close 组件将断开,最终管道断开。
在 HTTP1.0 工作中, 文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送请求消息、接收响应消息、断开的过程。因此一个网页包含很多图片,就必须冲断多次连接、收发数据、断开操作,非常麻烦。而在 HTTP1.1 协议中,当所有数据都请求完成后,浏览器会主动触发断开连接的操作。