1.1 数据收发数据概览
知道了IP地址,就可以委托操作系统内部的协议栈向这个目标IP地址,也就是要访问的Web服务器发送消息。这一过程需要按照指定的顺序来调用Socket库中的程序组件。收发数据的两台计算机之间连接了一条数据通道,数据的流动是双向的。要建立连接的通道,需要向建立通道两端的数据出入口,这些出入口称为套接字。
首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道。当服务器进入等待状态时,客户端就可以连接管道。客户端也会创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。连接是客户端发起,但是断开时可以由客户端或者服务器任意一方发起。一方断开,另一方也会随之断开,当管道断开后,套接字也会被删除。
收发数据可以分为以下4个阶段:
- 1 创建套接字(创建套接字阶段)
- 2 将管道连接到服务器的套接字上(连接阶段connect)
- 3 收发数据(通信阶段write,read)
- 4 断开管道并删除套接字(断开阶段close)
�创建套接字阶段:创建套接字是调用Socket库中的socket程序组件,如同调用解析器向DNS服务器查询IP一样。创建完成后,协议栈会返回一个描述符,描述符是用来识别不同套接字的。计算机可以同时进行多个数据的通信操作,比如打开两个个浏览器窗口可能就是访问两台Web服务器,也就是需要创建两个不同的套接字。应用程序是通过描述符来设别套接字的。
连接阶段:通过调用Socket库中connect的程序组件来完成。调用connect时,需要指定描述符、服务器IP地址和端口号3个参数。
IP地址是为了区分网络中各个计算机而分配的数值。但是,连接操作的对象是某个具体的套接字,而端口号就是用来让通信的另一方能够识别出套接字的机制。描述符则是用来在一台计算机内部识别套接字的机制。当同时指定IP地址和端口号时,就可以明确识别出某台具体的计算机上的某个具体的套接字。服务器上所使用的端口号是根据应用的种类事先规定好的,比如Web是80号端口,电子邮件是25号端口。
总结:描述符:应用程序用来识别套接字的机制。IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制。
通信阶段:根据用户输入的网址生成HTTP请求消息就是我们要发送的数据。接下来调用Socket库的write组件时,需要指定描述符和发送数据,然后协议栈就会将数据发送到服务器。接下来,服务器执行接收操作,解析收到的数据内容并执行相应的操作,向客户端返回响应消息。当消息返回后,客户端接收消息的操作是通过Socket库中的read程序组件委托协议栈来完成。read负责将接收到的响应消息存放到接收缓冲区中。
断开阶段:当浏览器收到数据后,收发数据的过程就结束了。接下来,需要调用Socket库的close程序组件进入断开阶段。最终,连接的套接字之间的通道和套接字本身都会被删除。