加载中...
加载中...
HTTP超文本传输协议(HyperText Transfer Protocol)

HTTP超文本传输协议(HyperText Transfer Protocol) 原创

HTTP(超文本传输协议)简介 

超文本传输协议主要用于访问WWW上的数据。协议以普通文本、超文本、音频、视频等格式传输数据。称为超文本协议,原因是在应用环境中,它可以快速的在文档之间跳转。HTTP在公认端口80上使用TCP服务。

HTTP协议从诞生到现在已经有若干个版本,其中最关键的版本为:HTTP/1.0、HTTP/1.1,其中 HTTP/1.1版本 是当前使用的主流版本。  

HTTP协议在运输层的使用 TCP协议提供的服务。  

HTTP报文

HTTP 请求报文由四部分组成,分别是请求行、请求头、空行和请求体,其中空行、冒号也是组成部分之一,作用是进行分隔,必不可少。  

HTTP报文有两种一般的类型:请求和响应。这两种报文类型的格式差不多。

格式如下:

请求报文格式如下:   

HTTP/1.1请求报文格式 

响应报文格式如下:    

 HTTP/1.1响应报文格式

请求报文 

请求报文由4个部分组成,分别是:1、1请求行、请求头部、空行和报文主体;其中请求行、请求头部和空行是必需的而报文主体是可选的。

请求报文格式如下: 

请求行

请求行包含3个部分:请求方法、URL和协议版本;它们之间用空格分开。

请求行最后以一个回车符和一个换行符结尾。回车符是"\r",换行符是"\n"。

请求方法字段

请求方法表明想对目标资源进行何种操作,http1.1定义了下表中列出的8种请求方法,其中最常用的是GET和POST。 
 1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
5、PUT
向指定资源位置上传其最新内容。
6、DELETE
请求服务器删除Request-URL所标识的资源。
7、TRACE
回显服务器收到的请求,主要用于测试或诊断。
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的 ,当前HTTP协议中的方法都是大写  
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的。  

HTTP的方法表

方法

描述

GET

从指定的资源请求数据。

POST

向指定的资源提交要被处理的数据。

HEAD

GET 相同,但只返回 HTTP 报头,不返回文档主体。

PUT

上传指定的 URI 表示。

DELETE

删除指定资源。

OPTIONS

返回服务器支持的 HTTP 方法。

CONNECT

把请求连接转换到透明的 TCP/IP 通道。

GET与POST区别

1. GET是从服务器上获取数据, POST  是向服务器传送数据。
2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。

3.  GET安全性非常低, GET设计成传输数据,一般都在地址栏里面可以看到,POST安全性较高, 在地址栏看不到。(如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监到。

4. GET请求在URL中传送的参数是有长度限制的,而POST没有(在浏览器中非HTTP规定的)。

get有长度限制为1024B吗?网上大多是这么说的,很长一段时间我也以为是HTTP规定的。

实际上HTP get方法提交的数据大小长度并没有限制,Http协议规范没有对URL长度进行限制。目前说的get长度有限制,是特定的浏览器及服务器对它的限制。

POST是没有大小限制的(浏览器没有)。HTTP协议规范也没有进行大小限制,起限制作用的是服务器处理程序的处理能力。  

5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。

6. HTTP的底层是TCP/IP,GET/POST都是TCP链接。GET和POST能做的事情是一样的。

7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

HTTP状态码:

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

HTTP常用的状态码

消息:

描述:

200 OK

请求成功(其后是对GETPOST请求的应答文档。)

300 Multiple Choices

多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。

301 Moved Permanently

所请求的页面已经转移至新的url

400 Bad Request

服务器未能理解请求。

401 Unauthorized

被请求的页面需要用户名和密码。

403 Forbidden

对被请求页面的访问被禁止。

404 Not Found

服务器无法找到被请求的页面。

500 Internal Server Error

请求未完成。服务器遇到不可预知的情况。

万维网的大致工作工程
 

HTTP长连接
在HTTP/1.0时期,每次HTTP请求都会创建一个新的TCP连接,请求完成后之后这个TCP连接就会被关闭。这种通信模式的效率不高,所以在HTTP/1.1中,引入了HTTP长连接的概念,使用长连接的HTTP协议,会在响应头加入Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的TCP连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接,也就是说两个请求可能共用一个TCP连接。省去了下一次的TCP三次握手。
HTTP/1.1中的长连接依然没有解决 head of line blocking 的问题,后面的连接必须等待前面的返回了才能够发送,这个问题直到HTTP/2.0采取二进制分帧编码方式才彻底解决。

Cookie和Session

UDP协议具有不可靠性和不安全性,这很难满足web应用的需要。而TCP协议是基于连接和三次握手的,虽然具有可靠性,但也比较消耗资源。
场景:如果几十万个客户端和服务器一直保持连接状态,那服务器需要多高的要求才能满足承载!
于是就产生了HTTP协议。基于TCP的可靠性连接。在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,又满足了安全性和可靠性。
正因为HTTP在请求之后,服务器端立即关闭连接、释放资源,所以大家通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了什么”,其实很大程度上是基于性能考虑的。于是后面就有了cookie和session这些技术。
HTTP协议是无状态的,请求与请求之间是没有关系的。因此HTTP协议需要一种技术让请求与请求之间建立起联系,并且服务器需要知道这个请求来自哪个用户,于是Cookie技术就出现了。

Cookie
Cookie是HTTP报文的一个请求头,Web应用可以将用户的标识信息或者其他一些信息(用户名等)存储在Cookie中。用户经过验证之后,每次HTTP请求报文中都包含Cookie,这样服务器读取这个Cookie请求头就知道用户是谁了。
Cookie储存在客户端,里面包含了每次请求中都需要传递的信息。
由于Cookie存储在本地,这样就非常的不安全。浏览器在Cookie中填充了一个Session ID之类的字段用来标识请求。
Session
Session储存在服务器端,里面保存了用户的状态,用户信息以Session的形式存储在服务端。当用户请求到来时,服务端可以把用户的请求和用户的Session对应起来。

工作过程:
服务器在创建Session的同时,会为该Session生成唯一的Session ID,当浏览器再次发送请求的时候,会将这个Session ID带上,服务器接受到请求之后就会依据Session ID找到相应Session,找到Session后,就可以在Session中获取或者添加内容了。而这些内容只会保存在服务器中,发到客户端的只有Session ID,这样相对安全,也节省了网络流量,因为不需要在Cookie中存储大量用户信息。


sessionId的生成过程和过期时间
sessionId是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,并且有一个sessionId。
tomcat生成的sessionId叫做jsessionid; jetty为sessionId。

在Java中,是Web应用程序在调用HttpServletRequest的getSession方法时,由Web容器(比如Tomcat、Jetty、Netty)创建的。
Tomcat的Session管理器提供了多种持久化方案来存储Session,通常会采用高性能的存储方式,比如Redis,并且通过集群部署的方式,防止单点故障,从而提升高可用。同时,Session有过期时间,因此Tomcat会开启后台线程定期的轮询,如果Session过期了就将Session失效。


URL字段

URL字段用来指明目标资源的位置,它只包含一个完整URL中的文件路径和查询字符串这两部分,比如"/index.html?id=666",而不包含协议、主机名和端口号。如果同一服务器上部署了多个网站,那么为了准确判断出请求的是哪个资源需要将URL字段和Host请求头的值(指定要访问的网站名)相结合使用。

协议版本字段

说明该请求报文属于哪一版的http协议,比如HTTP/1.1或HTTP/1.0。

请求头部

  

请求头部用来告知服务器该请求和客户端本身的一些额外信息,有多个请求头部,每个请求头都是一个键值对,键和值之间用英文冒号隔开。每个请求头单独形成一行,它们的末尾都是一个回车符加一个换行符。

请求报文中常见的请求头部:  

来自:https://www.cnblogs.com/yanggb/p/11684494.html

Request Headers的候选属性  

候选属性说明示例
Accept指定客户端能够接收的内容类型Accept: text/plain, text/html
Accept-Charset浏览器可以接受的字符编码集Accept-Charset: iso-8859-5
Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型Accept-Encoding: compress, gzip
Accept-Language浏览器可接受的语言Accept-Language: en,zh
Accept-Ranges可以请求网页实体的一个或者多个子范围字段Accept-Ranges: bytes
AuthorizationHTTP授权的授权证书Authorization: Basic QWxhZLRpbjpvcGVuIHNoc2FtZQ==
Cache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cache
Connection表示是否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close
CookieHTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器Cookie: $Version=1; Skin=new;
Content-Length请求的内容长度Content-Length: 348
Content-Type请求的与实体对应的MIME信息Content-Type: application/x-www-form-urlencoded
Date请求发送的日期和时间Date: Tue, 15 Nov 2018 08:22:31 GMT
Expect请求的特定的服务器行为Expect: 100-continue
From发出请求的用户的EmailFrom: user@email.com

If-Match只有请求内容与实体相匹配才有效If-Match: "737060ff8c284d8af7ad2082f209582d"
If-Modified-Since如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码If-Modified-Since: Sat, 29 Oct 2018 19:43:31 GMT
If-None-Match如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变If-None-Match: "737060cd8c284d8af7ad3082f209582d"
If-Range如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为EtagIf-Range: "737060cd8c284d8af7ad3082f209582d"
If-Unmodified-Since只在实体在指定时间之后未被修改才请求成功If-Unmodified-Since: Sat, 29 Oct 2018 19:23:11 GMT
Max-Forwards限制信息通过代理和网关传送的时间Max-Forwards: 10
Pragma用来包含实现特定的指令Pragma: no-cache
Proxy-Authorization连接到代理的授权证书Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range只请求实体的一部分,指定范围Range: bytes=500-999
Referer先前网页的地址,当前请求网页紧随其后,即来路Referer: http://www.yanggb.com/yanggb1.html
TE客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息TE: trailers,deflate;q=0.5
Upgrade向服务器指定某种传输协议以便服务器进行转换(如果支持)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-AgentUser-Agent的内容包含发出请求的用户信息User-Agent: Mozilla/5.0 (Linux; X11)
Via通知中间网关或代理服务器地址,通信协议Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning关于消息实体的警告信息Warn: 199 Miscellaneous warning

对于host字段

host字段可以是域名,也可以是ip地址。host字段域名/ip后可以跟端口号,如Host: www.leixing123.com:80
host可以由程序自定义,某些程序为了防止运营商或防火墙拦截会定义虚假host
http头中可以没有host字段吗?
在http 1.1中不能缺失host字段,如果缺失, 服务器返回400 bad request;http1.1中不能缺失host字段,但host字段可以是空值。
在http 1.0中可以缺失host字段。

======

空行

在请求头部的后面是一个空行,它只包含一个回车符和一个换行符,不包含其它任何内容,这个空行用于标记请求头部已结束,下一行的内容不再是请求头;它是必须存在的,即便使用GET这样不包含报文主体的请求方法时也要有这个空行。

报文主体

请求报文中的报文主体就是要提交给服务器的数据,比如当我们使用POST方法提交表单时,表单中的内容就包含在请求报文的报文主体中。在某些情况下请求报文中是没有报文主体的,比如使用GET方法,此时若要向服务器传递参数,那么参数就只能包含在URL的查询字符串中。

报文主体中的数据格式由Content-Type请求头指定。

Content-Type中常见的媒体格式类型

以text开头的媒体格式类型:
text/html: HTML格式。
text/plain:纯文本格式。
text/xml:  XML格式。
以image开头的媒体格式类型:
image/gif:gif图片格式。
image/jpeg:jpg图片格式。
image/png:png图片格式。
以application开头的媒体格式类型:
application/xhtml+xml:XHTML格式。
application/xml: XML数据格式。
application/atom+xml:Atom XML聚合格式 。
application/json: JSON数据格式。
application/pdf:pdf格式 。
application/msword: Word文档格式。
application/octet-stream: 二进制流数据(如常见的文件下载)。
application/x-www-form-urlencoded: <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。
还有一种常见的媒体格式是用于上传文件时用的
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。

响应报文  

响应报文由4个部分组成,分别是:状态行、响应头部、空行和报文主体;状态行、响应头部和空行是必需的而报文主体是可选的。

响应报文格式如下:   


状态行 

状态行包含3个部分:HTTP协议版本、状态码和状态码描述(状态短语);它们之间用空格隔开,状态行的最后是一个回车符和换行符。

HTTP协议版本 

说明该响应报文属于哪一版的http协议,比如HTTP/1.1或HTTP/1.0。

转态码描述(转态短语)

状态码是服务器返回的表示响应状态的代码,状态短语是对该响应状态的一个简单描述。

状态码详情可看:http://www.leixing.xyz/article/detail/HavBr2mg    

常见状态码对应的状态短语说明:

200 OK: 表示客户端请求成功
400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate报文头一起使用
404 Not Found:请求的资源不存在,例如输入了错误的url
500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常

响应头部 

响应头部和请求头部类似,都是用于传递一些附加的信息;每个响应头都是一个键值对,键和值之间用英文冒号隔开。每个响应头的后面都是一个回车符和一个换行符,多个响应头,每个响应头单独形成一行。
某些头部字段既可以用于请求报文又可以用于响应报文,而有些则只能用于请求报文或者只能用于响应报文。

响应报文中常见的响应头部: 

来自:https://www.cnblogs.com/yanggb/p/11684494.html 

Response Headers的候选属性

候选属性说明示例
Accept-Ranges表明服务器是否支持指定范围请求及哪种类型的分段请求Accept-Ranges: bytes
Age从原始服务器到代理缓存形成的估算时间(以秒计,非负)Age: 12
Allow对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEAD
Cache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-cache
Content-Encodingweb服务器支持的返回内容压缩编码类型Content-Encoding: gzip
Content-Language响应体的语言Content-Language: en,zh
Content-Length响应体的长度Content-Length: 348
Content-Location请求资源可替代的备用的另一地址Content-Location: /index.htm
Content-MD5返回资源的MD5校验值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range在整个返回体中本部分的字节位置Content-Range: bytes 21010-47021/47022
Content-Type返回内容的MIME类型Content-Type: text/html; charset=utf-8
Date原始服务器消息发出的时间Date: Tue, 15 Nov 2018 08:22:22 GMT
ETag请求变量的实体标签的当前值ETag: "737060cd8c284d8af7ad3082f209582d"
Expires响应过期的日期和时间Expires: Thu, 01 Dec 2018 16:00:00 GMT
Last-Modified请求资源的最后修改时间Last-Modified: Tue, 15 Nov 2018 12:25:26 GMT
Location用来重定向接收方到非请求URL的位置来完成请求或标识新的资源Location: http://www.yanggb.com/yanggb2.html
Pragma包括实现特定的指令,它可应用到响应链上的任何接收方Pragma: no-cache
Proxy-Authenticate它指出认证方案和可应用到代理的该URL上的参数Proxy-Authenticate: Basic
refresh应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
Refresh: 5; url=
http://www.yanggb.com/yanggb9.html
Retry-After如果实体暂时不可取,通知客户端在指定时间之后再次尝试Retry-After: 120
Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie设置Http CookieSet-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer指出头域在分块传输编码的尾部存在Trailer: Max-Forwards
Transfer-Encoding文件传输编码Transfer-Encoding:chunked
Vary告诉下游代理是使用缓存响应还是从原始服务器请求Vary: *
Via告知代理客户端响应是通过哪里发送的Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning警告实体可能存在的问题Warning: 199 Miscellaneous warning
WWW-Authenticate表明客户端请求实体应该使用的授权方案WWW-Authenticate: Basic

======

空行

在请求头部的后面是一个空行,它只包含一个回车符和一个换行符,不包含其它任何内容,这个空行用于标记请求头部已结束,下一行的内容不再是请求头;它是必须存在的,即便使用GET这样不包含报文主体的请求方法时也要有这个空行。

报文主体

响应报文中的报文主体就是服务器返回给客户端的数据,它的类型由响应头"Content-Type"说明。在某些响应报文中是没有报文主体(即响应数据)的,比如状态码为304(Not Modified)的响应报文或者某些请求错误时的响应报文。

HTTP持续与非持续连接

HTTP1.0定义了非持续连接,每次请求/响应都要建立TCP连接。而HTTP1.1默认的连接是持续连接,服务器在发送响应以后会保持连接状态,等待更多的请求。

HTTP代理服务器

代理服务器是一台保存最近请求的响应的拷贝的计算机。在代理服务器存在的情况下,当HTTP客户端访问网页时,HTTP客户端会向代理发出请求,代理检查高速缓存,如果缓存中不存在响应报文,代理会向相应的服务器发送请求,这样降低了原服务器的负载,减少了通信量并降低了延迟。但是,使用代理服务器,客户端必须配置为访问代理服务器而不是目标服务器。  

 统一资源定位符URL

URL是对可以从Internet上得到的资源的位置和访问方法的一种简洁表示,也是指明Internet上任何种类信息的标准。它定义四种要素:方法、主机、端口和路径(方法://主机:端口/路径)。
方法:用来读取文档的协议。
主机:存放信息的计算机。万维网页面通常存储在以“www”为起始别名的计算机中。
端口:服务器应用程序的端口号。
路径:信息所存放的路径名。 

万维网工作过程 


HTTP请求交互

应用层HTTP协议在网络传输层调用TCP进行的服务,先建立TCP连接(三次握手),然后HTTP请求、HTTP响应,最后断开TCP连接(四次挥手)。


细化





webService接口和HTTP(httpClient)接口区别1、HTTPService基于http协议,而WebService基于soap协议;2、HTTPService效率较高,WebService能处理较
没有更多推荐了 [去首页]
image
文章
357
原创
284
转载
73
翻译
0
访问量
199063
喜欢
47
粉丝
6
码龄
5年
资源
0

文章目录

加载中...
0
0