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的各部分组成:
从上面的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服务器
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