应用程序不是自己去控制网络,而是委托操作系统来控制网络
概述
用户从浏览器输入网址(url),浏览器会先解析用户输入的网址,再根据网址的含义来生成请求消息,请求消息生成之后,浏览器委托操作系统向web服务器发送请求,但是要发送请求,要先告诉操作系统接收方的IP地址,因此浏览器要先查出Web服务器的IP地址,但是浏览器只有Web服务器的域名,那么,浏览器就要先根据域名在DNS服务器查询对应的IP地址,而一台DNS服务器可能没有改域名所对应的IP地址,那么就需要DNS服务器之间的接力来完成这一次的查询。查询到IP地址之后,浏览器就可以把消息委托操作系统发送给Web服务器了。
问题
从上面可以得到这么几个问题
浏览器如何解析用户输入的网址(url)?
请求消息的样子是什么?
浏览器如何通过DNS服务器查询域名所对应的IP地址?
DNS之间怎么进行接力?
浏览器如何把消息委托给Web服务器?
问题1 浏览器如何解析用户输入的网址?
首先要对url有所了解,例如http://www.glasscom.com:21/dir/file1.html 就是一个url。那么它代表的有什么意思。
http: 代表着访问数据源所使用的协议。
// 后面的字符代表的是服务器的名字。
www.glasscom.com Web服务器的域名
: 后面的数字是端口号。
2 1 端口号
/dir/file1.html 文件的路径名
到这里,url也就被分解成为,要访问Web服务器名称叫www.glasscom.com 里面路径为 /dir/file1.html 的文件
如果最后只是一个/ 代表着**/dir/index.html** 或者 /dir/default.html 。
问题2请求消息的样子是什么?
请求消息里面包含了两部分“对什么”和“进行什么样子的操作”。其中,“对什么”的部分称为URI,URI的内容就是一个存放数据的文件名,“进行什么样子的操作”称为方法,例如:将客户端输入的数据发送URL表示的程序。其中主要的方法有:
- get方法,表示获取URI指定的信息,如果URI是文件,就获取文件内容
- post方法,客户端向服务器发送数据
- put方法,替换URI指定的文件
- delete, 删除URI指定的文件
还有其他的方法。。自行百度。。
Web服务器接受到需要做什么之后,完成工作之后,将工作的完成情况放在响应消息里面,在响应消息的开头有一个状态码,这个状态码代表着工作的完成情况。具体有
- 1xx , 告知请求的处理进度
- 2xx, 成功
- 3xx, 需要进一步操作
- 4xx,客户端错误
- 5xx, 服务器错误
当了解一些基本知识之后,那么来了解一下请求消息具体是什么样子的。
首先第一行是请求行,格式为<方法><空格><空格><http版本>
下来是消息头,格式为<字段名>:<字段值> … … … 有很多行,每一行包含一个头字段,用于表示请求的附加信息。
最后是消息体,也就是包含着需要向服务器发送的数据。
然后再说下响应消息,它与请求消息格式基本一致,请求行的格式有所不同为<http版本><空格><状态码><空格><响应短语>,消息头格式不变,消息体里面存放的是服务器给客户端发送的消息。
这里要注意的一个一条请求消息只能发送一个URI,如果需要获取多个文件,必须对每个文件单独发一个请求。
例如一个html里面有一个图片,那么请求顺序为先请求html的内容,在请求图片。一共2条请求。
问题3 :浏览器如何通过DNS服务器查询域名所对应的IP地址?
例如www.lab.glasscom.com 所对应的IP,流程如下
- 解析器调用www.lab.glasscom.com
- socker库触发,生成一个发送给DNS服务器的查询消息
- 想DNS服务器发送查询消息
- 发送UDP消息
- 通过网卡
- 到达DNS服务器
- 通过网卡
- 接受UDP消息
- 接受DNS服务器返回的响应消息
- 从响应消息中取出IP地址,存放到<内存地址>中
- 返回应用程序
问题4:DNS之间怎么进行接力?
DNS接受到的查询消息的包含域名,Class的值不变永远是IN代表是互联网,记录类型表示域名对应何种类型的记录,例如类型为A代表域名对应的是IP地址。
一个DNS肯定不可能存放这么多的东西。DNS如何接力。
DNS服务器里面的所有信息都是按照域名然后分层次划分的,类似于公司的部门,科室这样子的。DNS的域名以**.**划分,例如 www.lab.glasscom.com 的查找就是客户端计算机到最近的DNS服务器查找,然后DNS向上回溯,一直到根域,然后根域查到com域,com域又在他的下属查到glasscom域,glasscom域又查找lab域,lab域查找www域,www域刚好有,就查找了 www.lab.glasscom.com 所对应的IP地址了。
问题5: 浏览器如何把消息委托给Web服务器?
还是利用Scoket库里面的一个组件来完成的。
- 调用connect来连接客户端和服务器,客户端告诉connect要连接的服务器IP,描述符,端口号。其中描述符是告诉应用程序需要使用那个套接字去与服务器的套接字连结的,然后服务器IP就是告诉连接的地方,类似于找到了家,但是现在还不知道找谁,就需要端口号了,告诉找谁连接。
- 使用write来传输数据
- 使用read来读取数据
- 断开管道,断开套接字。