Http协议详解
Posted hiyanxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http协议详解相关的知识,希望对你有一定的参考价值。
Http协议是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器端模型,是一个无状态的协议。
http协议通常承载于tcp协议之上,有时也承载于tls或ssl协议层之上,这就形成了https。http协议端口是80,https协议端口443.
Web服务器、浏览器、代理服务器:
当我们输入url后,浏览器就会给web服务器发送一个Request,web服务器接收到Request后进行处理,生成相应的Response然后发送给浏览器,浏览器解析Response中的html,这样我们就看到了网页。
我们的Request也有可能经过了代理服务器,最后才到达web服务器。其主要功能如下:
(1)提高访问速度,大多的代理服务器都有缓存功能。
(2)突破限制,也就是FQ了。
(3)隐藏身份。
URL详解:
URL地址用于描述一个网络上的资源,其格式如下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
schema:指定低层使用的协议(例如http,https,ftp)
host:http服务器的ip地址或域名
port#:http服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口则必须指明。
path:访问资源的路径。
url-params:
query-string:发送给服务器的数据。
http协议是无状态的,同一客户端的这次请求和上次请求是没有对应关系的,对http服务器来说,它并不知道两个请求来自
同一个客户端。为了解决这个问题,web应用程序引入了cookie机制来维护状态。
消息结构:
Request:分为3部分。第一部分叫做请求行,第二部分叫做http header,第三部分是body,header和body之间有个空行。
METHOD/path-to-resource HTTP/Version-number
Header-Name-1:value
Header-Name-2:value
Optional request body
(1)METHOD表示请求方法,如“post”,“get”。
(2)path-to-resource表示请求的资源。
(3)HTTP/Version-number表示http协议的版本号。
Response:分为3部分,第一部分叫做request line,第二部分叫做request header,第三部分是body,header和body之间空行
HTTP/Version-number status code message
Header-Name-1:value
Header-Name-2:value
Optional request body
(1)http/version-number表示http协议的版本号
(2)status code状态码
(3)message状态信息
get和post的区别:
1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中(所以get方式下body为空).
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
状态码:
http1.1定义了5中状态码:
1xx:提示信息,表示请求已被成功接收,继续处理。
2xx:成功,表示请求已被成功接收,理解,接收。
3xx:重定向,要完成请求必须更进一步的处理。重定向状态码用来告诉 浏览器客户端,他们访问的资源已被移动,web服务器会发送一个重定向状态码和一个可选的Location Header,告诉客户端新的资源地址在哪。浏览器客户端会自动用Location中提供的地址,重新发送新的Request。
4xx:客户端错误,请求有语法错误或请求无法完成。
5xx:服务器端错误,服务器未能实现合法的请求。
常见状态码:
200 ok:表示该请求被成功的接受并完成,所请求的资源发回到客户端。
302 Found:这里的移除是临时的,客户端会使用Location中给出的URL,重新发送新的http Request。
304 Not Modified:表示上次请求的文档缓存是最新的,即请求的文档没有发生变化,直接使用客户端缓存。
如果不想使用本地缓存,可使用Ctrl+F5强制刷新页面。
400 Bad Request:发送的Request中的数据有错误(表单有错误,cookie错误)。客户端请求有语法错误,不能被服务器端所理解。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求的资源不存在。
500 Internal Server Error:服务器发生了不可预期的错误,无法为请求提供服务。
503 Service Unavailable:服务器目前无法为请求提供服务,但多一段时间就可以恢复。
http Request Header:
Cache头域:
(1)If-Modified-Since:将浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间和服务器上实际文件的最后修改时间作比较,如果时间一致,那么返回304(Not Modified),客户端直接使用本地缓存文件。如果不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT 该时间回和Response Header中Entity中的Last-Modified: Web,Thu, 09 Feb 2012 09:07:57 GMT 作比较,相同时返回304,直接使用客户端缓存。
(2)if-None-Match:if-None-Match和ETag一起工作,工作原理是在Http Response中添加ETag信息。当用户再次请求该资源时,将在Http Request中加入if-None-Match信息,服务器将会验证if-None-Match的值和ETag的值,并作比较,如果值一样,表示资源没有更新,则返回304,直接使用本地缓存资源。否则返回200和新的内容,并重新进行缓存。
(3)Pragma:防止页面被缓存。
(4)Cache-Control:用来指定请求和响应所遵循的缓存机制。Cache-Control:no-cache表示所有内容都不会被缓存。
Client头域:
(1)Accept:浏览器可以接受的媒体类型。例如:Accept:text/html表示浏览器接收服务器发回的类型为text/html也就是我们常说的html文档。Accept:*/*表示浏览器可以处理所有类型(最常用)。
(2)Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩。例如:Accept-Encoding:gzip,deflate。
(3)Accept-Language:浏览器申明自己接收的语言。例如:Accept-Language:en-us。
(4)User-Agent:告诉http服务器,客户端使用的操作系统和浏览器的名称及版本号。
(5)Accept-Charset:浏览器 申明自己接收的字符集,如gb2312,urf-8.
Cookie/Login头域:最重要的Header,将cookie的值发送给HTTP服务器。
Entity头域:
(1)Content-length:发送给http服务器的数据长度。例如:Content-Length:38.
(2)Content-type:
Transport头域:
(1)Connection:Keep-Alive表示当一个网页打开完成后,客户端和服务器端的tcp连接不会关闭。当再次请求时就使用这个已建立的连接。
(2)Host:请求报头域主要用于指定被请求资源的Internet主机和端口号。
http Response Header:
Cache头域:
(1)Data:生成消息的具体日期和时间。
(2)Expires:浏览器会在指定过期时间内使用本地缓存。
Cookie/Login头域:
(1)P3P:用于跨域设置cookie,这样可以解决iframe跨域访问cookie的问题。
(2)Set-Cookie:用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个set-cookie。
其它基本都和请求头没有区别。
HTTP Keep-Alive作用:
Keep-Alive使得客户端到服务器端的连接持续有效,当出现对服务器端的后续请求时,Keep-Alive避免了重新建立连接,而直接使用已建立的连接。
缺点:在处理暂停期间本来可以释放的资源仍然被占用。
几个参数:Keep-Alive timeout=5,max=100
timeout:过期时间为5秒。max:最多请求一百次后强制断开连接。
http1.0:在http1.0中默认关闭Keep-Alive。如果客户端浏览器支持Keep-Alive,则在http请求头中加一个Conntion:Keep-Alive,当
服务器收到带有Conntion:Keep-Alive的请求时,它会在响应头中加上Conntion:Keep-Alive,以使得客户端和服务器端的连接
被保持。当客户端发送另外一个请求时,就是用已有的连接。
http1.1:在http1.1中默认开启Keep-Alive,则所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection:close。
好了,以上基本是看资料学习的总结。如果有什么不对的地方,欢迎指正。
本文系博主原创,转载请标明出处。
以上是关于Http协议详解的主要内容,如果未能解决你的问题,请参考以下文章