当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。
Http 协议的组成
大家可以通过抓包工具,Fillder 或者其他去抓去一个请求,然后可以看到如下的请求数据和响应数据。分为两部分,一个是客户端的请求信息,一个是服务端的响应信息。抓去到的信息如下:
POST https://re.csdn.net/csdnbi HTTP/1.1
方法 url/uri 协议的版本号 1.1
Host: re.csdn.net
Connection: keep-alive
Content-Length: 167
Accept: */*
Origin: https://www.csdn.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/66.0.3359.23 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Referer: https://www.csdn.net/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: uuid_tt_dd=10_19119862890-1514946902631-
786149;
__utma=17226283.1502834598.1514952032.1514952032.
1514952032.1;
__utmz=17226283.1514952032.1.1.utmcsr=(direct)|ut
mccn=(direct)|utmcmd=(none); kd_user_id=accb9177-
52d8-41f3-b69e-54bb338ffb23; UN=q331464542;
UM_distinctid=1610314af5bb3a-012f62bad56aa5-
71103742-1fa400-1610314af5ca34;
Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=1788*1*PC_
VC; BT=1523867282719;
smidV2=20180517165125ad3024b867497a0fbd79f81ef81c
dd4400ceee13dc5e27d30;
dc_session_id=10_1527227855207.688716;
Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=152741308
2,1527413263,1527413731,1527415074;
Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=15274229
24; dc_tos=p9dz2k
--------------
[{"headers":{"component":"enterprise","datatype":
"re","version":"v1"},"body":"{\"re\":\"ref=-
&mtp=4&mod=ad_popu_131&con=ad_content_2961%2Cad_o
rder_731&uid=-&ck=-\"}"}]

response
HTTP/1.1 200 OK
协议版本号 响应状态码 状态码对应的原因
Server: openresty
Date: Sun, 27 May 2018 12:08:44 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Access-Control-Allow-Origin: https://www.csdn.net
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: DNT,XCustomHeader,
Keep-Alive,User-Agent,X-Requested-
With,If-Modified-Since,Cache-Control,Content-
Type,body
2
ok
0
URL(Uniform Resource Locator)
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,基本格式“
例如:
http://www.gupaoedu.com:80/java/index.html?name=mic#head
schema://host[:port#]/path/.../?[url-params]#[ query-string]
scheme 指定应用层使用的协议(例如:http, https, ftp)
host HTTP 服务器的IP 地址或者域名
port# HTTP 服务器的默认端口是80,这种情况下端
口号可以省略。如果使用了别的端口, 必须指明, 例如
http://www.gupaoedu.com:8080/
path 访问资源的路径
query-string 查询字符串
片段标识符(使用片段标识符通常可标记出已
获取资源中的子资源(文档内的某个位置))
URI(Uniform Resource Identifier)
每个web 服务器资源都有一个名字,这样客户端就可以根据这个名字来找到对应的资源,这个资源称之为(统一资源标识符).总的来说:URI 是用一个字符串来表示互联网上的某一个资源。而URL表示资源的地点(互联网所在的位置)
请求方法
HTTP 发起的每个请求,都需要告诉告诉服务器要执行什么动作,那么这个动作就是前面报文中看到的【method】。http 协议中提供了多个方法,不同方法的使用场景也也不一样。
GET:一般是用于客户端发送一个URI 地址去获取服务端的资源(一般用于查询操作)
POST:一般用户客户端传输一个实体给到服务端,让服务端去保存(一般用于创建操作)
PUT:向服务器发送数据,一般用于更新数据的操作
HEAD:用于向服务端发起一个查询请求获取head 信息,比如获取index.html 的有效性、最近更新时间等。
DELETE:客户端发起一个Delete 请求要求服务端把某个数据删除(一般用于删除操作)
OPTIONS:查询指定URI 支持的方法类型(get/post)http1.1 还支持 trace(追踪路径)和connect 方法类型.
HTTP 协议的特点
HTTP 协议是无状态的,什么是无状态呢?就是说HTTP 协议本身不会对请求和响应之间的通信状态做保存。
如何实现有状态的协议
Http 协议中引入了cookie 技术,用来解决http 协议无状态的问题。通过在请求和响应报文中写入Cookie 信息来控制客户端的状态;Cookie会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。在基于tomcat 这类的jsp/servlet 容器中,会提供session 这样的机制来保存服务端的对象状态。那么整个状态协议的流程就是这样的:

HTTP 协议的缺陷
- 通信过程中是使用明文,内容可能会被窃听
- 不验证通信双方的身份
- 无法验证报文的完整性,报文可能被篡改
改进:
使用HTTPS协议