zoukankan      html  css  js  c++  java
  • 网络是怎样连接的-委托协议栈发送消息

    1.4 委托协议栈发送消息

    1.4.1 数据收发操作概览

    获得 IP 地址后,就可以委托操作系统内部的协议栈向这个目标 IP地址,也就是我们要访问的 Web 服务器发送消息。

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

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

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

    收发数据操作的整体思路

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

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

    在进行收发数据操作之前,双方需要先建立起这条管道才行。

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

    我们需要先创建套接字,然后再将套接字连接起来形成管道。

    建立连接的具体流程

    首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道。当服务器进入等待状态时,客户端就可以连接管道了。

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

    当双方的套接字连接起来之后,通信准备就完成了。接下来只要将数据送入套接字就可以收发数据。

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

    当数据全部发送完毕之后,连接的管道将会被断开。

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

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

    到此为止,通信操作就结束了。

    收发数据操作总结

    综上所述,收发数据的操作分为若干个阶段,可以大致总结为以下 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 服务器发送请求消息的程序叫什么?

    解析器

  • 相关阅读:
    vue-amap地图组件的使用
    数据分析
    爬虫之scrapy框架
    爬虫之selenium
    记录一下最近的pwn
    内核提权姿势笔记
    CVE-2016-5343分析
    CVE-2015-8660分析
    Docker远程访问get(root)shell姿势
    Linux内核ROP学习
  • 原文地址:https://www.cnblogs.com/errornull/p/9957204.html
Copyright © 2011-2022 走看看