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.为什么多个客户端可以连接同一个服务器端口
参考:https://blog.csdn.net/qq_25665807/article/details/77884936
4.通信阶段:传递消息
当套接字连接起来后,套接字即可完成传递操作:
①首先用户输入网址生成的HTTP请求消息(发送数据)
②调用write时候,需要指定些描述符和发送数据,然后委托协议栈将数据发送到服务器
③接下来,服务器收到树,并返回给客户端响应消息。
④客户端通过Socket库中的read程序组件委托协议栈接受响应消息,并存放在缓冲区内。
5.断开阶段:收发数据结束
收发数据结束,Socket库的close组件将断开,最终管道断开。
在HTTP1.0工作中, 文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送请求消息、接收响应消息、断开的过程。因此一个网页包含很多图片,就必须冲断多次连接、收发数据、断开操作,非常麻烦。而在HTTP1.1协议中,当所有数据都请求完成后,浏览器会主动触发断开连接的操作。