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:valuehtml

Optional request bodyweb

(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。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。tcp

好了,以上基本是看资料学习的总结。若是有什么不对的地方,欢迎指正。

本文系博主原创,转载请标明出处。

相关文章
相关标签/搜索