本文转自《HTTP协议通信原理》

了解HTTP

HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。

HTTP 是一个网络协议,是专门用来帮你传输 Web 内容

HTTPS   HTTP 协议”和“SSL/TLS 协议”的组合。

HTTP使用内容类型,是指Web服务器向Web浏览器返回的文件都有与之相关的类型。所有这些类型都被模型化,即Web服务器告诉Web浏览器该文件所具有的种类,是文档、GIF格式图像、声音文件还是应用程序。它们告诉浏览器应该如何处理Web服务器发送过来的各种内容类型。

HTTP 和 TCP 之间的关系

TCP 协议是 HTTP 协议的基石——HTTP 协议需要依靠 TCP 协议来传输数据。

在网络分层模型中,TCP 被称为“传输层协议”,而 HTTP 被称为“应用层协议”。

TCP 被称为“面向连接”的传输层协议。传输层主要有两个协议,分别是 TCP 和 UDP。TCP 比 UDP 更可靠。

有很多常见的应用层协议是以 TCP 为基础的,比如“FTP、SMTP、POP、IMAP”等。

HTTP 协议如何使用 TCP 连接:HTTP 对 TCP 连接的使用,分为两种方式:俗称“短连接”和“长连接”(“长连接”又称“持久连接”,洋文叫做“Keep-Alive”或“Persistent Connection”)

HTTP请求信息和响应信息的格式

请求:

(1)请求行

(2)请求头信息

(3)请求主题信息(可以没有)

(4)头信息结束后和主题信息之间要空一行

请求行又分3部分

请求方法   、请求路径、所用的协议

请求 方法:GET、POST、PUT、DELETE、TRACE、OPTIONS

状态码,状态文字

状态码是用来反服务器响应情况

最常见的如200 OK,404 NOT FOUND

状态文字是用来描述状态码的,便于人观察。

HTTP响应中的状态吗

状态码                           定义                           说明

1xx                                信息                           接收到请求,继续处理

2xx                                成功                           操作成功的收到,理解和接收

3xx                                重定向                         为了完成请求,必须采取进一部措施

4xx                            客户端错误                      请求的语法有错误或不能完全被满足

5xx                             服务端错误                      服务器无法完成明显有效的请求

常见返回值

200       ---服务器成功返回网页

301/2 ---   永久/临时重定向

304 Not  ----  未修改                  --取缓存

失败的状态码

404   ---请求的网页不存在

503   -- 服务器暂时不可用

500 ---服务器内部错误

对称加密和非对称加密

“对称加密技术”,意思就是说:“加密”和“解密”使用【相同的】密钥。

“非对称加密技术”,意思就是说:“加密”和“解密”使用【不同的】密钥。

)“非对称加密”能干的事情比“对称加密”要多。

HTTP通信过程

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

1、建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更深层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

2、Web浏览器向Web服务器发送请求命令

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令

例如:GET/sample/hello.jsp HTTP/1.1。

3、 Web浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

4、Web服务器应答

客户机向服务器发出请求后,服务器会客户机回送应答,

HTTP/1.1 200 OK

应答的第一部分是协议的版本号和应答状态码。

5、Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

6、Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

7、Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

Connection:keep-alive

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP请求格式

当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:

  • 请求方法URI协议/版本

  • 请求头(Request Header)

  • 空行

  • 请求正文

下面是一个HTTP请求的例子:

1GET/sample.jspHTTP/1.1
2Accept:image/gif.image/jpeg,*/*
3Accept-Language:zh-cn
4Connection:Keep-Alive
5Host:localhost
6User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
7Accept-Encoding:gzip,deflate
8username=jinqiao&password=1234

请求方法URI协议/版本

请求的第一行是“方法URL议/版本”:GET/sample.jsp HTTP/1.1

以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。

URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。

请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

1Accept:image/gif.image/jpeg.*/*
2Accept-Language:zh-cn
3Connection:Keep-Alive
4Host:localhost
5User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
6Accept-Encoding:gzip,deflate.

请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:

username=jinqiao&password=1234

在以上的例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。

HTTP请求方法

方法

描述

GET

客户端请求指定资源信息,服务器返回指定资源

HEAO

只请求响应报文中的HTTP首部

POST

将客户端的数据提交到服务器

PUT

用从客户端向服务器传送的数据取代指定文档内容

DELETE

请求服务器删除Request-URI所表示的资源

MOVE

请求服务器将指定的页面移至另一个网络地址

这里只讨论GET方法与POST方法。

GET方法

GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。

例如:Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。

POST方法

POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。

[转]HTTP协议通信原理的更多相关文章

  1. HTTP协议通信原理 与常见报错信息

    HTTP协议通信原理 请求报文 请求行 GET index.html HTTP 1.1 请求方法:get  读取服务器数据内容    post   提交存储服务端数据(用户注册) 协议版本:   ht ...

  2. http协议通信原理的问答

    1.dns怎么解析?答:假设一个网站www.tianyik.com的ip是192.168.31.36    浏览器(URL:www.tianyik.com)-->    客户机        h ...

  3. TCP网络协议通信原理(客户端和服务器端)

    下面直接用代码来说明TCP协议的基础知识: 服务器端代码块: from socket import * from time import ctime ''' 指定主机地址.工作端口号.接收缓存的长度 ...

  4. 基于web的IM软件通信原理分析

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  5. udp-->socket通信原理

    UDP数据通讯原理     UDP数据通讯分服务端(软件)和客户端端:     服务端(软件)(服务器)先运行,服务端,不需要事先知道客户端IP和port     客户端(软件)(客户端机器)后运行, ...

  6. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  7. SSL 通信原理及Tomcat SSL 配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

  8. Java 下 SSL 通信原理及实例

    有关SSL的原理和介绍在网上已经有不少,对于Java下使用keytool生成证书,配置SSL通信的教程也非常多.但如果我们不能够亲自动手做一个SSL Sever和SSL Client,可能就永远也不能 ...

  9. AIDL通信原理

    AIDL (Android Interface Definition Language),通过定义通信接口来实现进程间通信.这是Google提供的一种在安卓应用进程间通信的工具.所以要了解AIDL的通 ...

随机推荐

  1. sql 锁类型与锁机制

    SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁.   2. NOLOCK:不添加共享锁和排它锁,当这个选项 ...

  2. [译]理解Windows消息循环

    出处:http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html 理解消息循环和整个消息传送机制对Windows编程来说非常重要.如果对消 ...

  3. CNI IPAM插件分析 --- 以hostlocal为示例

    skel.CmdArgs数据结构如下所示: type CmdArgs struct { ContainerID string Netns string IfName string Args strin ...

  4. Cpython-并发编程

    阅读目录 一 背景知识 二 python并发编程之多进程 三 python并发编程之多线程 四 python并发编程之协程 五 python并发编程之IO模型 六 补充:paramiko模块 七 作业 ...

  5. Linux信号signal处理机制

    信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分.         一.信号的基本概念 ...

  6. gc摘要

    1. Sun JDK 1.6 GC(Garbage Collector) http://bluedavy.com2010-05-13 V0.2 2010-05-19 V0.52010-06-01 V0 ...

  7. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

  8. NIO复习03

    SocketChannel: 1. Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChan ...

  9. Python3:input()输入函数的用法

    Python3:input()输入函数的用法 一.简介 input这个函数,第一个参数是提示语,它默认是空的.在我们使用input的时候,会从标准输入中读取一个string,即字符串(请注意,这里很重 ...

  10. ASP.NET MVC CheckBoxFor的int to bool

    当我们使用CheckBoxFor类型需要使用bool ,可以将 int转换成bool <div class="form-group"> <label class= ...