HTTP协议是一种应用层的传输协议,它是基于客户端和服务器的一种数据传输协议:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求,并构建响应信息,将所请求的资源或数据发送给客户端。
在详细介绍HTTP之前,我们先来介绍一下URL和URI。通常我们在上网的时候需要在浏览器上输入一个网址,这个我们俗称的网址,就可以说成是URL,又叫统一资源定位符。列如: www.baidu.com:/home/index.html这就是一个URL。一个完整的URL结构应该包括以下几个部分:协议方案名、认证信息、服务器地址、端口号、请求资源路径、查询字符串、片段标识符。我们来看下面这幅图
其中,HTTP默认端口号为80,可以省略,一个URL一定要按照合法的格式来确定,比如URL中的参数(查询字符串)之前有个"?"。当然,在URL中一些特殊的字符会被进行一些转义处理,规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式 例如:C++ '+'的十六进制为2B 所以C++ 转义之后为C%2B%2B。URI(同一资源标识符),用来唯一标识一个资源,往往是一个路径。
URI:/home/index.html
URL: www.baidu.com:80/home/index.html
我们已经知道,HTTP是一种请求/响应模式的协议,所以它具有自己的协议格式。
HTTP请求格式:请求首行、头部、空行、正文。每个部分都以\r\n结尾。
请求首行包括三个部分:请求方法、URI、协议版本。
常见的请求方法:
方法 | 说明 |
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINE | 断开连接关系 |
协议版本有1.0、1.1。
头部是以键值对的形式出现,中间用冒号空格隔开,列如:Content-Length: 100
对于头部的种类我们后面详细介绍。
空行是用于将正文与请求信息分隔开,不可缺少。
响应信息同样包含首行、头部、空行和正文。
响应首行又分为:协议版本、状态码、状态码描述(中间用空格隔开),状态码和状态描述后面详细介绍。
一下是HTTP请求信息和响应信息:可以在浏览器中按F12查看
我们知道,在浏览器上输入URL的时候,相当于发出请求,那么浏览器是怎么知道,我所请求的数据或资源是在哪个ip地址下的服务器呢?这就需要一种技术叫做DNS,端口号为53(域名解析协议)。
DNS就是将域名解析为对应的ip地址,从而方便我们去访问互联网。
TCP/IP中使⽤IP地址和端⼝号来确定网络上的⼀台主机的⼀个程序. 但是IP地址不⽅便记忆. 于是⼈们发明了⼀种叫主机名的东⻄, 是⼀个字符串, 并且使⽤hosts⽂件来描述主机名和IP地址的关系。最初, 通过互连网信息中⼼(SRI-NIC)来管理这个hosts⽂件的。如果⼀个新计算机要接⼊网络, 或者某个计算机IP变更, 都需要到信息中⼼申请变更hosts⽂件。其他计算机也需要定期下载更新新版本的hosts⽂件才能正确上网。这样就太⿇烦了, 于是产⽣了DNS系统.。
⼀个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系。如果新计算机接⼊网络, 将这个信息注册到数据库中;
⽤户输⼊域名的时候, 会⾃动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址。⾄今, 我们的计算机上仍然保留了hosts⽂件.。在域名解析的过程中仍然会优先查找hosts⽂件的内容。输⼊域名后, 先查找⾃⼰主机对应的域名服务器,域名服务器先查找⾃⼰的数据库中的数据. 如果没有, 就向上级域名服务器进⾏查找, 依次类推,最多回溯到根域名服务器, 肯定能找到这个域名的IP地址。
HTTP协议请求方法:
1.GET方法:用于获取资源,被URI标识的资源,参数放在URI中,可以提交的参数有限。客户端来访问服务器的某些资源。
2.POST方法:传输实体主体,参数放在正文当中,长度不限。将数据和资源信息告诉服务器
3.PUT方法:传输文件,将指定文件传输到URI的路径中,具有安全问题,大部分web不使用。
4.HEAD方法:获取报文首部,和GET类似,不返回信息主体,用于确认URI的有效性和资源的有效性。
5.DELETE方法:与PUT相反,用于删除指定路径的资源,不安全,一般也不会使用。
6.OPTIONS方法:用于询问支持的方法。
7.TRACE
8.CONNECT:将服务器作为代理,让服务器代替用户访问其他网页,将数据返回给用户。常用于翻墙
HTTP头部:
Content-Type:文件类型。
Content-Length:正文的长度。
Content-Range:WEB服务器表明该响应包含的部分对象为整个对象的哪个部分,断点续传。
Host:客户端告知服务器,资源在哪个主机的哪个端口上。请求头
User-Agent:声明用户操作系统和浏览器的版本信息。请求头
Referer:当前页面是从哪个页面跳转过来的。请求头
Accept:表示客户端自己希望接收到的数据类型。请求头
Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法。请求头
Accept-Language:浏览器声明自己接收的语言。请求头
Connect:close 请求——告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了。响应——链接已经关闭。 keep-alive 请求——告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。 响应——连接保持着,在等待本次连接的后续请求。
Cookie:用于维持服务端会话状态的,通常由服务端写入,在客户端存储少量信息,在后续请求中,供服务端读取。请求头
Set-Cookie:设置HTTP cookie。响应头
Server:服务器名称。响应头
Location:用于在进行重定向,或在创建了某个新资源时使用,搭配3xx状态码使用,告知客户端接下来去哪里访问。响应头
状态码及其描述:
是用以表示服务器HTTP响应状态的3位数字代码。通过状态码,就可以知道服务器端是否正确的处理的请求,如果不正确,是因为什么原因导致的。
类别 | 原因短语 | |
1xx | Informational(信息行状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
200 OK:客户端发来的请求被正确处理。
204 NO Content:表明请求结果被正确处理了,但是相应信息中没有正文。
206 Partial Content:该状态码表示客户端对服务器进行了范围请求,而且服务器成功的执行了这部分GET请求,响应报文中包含由Content-Range指定的实体范围。
301 Moved Permanently:永久性重定向,该状态码表示请求的资源已经被分配了新的URI,以后应使用新的URI,也就是说,如果之前将老的URI保存为书签了,后面应该按照响应的Location首部字段重新保存书签。
302 Found:目标资源被分配了新的URI,希望用户本次使用新的URI进行访问。
307 Temporary Redirect:临时重定向,目标资源被分配了新的URI,希望用户本次使用新的URI进行访问。
400 Bad Request:该状态码表明请求报文中存在语法错误,需修改请求内容重新发送。
403 Forbidden:浏览器所请求的资源禁止访问。
404 Not Found:没有请求的资源。
500 Internal Server Error:表明服务器在执行时候发生错误,可能是web本身的bug或者故障。
503 Server Unavailable:该状态码表明服务器目前处于超负载或正在进行停机维护状态,目前无法请求处理。
HTTP特点:
1、简单快速,HTTP服务器的程序规模小,通信速度快。
2、灵活,HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type标识。
3、无连接。每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用
这种方式可以节省传输时间。可以在头部Connect字段修改为keep-alive,有连接。
4、无状态。http协议每当有新的请求产生,就会有对应的新响应产生。协议本身并不会保留你之前的一切请求或者响应,这是
为了更快的处理大量的事务,确保协议的可伸缩性。但是为了保持状态的功能,引入了Cookie技术。