网络是怎样链接的-委托协议栈发送消息

1.4 委托协议栈发送消息

1.4.1 数据收发操做概览

得到 IP 地址后,就能够委托操做系统内部的协议栈向这个目标 IP地址,也就是咱们要访问的 Web 服务器发送消息。git

要发送给 Web 服务器的 HTTP 消息是一种数字信息(digital data),所以也能够说是委托协议栈来发送数字信息。浏览器

这一操做的过程也不只适用于Web,而是适用于任何网络应用程序。和向 DNS 服务器查询 IP 地址的操做同样,这里也须要使用 Socket 库中的程序组件。服务器

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

收发数据操做的总体思路

使用 Socket 库来收发数据的操做过程以下图所示 。图中展现的是用 TCP 协议来收发数据的过程,还有另一种名为UDP的协议socket

简单来讲,收发数据的两台计算机之间链接了一条数据通道,数据沿着这条通道流动,最终到达目的地。spa

 

在进行收发数据操做以前,双方须要先创建起这条管道才行。操作系统

创建管道的关键在于管道两端的数据出入口,这些出入口称为套接字。设计

咱们须要先建立套接字,而后再将套接字链接起来造成管道。对象

创建链接的具体流程blog

首先,服务器一方先建立套接字,而后等待客户端向该套接字链接管道。当服务器进入等待状态时,客户端就能够链接管道了。

客户端也会先建立一个套接字,而后从该套接字延伸出管道,最后管道链接到服务器端的套接字上。

当双方的套接字链接起来以后,通讯准备就完成了。接下来只要将数据送入套接字就能够收发数据。

收发数据操做结束时的情形

当数据所有发送完毕以后,链接的管道将会被断开。

管道在链接时是由客户端发起的,但在断开时能够由客户端或服务器任意一方发起。

其中一方断开后,另外一方也会随之断开,当管道断开后,套接字也会被删除。

到此为止,通讯操做就结束了。

收发数据操做总结

综上所述,收发数据的操做分为若干个阶段,能够大体总结为如下 4 个。

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

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

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

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

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

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

本章将要介绍的只是这个“委托”的操做。关于协议栈收到委托以后具体是如何链接管道和放入数据的,咱们将在第 2 章介绍。

这些委托的操做都是经过调用 Socket 库中的程序组件来执行的,但这些数据通讯用的程序组件其实仅仅充当了一个桥梁的角色,并不执行任何实质性的操做,应用程序的委托内容最终会被原本来本地传递给协议栈。

所以,后文将会采用 将 Socket 库和协议栈当作一个总体的讲法,让人更容易理解。不要忘记Socket 库这一桥梁的存在。

1.4.2 建立套接字阶段

应用程序委托收发数据的过程

须要按照必定的顺序调用若干个程序组件,过程以下图所示。

套接字建立阶段

客户端建立套接字的操做很是简单,只要调用 Socket 库中的 socket 程序组件就能够了(图 1.18 ①)。

调用 socket 以后,控制流程会转移到 socket 内部并执行建立套接字的操做,完成以后控制流程又会被移交回应用程序。

第2章会细讲解这部分。只要知道调用 socket 后套接字就建立好了就能够了。

协议栈返回给应用程序描述符

套接字建立完成后,协议栈会返回一个描述符应用程序会将收到的描述符存放在内存中。

描述符是用来识别不一样的套接字的。

当建立套接字后,咱们就可使用这个套接字来执行收发数据的操做了。

这时,只要咱们出示描述符,议栈就可以判断出咱们但愿用哪个套接字来链接或者收发数据了。

 

 

1.4.3 链接阶段:把管道接上去

咱们须要委托协议栈将客户端建立的套接字与服务器那边的套接字链接起来。

应用程序经过调用 Socket 库中的名为 connect 的程序组件来完成这一操做。这里的要点是当调用 connect 时,须要指定描述符、服务器 IP 地址和端口号这 3 个参数,如上图②所示。

Connect的三个参数

描述符

是在建立套接字的时候由协议栈返回的那个描述符。

connect 会将应用程序指定的描述符告知协议栈,而后协议栈根据这个描述符来判断到底使用哪个套接字去和服务器端的套接字进行链接,并执行链接的操做。

IP 地址

就是经过 DNS 服务器查询获得的要访问的服务器的 IP 地址。

端口号

描述符是和委托建立套接字的应用程序进行交互时使用的,并非用来告诉网络链接的另外一方的,所以另外一方并不知道这个描述符。

咱们须要另一个对客户端也一样适用的机制,而这个机制就是端口号。

若是说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通讯的另外一方可以识别出套接字的机制 。

端口号的运行机制

只要指定了事先规定好的端口号,就能够链接到相应的服务器程序的套接字。

也就是说,浏览器访问 Web 服务器时使用 80 号端口,这是已经规定好的。

客户端在建立套接字时,协议栈会为这个套接字随便分配一个端口号。

当协议栈执行链接操做时,会将这个随便分配的端口号通知给服务器。

描述符

应用程序用来识别套接字的机制

IP 地址和端口号

客户端和服务器之间用来识别对方套接字的机制

总结

调用 connect 时,协议栈就会执行链接操做。

当链接成功后,协议栈会将对方的 IP 地址和端口号等信息保存在套接字中,这样咱们就能够开始收发数据了。

 

1.4.4 通讯阶段:传递消息

将数据送入套接字,数据就会被发送到对方的套接字中应用程序没法直接控制套接字,所以仍是要经过 Socket 库委托协议栈来完成这个操做。

write组件指定描述符和要发送的数据

这个操做须要使用 write 这个程序组件,具体过程以下。

①应用程序须要在内存中准备好要发送的数据。根据用户输入的网址生成的 HTTP 请求消息就是咱们要发送的数据。

②当调用 write时,须要指定描述符和发送数据,如上图③所示。

③协议栈将数据发送到服务器。

因为套接字中已经保存了已链接的通讯对象的相关信息,

因此只要经过描述符指定套接字,就能够识别出通讯对象,并向其发送数据。

服务器接收后向客户端返回响应消息

④发送数据会经过网络到达咱们要访问的服务器。

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

当消息返回后,须要执行的是接收消息的操做。

客户端接收消息调用read组件

接收消息的操做是经过 Socket 库中的 read 程序组件委托协议栈来完成的,如上图③所示。

调用read 时须要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。

⑥当服务器返回响应消息时,read 就会负责将接收到的响应消息存放到接收缓冲区中。

因为接收缓冲区是一块位于应用程序内部的内存空间,所以当消息被存放到接收缓冲区中时,就至关于已经转交给了应用程序。

 

1.4.5 断开阶段:收发数据结束

当浏览器收到数据以后,收发数据的过程就结束了。接下来,咱们须要调用 Socket 库的 close 程序组件进入断开阶段如上图 ④。

最终,链接在套接字之间的管道会被断开,套接字自己也会被删除。

断开的过程

Web 使用的 HTTP 协议规定,当 Web 服务器发送完响应消息以后,应该主动执行断开操做

Web 服务器会首先调用close 来断开链接。

断开操做传达到客户端以后,客户端的套接字也会进入断开阶段。

当浏览器调用 read 执行接收数据操做时,read 会告知浏览器收发数据操做已结束,链接已经断开。浏览器得知后,也会调用close 进入断开阶段。

注释

根据应用种类不一样,客户端和服务器哪一方先执行 close 都有可能。

有些应用中是客户端先执行 close,而另一些应用中则是服务器先执行 close。

图片等文件的请求过程

HTTP 协议将 HTML 文档和图片都做为单独的对象来处理,每获取一次数据,就要执行一次链接、发送请求消息、接收响应消息、断开的过程。

所以后来人们又设计出了可以在一次链接中收发多个请求和响应的方法。

在 HTTP 版本 1.1 中就可使用这种方法,在这种状况下,当全部数据都请求完成后,浏览器会主动触发断开链接的操做。

 

第一章小测验

1. http://www.nikkeibp.co.jp/ 中的 http 表明什么意思?

http是网络协议名称

2. 下面两个网址有什么不一样?

a. http://www.nikkeibp.co.jp/sample

b. http://www.nikkeibp.co.jp/sample/

a可能访问的是sample目录以及其下的默认主页,也多是名为sample的文件。而b就是访问域名下sample目录下的默认主页

3. 用来识别链接在互联网上的计算机和服务器的地址叫什么?

IP地址

4. 根据Web服务器的域名来查询IP地址时所使用的服务器叫什么?

DNS服务器

5. 向 DNS 服务器发送请求消息的程序叫什么?

解析器

相关文章
相关标签/搜索