2021-10-20

本文详细介绍了网络通信的基本流程,以浏览器访问Web服务器为例,从输入URL开始,包括DNS查询、创建套接字、建立连接、数据传输及断开连接等步骤。讲解了套接字的创建、连接操作、通信阶段以及断开连接的细节,帮助读者深入理解网络通信的本质。
摘要由CSDN通过智能技术生成

简单的网络通信流程

简单的网络通信就是:

  1. 知道对方的ip地址
  2. 与其建立连接
  3. 消息体通过各种协议的层层包装,形成网络包并被转换成电信号,由网线传输给目标计算机
  4. 目标计算机通过层层解析, 将其还原成消息体, 并做回包等操作
  5. 断开连接

接下来以 浏览器访问web服务器这一过程来简单认识通信的全貌。

浏览器中输入网址并生成HTTP消息

整个过程就是从浏览器中输入网址(URL)开始的。
我们打开浏览器, 在搜索栏里输入一个网址, 浏览器就会按照一定的规则去分析这个网址的含义, 然后根据含义生成HTTP消息。
例如,打开google浏览器, 我们输入www.baidu.com ,浏览器生成的HTTP消息表示:“请给我baidu.com这一文件中储存的网页数据”, 接着,浏览器便将这一消息发送给web服务器,当然, 真正的发送数据并不是浏览器做的,而是浏览器委托操作系统中的网络控制软件将消息发送给服务器。

向DNS服务器查询Web服务器的IP地址

   生成HTTP消息之后, 接下来需要委托操作系统将消息发送给Web服务器, 尽管浏览器能够解析网址并生成HTTP消息, 但它本身并不具备将消息发送到网络中的功能, 因此这一功能需要委托操作系统来实现。 但在进行这一操作前,我们还需要查询网址中服务器域名【域名:例如www.baidu.com/ 就是一个域名】对应的IP地址。 在委托操作系统发送消息时, 必须要提供的不是通信对象的域名, 而是它的IP地址。 因此, 在生成HTTP消息后, 下一个步骤是根据域名查询ip地址。
   查询IP地址, 需要我们向DNS服务器发起请求。这个过程并不复杂, 表面来看就是,我们机器上的DNS客户端向最近的DNS服务器发起询问“某域名的IP是多少”, DNS服务器会回复“某域名的IP是…”,整个过程就这样结束了。可以后面自行了解下DNS相关的知识。而DNS客户端向DNS服务器发起请求时所使用的库是我们后面学习的重点:Socket库, 是用于调用网络功能的程序组件集合。

委托协议栈发送消息

知道了IP地址之后, 就可以委托操作系统内部的协议栈向这个目标IP地址,也就是要访问的服务器发送消息了。而这个过程就要使用到上文提到的Socket库。 其流程简单来说,就像是收发数据的两台计算机之间连接了一条数据通道, 数据沿着这条通道流动, 最终到达目的地。 我们可以把数据通道想象成一条管道, 将数据从一端送入管道, 数据到达管道的另一边后被取出。且管道是双向通信的。 但并不是说真实存在这一个管道, 只是一个具象的例子。
   收发数据的流程大致如此, 但有一点需要说明, 这个管道并不是一开始就有的, 而是在数据传输之前, 由客户端发起请求建立的。 建立管道的关键在于管道两端的数据出入口, 这些出入口被称为“套接字”, 我们需要创建套接字, 然后再由套接字连接起来形成管道。 实际过程如下, 服务端先创建一个套接字(相当于服务端的一个管道口), 然后等待客户端向该套接字(管道口)连接管道,当服务器启动成功后, 客户端就可以向其连接管道, 此时客户端也会创建一个套接字(管道口),然后从该套接字延申出管道, 最后连接到服务端的套接字上。当双方的套接字(管道口)连接起来后, 通信准备就完成了。接下来就可以在这条管道中相互传输数据了。
   当数据收发结束后, 服务器或者客户端的任意一方都可以断开连接, 拆除管道。 当管道断开后, 套接字也会被删除, 到此为止, 通信就结束了。
   上述流程总结如下:
1. 创建套接字(建立管道口)
2. 将管道连接到服务端的套接字上
3. 收发数据
4. 断开管道,删除套接字
这四步操作都是由操作系统的协议栈来完成的,而不是web浏览器, web浏览器是通过调用Socket库中的一系列API来完成上述步骤。
   接下来, 对于上述步骤, 再进行更细致一些的讲解。

创建套接字

   首先是创建套接字阶段, 客户端创建套接字非常简单, 只要调用Socket库中的socket程序组件就可以了, 调用socket之后, 程序流程就会进入socket内部并执行创建套接字的操作, 完成之后自动回到主流程。 但这个socket创建的内部操作其实并不简单, 一时半会也介绍不完,所以先不写了。套接字创建完成后, 协议栈会返回一个描述符, 应用程序会将收到的描述符存放在内存中, 描述符是用来识别不同套接字的, 可以按照如下理解: 我们现在只关注了浏览器访问web服务器的过程, 但实际上计算机中会同时进行多个数据的通信操作, 比如打开两个浏览器同时访问两个网页, 或者说看网页的同时进行微信聊天。这时, 有多个数据收发操作在同时进行, 就意味着存在多个套接字,存在多个管道。 在这样的情况下, 我们就需要一种方法来识别某个特定的套接字,这种方法就是描述符。所谓描述符,其实就是一个编号, 比如在机场酒店寄存行李时, 前台会给一个号码牌, 通过号码牌就可以找到自己的行李,描述符的原理大致就是如此。
当创建好套接字后, 就可以通过这个套接字来执行数据的收发了, 这时, 只要我们出示描述符, 协议栈就能够判断出我们希望用哪一个套接字来连接或者发送数据了。

连接操作

   客户端的套接字建立好了, 接下来就可以委托协议栈将客户端刚刚建立的套接字与服务器那边的套接字连接起来。应用程序会调用Socket库中的connect程序组件来完成这一操作,connect需要三个参数: 描述符, ip, 端口

  1. 描述符:就是刚刚创建套接字时, 协议栈返回的描述符, 当我们想要建立连接时, 就需要将描述符告诉协议栈, 然后协议栈会通过该描述符找到对应的套接字, 去与服务端建立连接, 就像我们出示号码牌, 酒店前台就会帮我们找到我们的行李存放柜。
  2. IP地址:就是通过DNS服务器查询到的我们要访问的那个服务的ip地址。
  3. 端口:看起来, 有了IP地址, 我们就能找到对方的主机了, 但服务器上可能不止一个服务, 对方也有很多的套接字存在, 而我们的连接操作是要找到对方具体的套接字的, 而只有ip显然不够, 于是,我们增加了端口这一概念。就像我们打电话时, 不是只知道电话号码就可以, 也需要向对方询问是否是某某某一样, 这个某某某就像是端口。 所以, 当我们同时指定ip和端口时, 就可以明确识别出某台机器上的某个具体套接字了。
    但端口号是怎么来的呢? 它并不像ip一样, 可以去DNS服务器查, 而是只能双方进行约定。
通信阶段

当管道建立成功了, 剩下的事情就简单了, 当然只是看起来简单, 但其实际要做的事情更加复杂…
连接建立后, 只要将数据送入套接字, 数据就会被发送到对方的套接字中。这个过程需要使用Socket库中的write程序组件完成。而从管道中读数据, 就是通过read组件了。

断开连接

DNS基本知识点:https://blog.csdn.net/liuyancainiao/article/details/80576681
套接字简介:https://www.cnblogs.com/hukey/p/5577817.html
简单的TCP通信代码:https://www.cnblogs.com/zkfopen/p/9441264.html
简单的UDP通信代码:https://www.cnblogs.com/zkfopen/p/9382705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值