浅析http协议

http简介

http协议是超文本传输协议(Hyper Text Transfer Protocol),是目前应用最广泛的一种互联网协议,目前使用http/1.1 。http采用请求/应答(request/response)方式,定义客户端和浏览器数据传输。http广泛应用于tcp/ip协议中,但是事实上,只要达到http协议条件,它可以用在任何互联网协议中。


http特点

1.简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。常用方法有get、post、head。由于http协议简单,因而通信快速。

2.灵活:http协议允许传输任意类型的数据对象,正在传输的类由content-type标记。

3.无连接:无连接的含义是每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户的应答后,即断开连接。采用这种方式
可以节省传输时间。

4.无状态:http协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着后续如果要处理就需要重传,这样会导致连接的数据量增大,另一方面服务器不需要之前信息它的应答就很快。支持b/s,c/s。

http之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL可以看出,一个完整的URL包括以下几部分:
1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

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

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

(原文:http://blog.csdn.net/ergouge/article/details/8185219 )



URI和URL区别

URI,是uniform resource identifier,统一资源标识符,用来标识一个资源。

web上可用的每种资源如html文档、图像、视频片段、程序都是一个URI来定位的。
URI一般由三部分组成:
1.访问资源命名机制
2.存放资源的主机名
3.资源自身的名称,由路径表示,着重于强调资源

URL是uniform resource locator,统一资源定位器,它是具体的URI,即不但标识了一个资源,还告诉你如何定位这个资源。

URL是Internet上用来描述信息资源的字符串,主要用于在各种www客户程序和服务程序上。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器地址、目录等。
URL一般由三部分组成
1.协议
2.存有该资源的主机ip地址(有时也包括端口号)
3.主机资源具体地址,如目录、文件名等

http之请求消息request

客户端发送一个http请求到服务器请求消息有以下格式:
请求行(request line)、请求头部(request  header)、空行和请求数据(request body)四个部分组成。

请求行以一个方法符号开头,以空格分开,后面跟着URL和协议版本。

1.Get请求例子,用Charles抓取的request

GET /ssmdemo2/jsp/login/login.jsp HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.10 Safari/537.36
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

第一部分请求行,用来说明请求类型、要访问的资源以及使用的http版本

"Get"说明请求类型为Get," /ssmdemo2/jsp/login/login.jsp"是资源的URL," HTTP/1.1"说明http版本为1.1

第二部分请求头部,紧接着请求行(第一行)之后的部分,用来说明服务器要使用的附加信息

第二行起为请求头部,Host代表请求目的地,可以是域名或主机ip+端口号," localhost:8080"代表目的地为当前计算机ip,端口号是8080。User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息 由你的浏览器来定义,并且在每个请求中自动发送等等。

第三部分空行,请求头后面的空行是必须的

即使第四部分的请求数据为空,也必须有空行。

第四部分请求数据也叫主体,可以添加任何其他数据

该例子请求数据为空

2.Post请求例子,用Charles抓取的request

POST /ssmdemo/login/login HTTP/1.1
Host: localhost:8080
Content-Length: 29
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.10 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/ssmdemo/jsp/login/login.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=8A7EA015D0FE02CED5E3DBEA667BB95D

username=admin&password=admin

第一部分请求行,请求类型post,http1.1版本
第二部分请求头,第二行到空行之前都是,Cookie是放到请求头里的。
第三部分空行,空行是必须的。
第四部分请求数据,这里"username=admin&password=admin"就是要请求的数据

http之响应消息response

一般情况下,服务器接收并处理客户端请求后会返回一个http响应消息
http响应也由四部分组成,分别是状态行、消息报头、空行和响应正文

例子:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Content-Length: 272
Date: Mon, 14 May 2018 07:28:25 GMT
Proxy-Connection: Keep-alive

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功
</body>
</html>

第一部分状态行,该部分由http版本号、状态码和状态消息三部分组成

上述例子中,http版本号1.1,状态码200,状态消息ok

第二部分消息报头,用来说明客户端要使用的一些附加信息

第一行之后到空行之前的都是消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

第三部分空行,消息报头之后的空行是必须的

第四部分相应正文,服务器返回给客户端的文本信息

空行后面的部分就是相应正文

http之状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

http请求方法

根据http标准,http可以使用多种请求方法。
http1.0定义了三种请求方法:GET、POST、HEAD
http1.1又增加了5种方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法。
GET      请求指定的页面信息,并返回实体主体。
HEAD      类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST      向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致                新的资源的建立和/或已有资源的修改。
PUT      从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

http工作原理

http采用请求/响应的模式。http定义客户端如何请求服务器web页面,以及服务器如何如何把web页面传送给客户端。客户端向服务器发送请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以状态行进行响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下http请求/响应步骤:

1.客户端连接到web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。

2.发送http请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3.服务器接受请求并响应客户端

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4. 释放连接TCP连接

若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

5.客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

5、释放 TCP连接;

6、浏览器将该 html 文本并显示内容;  


GET和POST区别


GET请求

GET /books/?sex=man&name=Professional HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Connection: Keep-Alive

注意最后一行是空行

POST请求

POST / HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 40

Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

1、GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

2、传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。

因此对于GET提交时,传输数据就会受到URL长度的 限制。

POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3、安全性

POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击


我们看看GET和POST的区别

1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

4.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。


总结:

1.http全称是超文本传输协议,广泛应用于tcp/ip中。

2.http有四个特点, 简单快速、灵活、无连接、无状态

3.http采用 请求响应模式定义了客户端和服务器之间的通信


4.URI全称是统一资源标识符,用来标识一个资源;URL全称是统一资源定位器,是特殊的URI, 既可以标识资源还能定位到资源。
5. http request请求由请求行(request line)、请求头部(request  header)、空行和请求数据(request body)四个部分组成。请求行,用来说明请求类型、要访问的资源以及使用的http版本。请求头部,用来说明服务器要使用的附加信息,如host、cookie。请求数据也叫主体,可以添加任何其他数据。


6. http response响应由状态行、消息报头、空行和响应正文四部分组成。状态行,该部分由http版本号、状态码和状态消息三部分组成,状态码是三位数字。消息报头,用来说明客户端要使用的一些附加信息,如Content-type。响应正文,服务器返回给客户端的文本信息。

7.http工作原理:

    1.客户端连接到web服务器
    2.发送http请求
    3.服务器接受请求并响应客户端
    4.释放连接TCP连接
    5.客户端浏览器解析HTML内容


8.Get和post请求的区别:
    1. Get将数据放在URL,用"?"连接,多个参数用"&"连接,而Post将数据放入request body,比较安全,前者容易遭受CSRF攻击
    2.理论上http长度没有限制,但Get因为数据放入URL请求固有长度限制(受浏览器影响),Post无限制,但一般服务器会设置限制。
    3.Get将数据放在URL,所以会直接出现在地址栏,Post就不会。

9.URL组成有:协议部分、域名部分、端口部分、虚拟目录、文件名部分、锚部分,参数部分。如"http://"+"www.abc.com"+":80"+"/abc"+"/abc.html",域名部分也可以是ip地址。虚拟目录之后的部分都不是必须的。

10.URL一般由三部分组成
    1.协议
    2.存有该资源的主机ip地址(有时也包括端口号)
    3.主机资源具体地址,如目录、文件名等

11.状态码与常见状态码:

    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求

     200 OK //客户端请求成功
     400 Bad Request //客户端请求有语法错误,不能被服务器所理解
     401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
     403 Forbidden //服务器收到请求,但是拒绝提供服务
     404 Not Found //请求资源不存在,eg:输入了错误的URL
     500 Internal Server Error //服务器发生不可预期的错误
     503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

12.http请求方法类型
    http1.0定义了三种请求方法:GET、POST、HEAD
    http1.1又增加了5种方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法。

参考https://www.cnblogs.com/ranyonsue/p/5984001.html





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值