委托协议栈向服务器发送消息,需要哪些步骤?——网络基础知识(三)

234 阅读5分钟

过完明天就放假了,我们可以出去看树下的小花花啦 ,五一快乐!—— 作者的碎碎念

上一篇文章域名相对应的IP是通过什么机制查询到的,里面写到了通过DNS机制可以拿到域名相对应的IP。拿到了IP以后,我们就可以委托操作系统内部的协议栈向服务器发送消息了。发送给Web服务器的HTTP消息是一种数字消息,收发数字消息不仅仅是浏览器,各种使用网络的应用程序都是共通的,通过DNS服务器查询IP地址和收发数字消息这一操作都适用于任何的网络应用程序,也都是需要使用Socket库中的程序组件。

“输送管道”连接的过程

使用Socket库收发数据操作如图

我们可以想象成客户端和服务器端之间有一条管道(实际是不存在的)在输送消息,这条管道是需要我们自己去创建的,创建管道的出入口我们称之为套接字,创建套接字然后把两端的套接字连接形成了管道,连接起来以后就可以收发数据了,如果其中一方断开,另一方也随着断开,套接字被删除,通信结束。整个过程大致总结为4个阶段:

  1. 创建套接字 (服务器程序一般在启动时就创建好套接字)
  2. 将管道连接到服务器端套接字上
  3. 收发数据
  4. 断开管道并删除套接字。

这些阶段都是操作系统中的协议栈来执行,委托操作就是调用Socket库中的程序组件来执行收发数据的操作。这些作为程序员应该都可以理解,就是平时我们经常做的事情,写代码来完成数据收发的功能。看下整个过程的图


解释一下图中标出的几个点:

  1. 准备,是在创建套接字,创建完成会返回一个描述符存放在内存中,这个描述符就是用来区分每一个套接字的。
  2. 连接,就是与服务器那边的套接字连接起来。图中写的不详细,连接时候是有三个参数的,创建套接字时的描述符、服务器IP地址以及端口号。描述符用来告知哪一个套接字去执行连接操作,IP地址用来查询到要访问的服务器,端口号用来识别到某个套接字。打个很简单的比喻,小红要打电话(家庭号码7136967)找小李,那么小红就是描述符,电话号码是IP地址,小李是端口号。
  3. 发送,就是消息收发的阶段。
  4. 断开,套接字管道被断开,本身也会被删除。HTTP协议规定,web服务器发送完消息后要主动执行断开操作,断开操作传达到客户端后,客户端套接字也进入断开操作。

在HTTP协议的1.1版本前,将HTML文档和图片作为单独对象处理,每一次获取数据,都要执行连接、发送消息、接受响应消息、断开的过程,重复连接断开效率低,所以后来HTTP1.1版本就改善了这个缺点,能够在一次连接中收发多个请求响应方法。

怎么理解套接字

刚刚一直在说套接字,感觉很抽象,它本身也只是一个概念而已,我们就理解为它是包含了很多的控制信息的一个东西,比如包含IP地址、端口号、通信操作进行的状态等等。协议栈在执行操作的时候需要参考这些东西,是根据套接字中记录的控制信息来工作的。为了便于理解,来看看真正的套接字,windows中用netstat命令显示套接字,如下图


参考《网络是怎样连接的》对这张图的第8行的解释,它表示PID为4的程序正在使用IP地址为10.10.1.16网卡与IP地址为10.10.1.80的对象进行通信,本机使用103端口,对方使用139端口,139是Windows文件服务器的端口,也就能看出这个套接字是连接到一台文件服务器的。
看完第8行的解释,再加上用心的看完整张图对各项数据的文字解释,应该就懂了。套接字包含的各项信息代表的意思,都是可以靠死记硬背去记住,稍加理解,就可以掌握。

以上就是本文的内容了,介绍了委托操作系统内部的协议栈向服务器发送消息,再结合前两章的内容,HTTP协议之发送和响应消息重点域名相对应的IP是通过什么机制查询到的?,三章的内容把我们输入URL到访问服务器的这个过程大致的捋了一遍,但是网络是很复杂的,接下来的文章,就是更深入的去理解里面的知识。

本篇文章的图都是出自《网络是怎样连接的》的一书。