网络是怎样链接的
名词简介:
HTTP协议:
HTTP协议之URL篇:
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP URL (统一资源定位符,URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
[http://host[":"port\][abs_path](http://host[""port][abs_path/)]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80(通常情况下可以省略);abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp
HTTP协议之请求篇:
http请求由3部分组成,包括请求行,请求头,请求体。
请求行:
主要结构为:<方法><空格>
其中请求方法有以下几种:
方法 含义
GET 获取URI指定的信息。如果URI指定的是文件则返回文件的内容,如果URI指定的CGI程序,则返回该程序的输出数据。
POST 从客户端向服务器发送数据,一般用于发送表单中填写的数据等情况下。
HEAD 和GET基本相同。只不过它只返回HTTP的消息头,而并不返回数据的内容。用于获取文件的最后的更新时间等信息。
PUT 替换URI指定的服务器上的文件。如果URI指定的文件不存在,则创建该文件。
OPTIONS 用于通知或查询通信选项。
DELETE 删除URI指定的服务器上的文件。
TRACE 将服务器上收到的请求行和头部直接返回给客户端。用于在使用代理环境中检查改写请求的情况。
CONNECT 使用代理传输加密消息时使用的方法。
请求头:
消息头的规格中定义了很多项目,如日期,客户端支持的数据类型,语言,压缩格式,客户端和服务器的软件名称和版本,数据有效期和最后更新时间等,其中主要的头字段如下:

消息体:
写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需要发送的数据。
HTTP协议之响应篇:
http请求由3部分组成,包括状态行,响应头,响应体。
状态行:
在响应消息中第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。
状态码是一个数字,它主要用来向程序告知执行的结果;相对的,响应短语则是一段文字,用来向人们告知执行的结果。
状态码 含义
1** 告知请求的处理进度和情况
2** 成功
3** 表示需要进一步操作
4** 客户端错误
5** 服务器错误
响应头:

响应体:
响应体就是服务器返回的资源的内容。
全世界的DNS的大接力:
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
接力过程:
首先客户端会先访问最近的一台DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址),假设我们要查询www.baidu.com。由于最近的DNS服务器没有存放这一域名对应的消息,所以我们需要从上层开始向下找。最近的DNS服务器中保存了根域DNS服务器的信息,因此它会将来自客户端的查询消息转发给根域的DNS服务器。根域的中的DNS服务器中也没有www.baidu.com这个域名,但根据域名结构可以判断这个域名属于com域,因此根域的DNS服务器会返回它所管理的com域中的DNS服务器的IP地址,以此类推最终会找到我们需要的IP地址。但是有时候我们并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存的功能,可以记住之前查询过的域名,那么就直接可以从缓存中得到所需的信息,接下来的查询可以从缓存的位置开始向下进行,并且当要查询的域名不存在时,“不存在”这一响应结果也会被缓存,方便下次的快速响应。
连接过程:
注:本过程不止只适用于浏览器,其他的应用程序也可以适用。
浏览器第一步进行的工作就是对URL进行解析,对URL进行解析完成后,浏览器会使用HTTP协议来访问web服务器,生成HTTP消息之后接下来会委托操作系统将消息发送给web服务器,在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。查询IP地址的方法很简单,只需要询问最近的DNS服务器,之后会调用解析器(实际上是一段程序,它包含在操作系统的Socket库中),查询到之后解析器会读取消息取出IP地址,并将IP地址写入程序指定的内存地址中,应用程序这时可以取出内存地址中的IP地址,知道IP地址之后,就可以委托操作系统内部的协议栈向这个目标的IP地址,也就是我们要访问的web服务器发送消息,在进行发送消息之前需要先在建立连接的管道,建立管道的关键在于管道两端的数据出入口,这些出入口成为套接字。在创建套接字的时候客户端会调动Socket库中,之后在套接字创建完成之后,协议栈会返回一个描述符(用于区分不同的套接字),并将它放到内存之中,接下来我们需要委托协议栈将客户端创建的套接字与服务器的套接字连接起来,应用程序调动Socket库中名为connect的程序组件完成这一操作,当调动connect时,需要指定描述符(协议栈会根据这个描述符来判断到底使用哪一个套接字进行连接),服务器IP地址和端口号这3个参数。连接成功之后,协议栈会将对方的IP地址和端口号等信息保存到套接字中。之后就是进行通信阶段,因为应用程序无法直接控制套接字,所以还是要通过Socket库来委托协议栈来完成这个操作,这时候要使用write这个程序组件,当指定好描述符和发送数据之后就可以发送数据了,接下来,服务器会执行接收操作,解析收到的数据内容并向客户端响应消息,在接收到消息返回之后,客户端通过Socket库中的read程序组件委托协议栈,并将收到的消息存放到接收消息缓冲区,消息接收完之后,根据HTTP协议的规定服务器会先执行Socket库中的close来执行断开操作(实际上客户端和服务器哪一方先执行都有可能),断开操作到达客户端之后,客户端也会调用Socket库中的close来进行断开操作(在HTTP1.1中可以由客户端在进行完所有数据的传输之后再进行断开),自此整个通信活动结束。