HTTP协议详解

HTTP介绍

超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。HTTP是基于TCP处于应用层的一种协议,与传输层协议不同,它关注的不是像TCP那样的可靠传输,而是站在应用的角度,对传输的信息来具体的使用。HTTP广泛应用于手机APP和浏览器之中。 

一个HTTP请求完整的过程

1)我们在浏览器输入一个网址,浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
2)根据该 IP 地址和端口,将IP地址经过ARP协议转换为具体的物理地址,然后和服务器建立TCP连接,这里会有三次挥手
3)浏览器(客户端)发出HTTP 请求,请求该URL对应的网页
4)服务器对浏览器请求作出响应,并把对应网页html和相关数据发送给浏览器
5)浏览器对收到的html进行解析,展示出来
6)四次挥手,释放连接

URL结构

URL的一般格式为(“[]”内的为可选):

protocol://hostname[:port]/path/[;parameters][?query]#fragment

从上面的URL可以看出,一个完整的URL包括以下几个部分:

1.协议部分:指访问服务器获取资源时,需要使用哪种协议。常用的有http、https、ftp协议等。本例中http后面的“//“为分隔符。

2.域名部分:指资源宿主服务器的主机名或IP地址。本例中的域名部分为:www.imailtone.com。URL中也可以使用IP作为域名。

3.端口部分:域名和端口之间使用“:“作为分隔符,端口不是一个URL必须的部分。http服务的默认端口是80,这种情况下端口号可以省略,如果使用了其他端口必须知名,例如:http://www.cnblogs.com:90/

注:80和8080是两种不同的端口。

80端口是http协议开放的,该协议为上网冲浪次数最多的协议,主要用于www(world wide web)即万维网传输的协议。
8080端口是被用于www代理服务的,可以实现网页浏览,经常在访问某个网站或者使用了代理服务时,会加上“:8080“端口号。另外,Apache Tomcat web server 安装后,默认的服务端口是8080。

4.虚拟目录部分:该部分说明了资源位于服务器的什么地方。从域名后的第一个“/“开始到最后一个“/“为止,是虚拟目录部分。本例中的虚拟目录是“/news/”。

5.文件名部分:从域名的最后一个”/“开始到”?“为止,是文件名部分。如果没有”?“,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。本例中的文件名是“index.asp”。

注:以上”4和5“的部分,就组成了path部分。

6.参数部分:为了向应用程序提供他们所需要的输入参数,以便正确的与服务器进行交互。URL中有个参数组件,由字符”;“将其与URL的其余部分分隔。

例如:”;type=7;nam=true“就是两个参数。

ftp://prep.mit.edu/pub;type=7;nam=true

7.查询部分:很多资源,比如数据库服务、搜索引擎,都可以通过提问问题或进行查询来缩小请求资源的范围。由字符串”?“将其与URL的其余部分分隔开来。从“?”开始到“#”为止之间的部分为参数部分。参数可以允许有多个,参数与参数之间用“&”作为分隔符。本例中的参数部分为“name=tom&;age=20”。

9.锚部分:”#“代表网页中的一个位置,其右面的字符就是该位置的标识符(一般情况下,锚链接会用到)。从“#”开始到最后,都是锚部分。本例中的锚部分是“resume”。锚部分也不是一个URL必须的部分。

URL编码

当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。安全字符,指的是没有特殊用途或者特殊意义的字符。

URL 之所以需要编码,是因为 URL 中的某些字符会引起歧义,比如 URL 查询参数中包含了”&”或者”%”就会造成服务器解析错误;再比如,URL 的编码格式采用的是 ASCII 码而非 Unicode 格式,这表明 URL 中不允许包含任何非 ASCII 字符(比如中文),否则就会造成 URL 解析错误。

URL 编码协议规定(RFC3986 协议):URL 中只允许使用 ASCII 字符集可以显示的字符,比如英文字母、数字、和- _ . ~ ! *这 6 个特殊字符。当在 URL 中使用不属于 ASCII 字符集的字符时,就要使用特殊的符号对该字符进行编码,比如空格需要用%20来表示。

除了无法显示的字符需要编码外,还需要对 URL 中的部分保留字符和不安全字符进行编码。

下面简单总结一下,哪些字符需要编码,分为以下三种情况:

ASCII 表中没有对应的可显示字符,例如,汉字。 不安全字符,包括:# ”% <> [] {} | \ ^ ` 。 部分保留字符,即 &
/ : ; = ? @ 。

HTTP请求方法

格式

 HTTP1.0方法

HTTP1.0 三种请求方法,GET, POST 和 HEAD

HEAD

HEAD请求就是返回只有头部数据,数据部分不返回内容

GET模式的返回头:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-UA-Compatible: IE=EmulateIE7
Date: Sun, 20 Aug 2017 07:11:17 GMT
Connection: close

HEAD模式的返回头:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 45511
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-UA-Compatible: IE=EmulateIE7
Date: Sun, 20 Aug 2017 07:11:51 GMT
Connection: close
Content-Length: 45511

注:HEAD 请求与 GET 请求的区别

HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息,我们可以这样理解,HEAD 方法可以看做是 GET 方法的一个“简化版”或者“轻量版”。

HTTP1.1新增的方法

HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法的基本概念

1、OPTIONS

OPTIONS请求,作用市获取服务器支持的HTTP请求方法,默认情况下会返回允许的请求类型

a、OPTIONS请求,默认情况下会返回允许的请求类型
   Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
   Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
   Access-Control-Allow-Credentials: true

b、一般需要跨域的时候需要设置OPTIONS

c、使用脚本让浏览器跨域进行请求的时候,会检测OPTIONS,对方服务器是否允许跨域。允许的情况下,
才会真正去进行相应请求

当你用浏览器访问 site1.com, 某些脚本操作会提交到site2.com而且附带非浏览器默认的头信息,这个时候浏览器不会直接发出POST请求,先发出OPTIONS请求来判断是否允许发送POST。当对方回复允许了,才能发送POST请求。

2、PUT

在特定目录里上传指定文件,文件名在url中设置

PUT - 发送包

PUT /upload/Untitled HTTP/1.1
Content-Type: application/octet-stream
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest
Content-Length: 284

<data>....

PUT – 返回包

HTTP/1.1 201 Created
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:40:03 GMT
Content-Length: 0
Location: http://192.168.1.64/upload/Untitled
Connection: close

在NGINX中,可以添加如下配置来允许PUT,DELETE

location /upload/ {
		dav_methods  PUT DELETE;
		root   /usr/share/nginx/html;
}

3、DELETE

删除特定目录里的文件,文件名在url中设置

DETELE – 发送包

DELETE /upload/Untitled HTTP/1.1
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest

DELETE – 返回包

HTTP/1.1 204 No Content
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:51:07 GMT
Connection: close

4、TRACE

HTTP TRACE是让我们的web服务器端将客户端的所有请求信息返回给客户端的方法,该方法多见于debug的需求。用完一般关闭TRACE,若不关闭可能会被追踪敏感头部,从而造成漏洞。

5、CONNECT

CONNECT是在特定应用走HTTP协议时会用到

1)proxy可能会用到
2)某些使用http协议,需要长链接的程序(SSL就使用connect)

HTTP状态码

1、HTTP状态码的作用

Web服务器用来告诉客户端,发生了什么事。

1)1XX(100-101) 信息提示

2)2XX(200-206) 成功

200 OK 服务器成功处理了请求(这个是我们见到最多的)

2)3XX(300-307) 重定向

301/302 (永久/临时)(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存

4)4XX(400-417) 客户端错误

400 Bad Request(坏请求),告诉客户端,它发送了一个错误的请求。401 Unauthorized(未授权)需要客户端对自己认证
403  Forbidden(禁止) 请求被服务器拒绝了
404 Not Found 未找到资源

5)5XX(500-505) 服务端错误

500 Internal Server Error(内部服务器错误)  服务器遇到一个错误,使其无法为请求提供服务
501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务
502  Bad Gateway(网关故障)代理使用的服务器遇到了上游的无效响应
503  Service Unavailable(未提供此服务)服务器目前无法为请求提供服务,但过一段时间就可以恢复服务
504  Gateway Timeout(网关超时) 与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时

常用的http请求头以及响应头(将遇到的补充)

请求头

1、Accept

Accept: text/html  浏览器可以接受服务器回发的类型为 text/html。

Accept: */*   代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。

2、Accept-Encoding

Accept-Encoding: gzip, deflate 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。

3、Accept-Language

Accept-Language:zh-CN,zh;q=0.9  浏览器申明自己接收的语言。

4、Connection

Connection: keep-alive  当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

5、Host(发送请求时,该报头域是必需的)

Host:www.baidu.com 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

6、Referer

Referer:https://www.baidu.com/?start=1当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

7、User-Agent

User-Agent:Mozilla/...,告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

8、Cache-Control

Cache-Control:private 默认为private  响应只能够作为私有的缓存,不能再用户间共享

9、Cookie

Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。

10、Range(用于断点续传)

Range:bytes=0-5 指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。

响应头

1、Cache-Control(对应请求中的Cache-Control)

Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享

2、Content-Type

Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

3、Content-Encoding

Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

4、Date

Date: Tue, 03 Apr 2020 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

5、Server

Server:Tengine/1.4.6  这个是服务器和相对应的版本,只是告诉客户端服务器信息。

6、Transfer-Encoding

Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

7、Expires

Expires:Sun, 1 Jan 1994 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

8、Last-Modified

Last-Modified: Dec, 26 Dec 2019 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)

9、Connection

Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。

10、Etag

ETag: "637060cd8c284d8af7ad3082f209582d" 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。

11、Refresh

Refresh: 5; url=http://baidu.com  用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。

12、Access-Control-Allow-Origin

Access-Control-Allow-Origin: *   *号代表所有网站可以跨域资源共享,如果当前字段为*那么Access-Control-Allow-Credentials就不能为true

Access-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享

13、Access-Control-Allow-Methods

Access-Control-Allow-Methods:GET,POST,PUT,DELETE  允许哪些方法来访问

HTTPS

HTTPS与HTTP几乎没有区别,唯一的区别就是HTTPS在HTTP的基础之上引入了一个加密层。

HTTPS中引用的加密层,称为SSL/TLS,这之中涉及到的加密操作主要有两种方式:

1、对称加密:使用同一个密钥可以进行加密也可以进行解密。

2、非对称加密:有两个密钥,分别是公钥和私钥,其中一个用来加密,另一个用来解密。

参考:WEB安全梳理-HTTP协议 - FreeBuf网络安全行业门户

详解 —— HTTP协议_lingxu6的博客-CSDN博客_http协议

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值