| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 网络是怎样连接的有感1 -> 正文阅读 |
|
[Python知识库]网络是怎样连接的有感1 |
第一章——探索浏览器内部 总共分为四个小节讲解: (1):生成http请求消息 (2):向DNS服务器查询Web服务器的IP地址 (3):全世界DNS服务器大接力 (4):委托协议栈发送消息 1.1网址: 我们口中的网址URL:统一资源定位符,有各种各样的URL,用于访问不同的服务器,比如Web服务器就要用"Http"(超文本传送协议),访问FTP服务器就要用“FTP”(文件传送协议),尽管URL写法很多,但是他们都有一个共同点,即“http:”“ftp:”这些文字都表示浏览器应当使用的访问方法,就要用与之对应的协议。 从上面的图片知道文件的路径名是可以省略的,如果省略了一般都会访问默认的路径,大多数情况是 /dir/index.html 或者 /dir/default.htm之类的。 ? 以下这个图片表示访问Web服务器上,路径为/dir1/filee1.html的文件(第一个/表示的是根目录) 1.2Http的基本思路: URI:同意资源标识符:通俗的讲就是访问目标,比如这里的URI可以是一段网址URL。 方法: 最常用的两个方法GET和POST:GET就是从Web服务器中把访问目标(URI)的数据找到后返回给客户端;POST就是填写一些表单数据的时候用,但是此时的访问目标(URI)是Web服务器中的应用程序,典型的例子“index.cgi”,"index.php";指定了方法,URI,数据后,在Web服务器中找到后计算得到结果再返回给客户端。 Http请求消息在格式上是有严格规定的:有请求行,消息头,消息体; 通过请求行可以大致了解请求的内容,但是还有一些比较细节的信息需要补充,就需要消息头来补充;消息头的规定中定义了很多项目,如日期,客户端支持的数据类型,语言,压缩格式,客户端和服务器的名称,版本,有效期等;写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需要发送的数据。这一部分称为消息体, 也就是消息的主体。比如POST方法中的一些脚本数据;GET方法就没有消息体,仅凭方法和URI,Web服务器就能判断需要什么样的操作。 每一条请求消息只能写一个URI,所以每次只能获取一个文件,如若需要获取多个文件,必须单独发送请求,比如说一个网页中含三个图片,获取网页和获取图片需要向Web服务器发送4条请求。 响应消息的格式和请求消息的格式以及基本思路是相同的,差别在第一行,第一行的内容是状态码和响应短语,他们表示的内容一致,但是用途不同,一个是向程序报告执行的结果,一个是向人报告执行的结果。 2.1初识IP地址 ? 首先了解TCP/IP设计网络的基本思路:1.子网:可理解为有集线器连成的多台计算机;2.网络:由路由器连成的多个子网;这样就构建成了一个网络。 ? IP地址包含网络号和主机号,通俗的讲就是哪个子网的哪台电脑,想访问哪个IP地址就通过这些路由器和集线器反复中转就能访问到了,知道了IP地址就知道了对象服务器的位置。 IP地址就像电话号码,是一串32比特的数字,按照8比特(1字节)分为四组,用十进制表示再加上“.”来隔开,但是IP地址需要区分网络号和主机号两个部分,组建网络时,用户可以自行决定号码,所以具体结构就不固定,需要引入子网掩码这个东西,也是32bit,左部分为1,右部分为0,为1的部分表示网络号,为0的部分表示主机号。 ? 当IP地址的主机号: 全为0时:表示的是整个子网。 全为1时:表示向子网上所有设备发送包,即“广播”。 2.2查询IP IP地址的基本含义知道了,那么怎么通过URL查询到IP地址呢?于是有引出了DNS、操作系统中的Socket库中的解析器(其实就是一段程序) 大体过程就是调用解析器后,控制流程转移,委托操作系统内部的协议栈发送消息(请告诉我IP地址),控制流程转移,委托网卡发送消息(告诉俺IP地址);就这样一层一层的向下最后通过DNS服务器查到了IP地址,又一层一层的返回,存在一块内存地址中。 关于上面说所的通过DNS服务器查询到了IP地址,如果要访问的Web服务器在DNS上已经注册,这条记录就会被找到,顺道说一句,其实想访问到DNS也是需要获取他的IP地址的。只不过这个 IP 地址是 作为 TCP/IP 的一个设置项目事先设置好的,不需要再去查询了。 3.1DNS DNS服务器的基本工作就是接受来自客户端的查询信息,然后根据信息的内容返回响应。 来自客户端的查询信息包含3个: 1.域名:服务器,邮件服务器的名称 2.class :识别网络的一个信息,如今已经没有其他网络了,所以Class只代表了互联网的IN 3.记录类型(表示域名对应何种类型的记录):例如类型为A时,表示域名对应的IP地址,类型为MX时,表示对应的是邮件服务器,对于不同的记录类型,返回的信息也不同。 查询的三个信息全部匹配,DNS服务器就会向客户端返回对应的响应数据。 接下来看DNS到底是如何寻找注册的域名: 有一个例子:www.lab.glasscom.com.首先在域名中越靠右的位置,层级越高;将负责管理下级域的DNS的IP地址注册到它的上级DNS服务器中,以此类推,最上层域也就是根域一个圆点所在的DNS服务器中就存放有com的DNS服务器的IP地址,由于上级DNS存放着下级的DNS的信息,就可以从根域找到任意一个域的DNS服务器,有根域的服务器全世界仅有13个。还有最后一个工作就是将有根域的DNS服务器的IP地址分给所有的DNS服务器,这样任意一台DNS服务器都能找到根域DNS服务器了,然后再通过根域找到我们注册的信息; 最后就通过注册的信息找到了Web服务器的IP地址并存在一块内存中,从内存中取出IP地址并将它与Http请求消息一起交给操作系统就可以了 3.2缓存加快DNS服务机制 缓存:将使用过的数据存放在离使用这个数据比较近的一种高速存储装置,这个技术有很多的应用,如CPU与内存之间的缓存,磁盘与内存之间的缓存,在网络中缓存也是一种提高访问速度的一种普遍技术。 有了DNS服务器上的缓存机制,就不用每次都从根域去查找,可以记住之前查过的域名,如果查询的信息已经在缓存中就直接返回响应,值得注意的是,当注册的信息改变时,缓存里的东西没有改变就有可能是错误的,所以DNS服务器中保存的信息都会有一个有效期,当缓存的信息超过有效期时,就会删除。而且在查询进行响应时,DNS服务器也会告知查询结果是来自于缓存还是负责管理该域名的DNS服务器。 4.1委托操作系统协议栈 之前讲到IP地址和Http请求消息准备好后,就应该交给操作系统了,操作系统是通过协议栈来传达想要查询的信息。 首先要有传输数据的管道,而建立管道的关键在于两端的数据出入口,这些出入口叫做套接字,建立好之后就连接起来形成管道,一般服务器端会在启动之后就创建好套接字等待客户端发起连接,然后就到了传输数据,最后断开连接,断开可由任意一方发起断开,随后删除套接字; 将以上分为四个阶段: 1.创建套接字(创建套接字阶段) 2.将管道连接到服务器的套接字上(连接阶段) 3.收发数据(通信阶段) 4.断开管道,并删除套接字(断开阶段) 以上的四个操作都是由操作系统的协议栈来执行的; 4.1.1创建套接字: 调用Socket库中的socket组件,调用socket组件就和调用解析器一样,控制流程会转移到socket组件内部并创建套接字,完成之后有返回应用程序,套接字建立好后,会返回一个描述符(在计算机内部识别不同的套接字),应用程序会将其放在一块内存中,用来识别不同的套接字(同一台计算机上能同时存在不同的套接字,例如我打开两个浏览器同时访问两台不同的Web服务器); 4.1.2连接阶段: 应用程序通过调用Socket中的connect组件完成这个操作,在这里需要三个参数: 1.描述符:connect会将应用程序指定的描述符给协议栈,然后协议栈通过判断哪一个套接字去与服务器端的套接字连接。 2.服务器的IP地址:再进行数据收发操作时,双方都需要知道对方的IP地址并告知协议栈。 3.端口号:用来让通信的另一方能识别出套接字的机制 参数齐全然后调用connect,协议栈就会执行连接操作,连接成功后,协议栈就会对方的IP地址端口信息保存在套接字中,这样就可以干下一步的收发数据步骤了; 4.1.3通信阶段: 应用程序调用Socket库中的write组件委托协议栈,需要的参数是描述符和准备好的Http请求消息,然后协议栈就会将数据发送到服务器,服务器解析之后给客户端返回响应消息,客户端接收消息是通过应用程序调用Socket中的read组件委托协议栈,将接收到的消息存在一个接收缓冲区,接收缓冲区就是应用程序内部的内存空间,就相当于已经转交到了应用程序,此时浏览器上就有了你像访问的东西。 4.1.4断开阶段: 浏览器收到数据之后,收发数据的过程结束,应用程序调用Socket库中的close程序组件委托协议栈执行断开操作:管道断开,套接字删除; |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 15:00:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |