HTTP协议的组成
我们可以通过抓包工具Fillder或者其他去抓取一个请求,然后可以看到如下的请求数据和响应数据。分为两部分,一个是客户端的请求信息,一个是服务端的响应信息。抓取到的信息如下:
request
GET https://blog.csdn.net/ HTTP/1.1 (方法 url/uri 协议的版本号 1.1)
Host: blog.csdn.net
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: bdshare_firstime=1510054675527; uuid_tt_dd=7398525774748469362_20171107; __utma=17226283.1814488696.1511346551.1511346551.1511346551.1; shown_offset=30; UE=”330593057@qq.com”; kd_user_id=a54a0320-fbc9-49c0-b20e-a1fa1d568905; __yadk_uid=AeREDFbVeN65SP90Rd7aFkVWct08bnOW; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=1788*1*PC_VC; UserName=fu123123fu; UserInfo=nFz9LpVJyVlH4O31uipOXCOpzdDIHJt%2B4A6k66AYpexaCjXmTohp6MJE7jn7jswbsl46fTNG1YhTzD0QOveGVPVwPTvoJcuDoy0ruAetdVvfNMtKLlS7O%2FRejC3mkBoj; UserNick=%E9%95%BF%E9%A3%8E%E7%A0%B4%E6%B5%AA%E4%BC%9A%E6%9C%8933; UN=fu123123fu; AU=CAA; BT=1527506690441; smidV2=2018052819271901729772f05e8daa0e2c803b987049a40024feadb12875400; TY_SESSION_ID=0043fb77-e6f3-41a0-aee4-7fdfe83256fe; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1527506826,1527594125,1527683613,1527897624; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1527898119; ADHOC_MEMBERSHIP_CLIENT_ID1.0=f02bb531-6d2f-c912-4484-13051426db10; dc_tos=p9o5qe; dc_session_id=10_1527897466390.697277
response
HTTP/1.1 200 OK (协议的版本号 响应状态码 状态码对应的原因)
Server: openresty
Date: Sat, 02 Jun 2018 02:20:00 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Access-Control-Allow-Origin: https://blog.csdn.net
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,body2
ok
0
什么是URL
每个web服务器资源都有一个名字,这样客户端就可以根据这个名字来找到对应的资源,这个资源称之为统一资源标识符(Uniform Resource Identifiers, URI)。
HTTP使用URI来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源足够的信息。
URL,全称是UniformResourceLocator,中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.taofut.com:8080/news/index.jsp?name=taofut&age=27#name
从上面的URL可以看出,一个完整的URL包括以下几部分:
1、协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等。在”HTTP”后面的“//”为分隔符。
2、域名部分:该URL的域名部分为“www.taofut.com”。一个URL中,也可以使用IP地址作为域名使用。
3、端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。
4、虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”。
5、文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件名部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.jsp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
6、锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分。
7、参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“name=taofut&age=27”。参数部分可以允许有多个参数,参数与参数之间用“&”作为分隔符。
URI和URL的区别
URI(Uniform Resource Identifiers)是统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是用一个URI来定位的。
URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
URL是Uniform Resource Locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
总的来说: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 协议的缺陷
1. 通信过程中是使用明文,内容可能会被窃听
2. 不验证通信双方的身份
3. 无法验证报文的完整性,报文可能被篡改