网络命令详解大全(白话网络连接之)

TPC/IP、IOS层级模型及其对应软硬件

按照惯例,先抛出一个图吓唬一下大家,让大家以为我们要做一件大事

网络命令详解大全(白话网络连接之)(1)

TPC/IP、IOS层级模型及其对应软硬件

这张图包含了很多概念,而且每个概念都比较复杂,所以我们很坦然的承认我们不是特别精通这些,而且也没准备让自己精通这些。所以我们只准备拿一个小栗子讨论一下网络是怎么完成整个数据收发过程的,在这个过程中,我们会尽量多的包含以上出现的这些概念,实在包括不了的,相信大家也能理解。

网络是怎样连接的

网络连接种类很多,我们在这里尽量将这个过程单一化并且简化,让大家有一个大致的概念。

假设我们想要访问百度首页,直观来看,我们只需要在地址栏上输入www.baidu.com然后回车就可以了。整个过程,我们只跟浏览器发生了交互(键盘是外设,不算)。那么是不是浏览器为我们做了所有事情呢,如果是的话,百度又有什么用呢,如果不是,那么浏览器到底做了啥,百度又做了啥呢?

1、浏览器做了啥

我们输入的www.baidu.com就是大名鼎鼎的URL。浏览器的工作就是从获取URL开始的,其实我们输入的全名应该是http://www.baidu.com,只不过浏览器帮我们自动补全了前面而已,不信的话你可以在百度首页刷出来以后再看一下地址栏。浏览器是一个很强大的软件,不仅可以使用http协议,还是以使用ftp协议访问文件,但是如果不显式输入协议,浏览器默认会走http协议。

看到这个地址后,浏览器首先会想,这是啥,要干嘛?所以,它首先会先解析url。浏览器将url分为以下几个部分:

  • 协议:http://
  • 用户名和密码:省略了
  • Web服务器域名:www.baidu.com
  • 端口号:省略了
  • 文件路径:省略了

以上我们看到,百度为了让我们用的方便(为了自己更吸引用户),省略了很多内容,用户名和密码因为保密的需要,省略了;端口号因为走的是http协议,默认80,省略了;文件路径,百度的首页应该类似于index.html等固定的文件,省略了(WEB开发人员应该对这个非常熟悉,在工程的web.xml中是可以配置的)

如果以上都不省略,有可能是这样的--http://cris:strstr666@www.baidu.com:80/index.html,这么长,怕不怕。

首先,我们需要明白,在linux中,万物皆文件,访问的过程无非是向服务器发出请求,让它按照组装生成对应的文件并反馈给我们。所以这个url的意思便可以翻译为,按照http协议,去www.baidu.com上去index.html文件给我。

但是这还不够,这样也只有浏览器能看懂,传输线路上的其他设备看不懂(比如路由器)。所以浏览器会继续将url翻译成为http请求消息,http请求消息的格式如下

网络命令详解大全(白话网络连接之)(2)

http请求消息格式

第一行是请求行,包含三个关键信息:方法,URI和HTTP版本,其中方法包括GET,POST,PUT,DELETE等,其中GET用来获取URI制定的信息。浏览器地址栏输入便是调用GET方法,像调查问卷那样有大量输入提交的网页,一般走的是POST方法。URI已经包含在URL中(/index.html),HTTP版本号是为了表示该消息是基于哪个版本的HTTP规格写的。

第二行开始是消息头,消息头里面包含的信息比较丰富,比如日期,语言,压缩格式等,但是对我们最重要的信息是Host,也就是接收请求的服务器名称和端口号,消息体主要用于POST请求填充的参数——GET请求参数是用消息头传递的,而POST请求参数是用消息体传递的,消息头长度有限,所以可传递的参数有限,如果需要传递大量的参数,需要使用POST方法。所以翻译后的HTTP大致如下

GET /index.html HTTP/1.1 Accept : */* ...... Host : www.baidu.com ......

浏览器做到这里,准备把消息体交给操作系统,委托它进行发送,但是操作系统说,不行,你的事情还没有办完,我不知道www.baidu.com是谁,不知道怎么发。你需要把域名转换成为IP地址。

在网络世界中,每个网络设备都会被分配一个地址,也就是xx号楼xx室。其中楼号表示哪个子网,室号表示子网内的哪个设备。但是我们常见如192.168.34.2这样的IP可能子网号是192.168,设备号是34.2,也可能子网号是192.168.34,设备号是2。为了明确这个定义,我们通常会将IP和子网掩码综合考虑,我们常见的子网掩码255.255.255.0就表示IP的前三位是子网号,第四位是设备号(前三位对应二进制的比特值都为1)。当然,我们也可以使用类似192.168.34.2/24这种写法将ip和子网掩码结合起来,后面的24就表示ip前三位为子网号,因为每一位由8比特位组成,24就表示前三位。

那浏览器去哪查百度对应的IP呢,它会向DNS服务器提交请求,要求获取百度对应的IP,DNS我们可以简单理解为一个目录树,在拿到这个请求之后,会首先去www域查,在www域查到baidu,以此类推,在叶子节点找到www.baidu.com对应的IP地址(我们使用ping命令也可以很快得到ip)。然后交给浏览器,浏览器收到后把ip存储到内存,在委托服务器发送的时候将ip和http消息一起提供给操作系统。

网络命令详解大全(白话网络连接之)(3)

www.baidu.com对应ip

2、操作系统做了啥

操作系统接收到浏览器(应用程序的委托),就开始使用内部的协议栈开始找百度服务器,当然,我们上面查到的ip可能只是代理服务器的地址,并不是百度百度真正的地址,但是为了简化流程,我们在这里非常粗暴且狂野地认为,他就是百度,没毛病。协议栈是怎么找的呢?

首先,操作系统调用socket组件创建一个套接字,所谓的套接字就是记录客户端和服务器两端地址信息的数据结构,我们在命令窗口执行netstat命令得到的每一行都是一个套接字

网络命令详解大全(白话网络连接之)(4)

套接字

现在操作系统只是知道要连接谁,还没有完成连接。所以接下来,操作系统调用connect组件让本地的套接字和服务器的套接字交换控制信息。实际过程如下:

  • 操作系统提供服务器的IP和端口号给协议栈中的TCP模块
  • TCP模块加入TCP头部信息后发给IP模块委托发送
  • IP模块将信息打包后发到服务器
  • 服务器上的IP模块收到信息后传递给TCP模块
  • TCP模块在套接字中写入相应的信息,并修改状态标识
  • 服务器TCP模块再委托IP模块将信息返回
  • 客户端收到后修改状态标识然后将信息发回服务器
  • 服务器接收到信息,连接结束

总体来说,就是操作系统(客户端)发消息给百度服务器说,你好,我想约你,百度服务器收到后回复说,你好,我已经知道你想约我了,然后客户端说,你好我知道你知道我想约你了,然后他俩就约上了。

到这里,客户端和服务器只是建立了连接而已,还没有真正收发数据,接下来两者开始收发数据,当然收发数据过程还是像上面那样腻腻歪歪的,但是为了简化过程,我们不在重复描述上面腻歪的过程。客户端将数据拆分成为一个一个小包,我们可以认为将一本书撕成好几个部分并且编号,然后调用write模块开始传,客户端说我要开始传送第一部分了,从第1页到第73页,服务器收到后会回复,我收到了,第一部分1到73页,如果等一段时间服务器没有回复,或者回复的数据是错误的,客户端就会重新发送这一部分数据。

百度服务器做了什么

百度接收到请求数据后,开始在自己的各种数据库,索引库中找数据,然后动态拼接成一个页面,然后使用上面的流程将页面传送给客户端。

传送完之后一段时间,百度服务器觉得自己的活儿干完了,就发信息给客户端说,你好,我准备走了,客户端收到之后也发信息给服务器说,好的,我也准备走了。

这个时候浏览器在干啥呢,客户端接收到服务器的数据后就会写入到缓冲区,浏览器过一段时间就会来取一次,之道客户端告诉他,你已经把所有的数据取完了,以后别特么来了。

以上是一个网页请求的大致过程,比较粗,没有能够细化到物理层级。

后面我们会简单介绍以下内容:信息究竟被谁粗暴转换成为电/光信号,是谁将信号一再的转手,这到底是人性的扭曲还是道德的沦丧,敬请期待下期。。。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页