HTTP协议入门——1.1版本

基本概述

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

长连接和短连接的区别

解释1

所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,   
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接

解释2

长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。   
而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。

解释3

长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。   
通信方式   
各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。   
现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。

解释4

短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。   
长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。

参考文章:http://blog.csdn.net/shine0181/article/details/7799754

HTTP请求部分

基本结构

GET /q547550831?viewmode=contents HTTP/1.1 [请求行]

Host: blog.csdn.net [消息头] 消息名:内容

Connection: keep-alive

Cache-Control: max-age=0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

Referer: http://blog.csdn.net/q547550831?viewmode=contents

Accept-Encoding: gzip, deflate, sdch

Accept-Language: zh-CN,zh;q=0.8

PS:这是我博客主页的请求头,但是这并不代表每个网页的请求头都是这一样的。

请求方式

请求方式有:

POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT,CONNECT等

参考文档:http://tools.jb51.net/table/http_request_method

常用的有:POST和GET

请求消息头

Host: blog.csdn.net [主机名]

Connection: keep-alive [连接状态:保持连接]

Cache-Control: max-age=0 [指定请求和响应遵循的缓存机制:查看是否有修改并选择更新否]

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 [可接受的格式]

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 [浏览器内核]

Referer: http://blog.csdn.net/q547550831?viewmode=contents [从哪个网页跳转到这个网页来的,可以用来防盗链]

Accept-Encoding: gzip, deflate, sdch [可接收的压缩格式]

Accept-Language: zh-CN,zh;q=0.8 [浏览器支持的语言]

PS:请求是指浏览器发出向服务器发出,所以这些信息都是浏览器的信息。请求头远远不止这几种,可以参考该文档:http://tools.jb51.net/table/http_header

案例:防止盗链

package com.pc;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Servlet6 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();out.println("<a href='http://127.0.0.1:8080/servlet1/Servlet5'>连接到Servlet5</a>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}
package com.pc;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Servlet5 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();// 通过request对象来获取http请求信息// 取出HostString host = request.getHeader("Host");out.println("host=" + host);// 限制用户// 获取用户浏览器的Referer// referer可以防止盗链,通过判断链接来至哪里String referer = request.getHeader("Referer");if(referer == null || !referer.startsWith("http://127.0.0.1:8080/servlet1")){out.println("非法盗链");} else {out.println("referer=" + referer);}out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 一般开发人员习惯把doGet()和doPost()合二为一this.doGet(request, response);}public void init() throws ServletException {// Put your code here}}

PS:该案例中只能允许http://127.0.0.1:8080/servlet1开头的网址进行访问Servlet5

HTTP响应部分

基本结构

HTTP/1.1 200 OK [状态行]

Server: openresty [消息名] 消息名:内容

Date: Fri, 01 Jan 2016 08:11:04 GMT

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

Connection: keep-alive

Vary: Accept-Encoding

Cache-Control: private

Set-Cookie: uuid=5cad65d6-7a99-4b15-a6e6-5c50e584ca77; expires=Sat, 02-Jan-2016 08:13:49 GMT; path=/

Set-Cookie: ViewMode=contents; path=/

Content-Encoding: gzip

--------------这是一个空行

消息体

响应状态码

响应状态码分别为1,2,3,4,5开头的三位数字

1**

信息,服务器收到请求,需要请求者继续执行操作

2**

成功,操作被成功接收并处理

3**

重定向,需要进一步的操作以完成请求

4**

客户端错误,请求包含语法错误或无法完成请求

5**

服务器错误,服务器在处理请求的过程中发生了错误

PS:常见的有200(成功),303(重定向),400(Not Found),500(服务器内部错误)

可以参考该文档:http://tools.jb51.net/table/http_status_code

响应消息头

Server: openresty [服务器名称]

Date: Fri, 01 Jan 2016 08:11:04 GMT [原始服务器消息发出的时间]

Content-Type: text/html; charset=utf-8 [返回内容的MIME类型]

Transfer-Encoding: chunked [文件传输编码]

Connection: keep-alive [连接状态:保持连接]

Vary: Accept-Encoding [告诉下游代理是使用缓存响应还是从原始服务器请求]

Cache-Control: private [告诉所有的缓存机制是否可以缓存及哪种类型]

Set-Cookie: uuid=********; expires=Sat, 02-Jan-2016 08:13:49 GMT; path=/ [设置Http Cookie]

Set-Cookie: ViewMode=contents; path=/ [设置Http Cookie]

Content-Encoding: gzip [web服务器支持的返回内容压缩编码类型]

PS:可以参考该文档http://tools.jb51.net/table/http_header

缓存机制

浏览器默认情况下,会缓存所访问的页面,这样会出现一个问题:如果用户习惯把光标停留在地址栏,然后回车来取页面,就会默认调用cache中取数据。

案例1、有些网站要求及时性很高,因此要求不缓存页面。

//指定该页面不缓存 Ie

response.setDateHeader("Expires", -1);【针对IE浏览器设置不缓存】

//为了保证兼容性.

response.setHeader("Cache-Control", "no-cache");【针对火狐浏览器等】

response.setHeader("Pragma", "no-cache");【其他浏览器】

案例2、有些网站要求网页缓存一定时间,比如缓存一个小时

response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000); //后面一个参数表示设置的缓存保持时间,-1表示永远不缓存

Content-Type消息头

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

PS:其作用就是告诉浏览器,该服务器返回的网页中消息体是什么格式的,该以什么编码格式来读取这个网页。

因为该类型很多,故给出参考文档,以备后用:http://tools.jb51.net/table/http_content_type

案例1:定时刷新Refresh的使用

response.setHeader("Refresh", "5;url=/servletPro/Servlet2"); // 5秒后刷新并跳转到url后的链接。通过这个可以实现页面定时刷新。

案例2:文件下载

package com.pc;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Servlet7 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");// 演示下载文件response.setHeader("Content-Disposition", "attachment; filename=EVO_120G.jpg");// 打开文件// 1.获取到要下载文件的全路径String path = this.getServletContext().getRealPath("/EVO_120G.jpg");// 测试System.out.println("path=" + path);// 2.创建文件输入流FileInputStream fis = new FileInputStream(new File(path));// 做一个缓冲字符数组byte buff[] = new byte[1024];int length = 0;// 3.指向response的输出流OutputStream os = response.getOutputStream();// 4.循环读出// length表示每次实际读入的字节数while((length = fis.read(buff)) != -1){os.write(buff, 0, length);}// 关闭os.close();fis.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

----------参考《韩顺平.细说Servlet》

HTTP协议入门——1.1版本相关推荐

  1. internet 协议入门

    前言 劳于读书,逸于作文. 原文地址:internet协议入门 博主博客地址:Damonare的个人博客 博主之前写过一篇博客:网络协议分析,在这篇博客里通过抓包,具体的分析了不同网络协议的传送的数据 ...

  2. 互联网协议入门(一)

    我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很 ...

  3. 【Linux网络编程】网络协议入门

    00. 目录 文章目录 00. 目录 01. 前言 02. 概述 03. 物理层 04. 数据链路层 05. 网络层 06. 传输层 07. 应用层 08. 附录 01. 前言 我们每天使用互联网,你 ...

  4. 【网络协议】互联网协议入门(一)

    我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很 ...

  5. HTTP协议入门详解

    [1]HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议.HTTP是 hypertext transfer protocol(超文本传输协议) ...

  6. 互联网协议入门及DNS原理入门

    互联网协议入门及DNS原理入门 互联网协议入门 作者: 阮一峰 日期: 2012年5月31日 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.上海的某一块网 ...

  7. 互联网协议入门(二)【转】

    原文地址:点击前往 上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想. 这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的. ======== ...

  8. 互联网协议入门(二)

    上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想. 这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的. ================== ...

  9. http 阮一峰_互联网协议入门(二)

    上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想. 这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的. ================== ...

最新文章

  1. linux进程和程序的却别,操作系统:进程的概念和与程序的区别
  2. 滚动到底部或顶部响应的ScrollView使用
  3. 怎么用odbc连接mysql数据库连接_PowerDesigner通过ODBC来实现Mysql数据库的连接操作...
  4. 《划时代-51单片机C语言全新教程》-第四章 工程创建与深入 概览
  5. mysql bc_正则表达式——MySQL搜索过滤
  6. HTML 学习笔记 day one
  7. go 字符串替换_Go语言爱好者周刊:第 64 期 — goup 这个工具了解下
  8. 全源最短路径之弗洛伊德算法(C语言)
  9. 一文讲述数仓组件SysCache
  10. java实现文件压缩与解压
  11. 2021大二实训part02
  12. 折腾凤凰系统 (by quqi99)
  13. C语言把字符串转变为数字
  14. 圆通快递单号yt开头_圆通快递单号yt开头怎么查不到 点查询即可如果是圆通快递可以...
  15. Windows下Perl环境安装和使用
  16. C#开源组件之Word文件的操作:一
  17. linux at91看门狗驱动设置
  18. MAS移动行业应用解决方案
  19. TikZ宏包子库汇总和简介
  20. 2022焊工(初级)试题及在线模拟考试

热门文章

  1. 02326 操作系统 简答题 超简短归纳
  2. C#LeetCode刷题之#590-N叉树的后序遍历(N-ary Tree Postorder Traversal)
  3. C#LeetCode刷题之#136-只出现一次的数字(Single Number)
  4. C#LeetCode刷题之#747-至少是其他数字两倍的最大数( Largest Number At Least Twice of Others)
  5. vue基础入门-应用 组件实例
  6. ffmpeg转换格式
  7. js向页面中动态添加脚本
  8. java打jar包的方式,jar命令,maven
  9. 命令行部署程序保存pid到文件
  10. diy 多路监控_如何通过此DIY设置监控空气质量