`
yyyyy5101
  • 浏览: 151560 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多
一、TCP/IP 协议介绍

  在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容。TCP/IP协议是分层的,从底层至应用层分别为:物理层、链路层、网络层、传输层和应用层,如下图所示:





TCP/IP基础--层次图



  从应用层至物理层,数据是一层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头,数据封装格式如下:



TCP/IP基础--数据封装



  其中,对于TCP传输协议,客户端在于服务器建立连接前需要经过TCP三层握手,过程如下:



TCP/IP基础--TCP三次握手



二、HTTP协议

2.1 简介

  超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,自 1990 年起,HTTP 就已经被应用于 WWW 全球信息服务系统。
  HTTP 是一种请求/响应式的协议。一个客户机与服务器建立连接后,发送一个请求给服务器;服务器接到请求后,给予相应的响应信息。
  HTTP 的第一版本 HTTP/0.9是一种简单的用于网络间原始数据传输的协议;
  HTTP/1.0由 RFC 1945 定义 ,在原 HTTP/0.9 的基础上,有了进一步的改进,允许消息以类 MIME 信息格式存 在,包括请求/响应范式中的已传输数据和修饰符等方面的信息;
  HTTP/1.1(RFC2616) 的要求更加严格以确保服务的可靠性,增强了在HTTP/1.0 没有充分考虑到分层代理服务器、高速缓冲存储器、持久连接需求或虚拟主机等方面的效能;
  安全增强版的 HTTP (即S-HTTP或HTTPS),则是HTTP协议与安全套接口层(SSL)的结合,使HTTP的协议数据在传输过程中更加安全。



2.2 协议结构

  HTTP协议格式也比较简单,格式如下:





HTTP协议--协议结构



2.3 HTTP 协议举例

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



2.4 请求头格式

a) 通用头(general-header):
Cache-Control:客户端希望服务端如何缓存自己的请求数据,如"Cache-Control: no-cache","Cache-Control: max-age=0";
Connection:客户端是否希望与服务端之间保持长连接,如"Connection: close", "Connection: keep-alive";
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了客户端一些特殊请求信息,如 "Pragma: no-cache" 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据;
Via:一般用在代理网关向应用服务器发送的请求头中,表明该来自客户端的请求经过了网关代理,
     格式为:"Via: 请求协议版本  网关标识   [其它信息] ",
     如 :" Via: 1.1  webcache_250_199.hexun.com:80 (squid)"



b) 请求头(request-header):
Accept:表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受 type类型的所有子类型,如“ Accept: image/gif, image/jpeg, */*”;
Accept-Charset:客户端所能识别的字符集编码格式,格式:“Accept-Charset: 字符集1[:权重],字符集2[:权重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;
Accept-Language:客户端所能识别的语言,格式:“Accept-Language: 语言1[:权重],语言2[:权重]”,如:” Accept-Language: zh, en;q=0.7”;
Host:客户请求的主机域名或主机IP,格式:“Host: 域名或IP[:端口号]”,如:“Host: www.hexun.com:80“,请求行中若有HTTP/1.1则必须有该请求头;
User-Agent:表明用户所使用的浏览器标识,主要用于统计的目的;
Referer:指明该请求是从哪个关联连接而来;

Accept-Encoding:客户端所能识别的编码压缩格式,如:“Accept-Encoding: gzip, deflate”;
If- Modified-Since:该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;
If-None-Match:该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;
Cookie:为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie: MailUserName=whouse”;



c) 实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding:客户端所能识别的编码压缩格式,如:“Content-Encoding: gzip, deflate”;
Content-Length:客户端以POST方法上传数据时数据体部分的内容长度,如:“ Content-Length: 24”;
Content- Type:客户端发送的数据体的内容类型,如:“Content-Type: application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“Content-Type: multipart/form-data; boundary=---------------------------5169208281820”,则表明数据体由多部分组成,分隔符为 “-----------------------------5169208281820”;



2.5)响应格式

a) 通用头(general-header):
Cache- Control:服务端要求中间代理及客户端如何缓存自己响应的数据,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被缓存,“Cache-Control: public” 可以被缓存;
Connection:服务端是否希望与客户端之间保持长连接,如“Connection: close”, “Connection: keep-alive”;
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了服务端一些特殊响应信息,如 “Pragma: no-cache” 服务端希望代理或客户端不应缓存结果数据;
Transfer-Encoding:服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现),如:“Transfer-Encoding: chunked”,注:该字段的优先级要高于“Content-Length” 字段的优先级;



b)响应头(response-header):
Accept-Ranges:表明服务端接收的数据单位,如:“Accept-Ranges: bytes”, ;
Location:服务端向客户端返回此信息以使客户端进行重定向,如:“Location: http://www.hexun.com”;
Server:服务端返回的用于标识自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;
ETag:服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息;



c)实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding:服务端所响应数据的编码格式,如:“Content-Encoding: gzip”;
Content-Length:服务端所返回数据的数据体部分的内容长度,如:“ Content-Length: 24”;
Content-Type:服务端所返回的数据体的内容类型,如:“Content-Type: text/html; charset=gb2312” ;
Set-Cookie:服务端返回给客户端的cookie数据,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”



2.6)服务器返回状态码

1xx:表明服务端接收了客户端请求,客户端继续发送请求;
2xx:客户端发送的请求被服务端成功接收并成功进行了处理;
3xx:服务端给客户端返回用于重定向的信息;
4xx:客户端的请求有非法内容;
5xx:服务端未能正常处理客户端的请求而出现意外错误。



举例:

“100”  ; 服务端希望客户端继续;
“200”  ; 服务端成功接收并处理了客户端的请求;
“301”  ; 客户端所请求的URL已经移走,需要客户端重定向到其它的URL;
“304”  ; 客户端所请求的URL未发生变化;
“400”  ; 客户端请求错误;
“403”  ; 客户端请求被服务端所禁止;
“404”  ; 客户端所请求的URL在服务端不存在;
“500”  ; 服务端在处理客户端请求时出现异常;
“501”  ; 服务端未实现客户端请求的方法或内容;
“502”  ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;
“503”  ; 服务端由于负载过高或其它错误而无法正常响应客户端请求;
“504”  ; 此为中间代理返回给客户端的出错信息,表明代理连接服务端出现超时。



2.7)chunked 传输

  编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度(以十六进制表示)和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。另外,在HTTP头里必须含有:” Transfer-Encoding: chunked” 通用头字段。格式如下:

chunked 传输



2.8)HTTP 请求方法

GET、POST、HEAD、CONNECT、PUT、DELETE、TRACE



2.9)举例

a)GET请求
Html代码

   1. GET http://photo.test.com/inc/global.js HTTP/1.1 
   2. Host: photo.test.com 
   3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 
   4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
   5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3 
   6. Accept-Encoding: gzip,deflate 
   7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 
   8. Keep-Alive: 300 
   9. Proxy-Connection: keep-alive 
  10. Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45 
  11. Cache-Control: max-age=0 

GET http://photo.test.com/inc/global.js HTTP/1.1
Host: photo.test.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45
Cache-Control: max-age=0



b)POST请求
Html代码

   1. POST / HTTP/1.1 
   2. Accept: image/gif, image/x-xbitmap, image/jpeg, application/vnd.ms-powerpoint, application/msword, */* 
   3. Accept-Language: zh-cn 
   4. Content-Type: application/x-www-form-urlencoded 
   5. Accept-Encoding: gzip, deflate 
   6. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) 
   7. Host: www.test.com 
   8. Content-Length: 24 
   9. Connection: Keep-Alive 
  10. Cache-Control: no-cache 
  11.  
  12. name=value&submitsubmit=submit 

POST / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.test.com
Content-Length: 24
Connection: Keep-Alive
Cache-Control: no-cache

name=value&submit=submit



c)通过HTTP代理发送GET请求
Html代码

   1. GET http://mail.test.com/ HTTP/1.1 
   2. Host: mail.test.com 
   3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 
   4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
   5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3 
   6. Accept-Encoding: gzip,deflate 
   7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 
   8. Keep-Alive: 300 
   9. Proxy-Connection: keep-alive 

GET http://mail.test.com/ HTTP/1.1
Host: mail.test.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive



d)POST方式上传文件
Html代码

   1. POST http://www.test.comt/upload_attach?uidl=%3C HTTP/1.1 
   2. Host: www.test.com 
   3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 
   4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
   5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3 
   6. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 
   7. Content-Type: multipart/form-data; boundary=---------------------------5169208281820 
   8. Content-Length: 449 
   9.  
  10. -----------------------------5169208281820 
  11. Content-Disposition: form-data; name="file_1"; filename="" 
  12. Content-Type: application/octet-stream 
  13.  
  14.  
  15. -----------------------------5169208281820 
  16. Content-Disposition: form-data; name="file_0"; filename="test.txt" 
  17. Content-Type: text/plain 
  18.  
  19. hello world! 
  20.  
  21. -----------------------------5169208281820 
  22. Content-Disposition: form-data; name="oper" 
  23.  
  24. upload 
  25. -----------------------------5169208281820-- 

POST http://www.test.comt/upload_attach?uidl=%3C HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Content-Type: multipart/form-data; boundary=---------------------------5169208281820
Content-Length: 449

-----------------------------5169208281820
Content-Disposition: form-data; name="file_1"; filename=""
Content-Type: application/octet-stream


-----------------------------5169208281820
Content-Disposition: form-data; name="file_0"; filename="test.txt"
Content-Type: text/plain

hello world!

-----------------------------5169208281820
Content-Disposition: form-data; name="oper"

upload
-----------------------------5169208281820--



e)CONNECT举例
Html代码

   1. CONNECT mail.test.com:80 HTTP/1.1 
   2. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0 
   3. Proxy-Connection: keep-alive 
   4. Host: mail.test.com:80 

CONNECT mail.test.com:80 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0
Proxy-Connection: keep-alive
Host: mail.test.com:80



3.0)在终端以 telnet 方式测试

a)打开回显功能(针对windows)
  Windows 2000:进入DOS模式->输入 telnet->set LOCAL_ECHO->退出:quit->telnet ip 80
  Windows xp:进入DOS模式->输入telnet->set local echo->open ip 80
b) 按HTTP协议格式输入GET请求、HEAD请求、POST请求。
分享到:
评论
1 楼 yellowhat 2010-07-23  
写的很清楚,支持一下!

相关推荐

    httppost和httpget需要的jar包

    在Java编程中,HTTP POST和GET是两种基本的HTTP请求方法,用于客户端向服务器发送数据。为了在Java中实现这些功能,我们需要引入特定的库,这些库通常被打包成JAR(Java Archive)文件。本篇文章将详细讲解HTTP POST...

    org.apache.http.httpentity jar包-系列jar包

    import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; ...

    httpcore-4.3.2.jar和httpmime-4.3.5.jar

    《深入理解HTTPCore与HTTPMIME:构建高效网络通信》 HTTPCore与HTTPMIME是Apache HttpClient库中的核心组件,这两个jar包在Java开发者中有着广泛的应用,尤其在处理HTTP请求和响应时不可或缺。本篇将详细介绍这两个...

    VC通过HttpGet和HttpPost方式与WebService通信,解析返回的Json

    在这个特定的场景中,我们关注的是如何利用VC通过HttpGet和HttpPost方法与WebService进行交互,并处理返回的Json数据。 HttpGet和HttpPost是HTTP协议中的两种主要请求方法。HttpGet是一种无状态、幂等的请求方法,...

    httpcore jar包

    1. **HTTP协议支持**:httpcore提供了对HTTP/1.0和HTTP/1.1协议的支持,包括GET、POST等各种HTTP方法,以及头部处理、状态码解析等。 2. **连接管理**:它包含连接池(Connection Pooling)功能,可以复用HTTP连接...

    org.apache.http包

    import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; ...

    org.apache.http jar包

    org.apache.http jar包 import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org....

    HTTP协议详解及RFC2616(HTTP)中文版

    **HTTP协议详解** HTTP(Hypertext Transfer Protocol)超文本传输协议是互联网上应用最广泛的一种网络协议。它是用于从万维网服务器传输超文本到本地浏览器的传输协议,是Web应用的基础。HTTP协议定义了客户端...

    C++实现HTTP请求

    在IT行业中,网络通信是软件开发的一个重要领域,而HTTP(超文本传输协议)作为互联网上应用最广泛的一种网络协议,被广泛应用于网页浏览、数据传输等场景。本篇文章将详细探讨如何使用C++来实现HTTP的POST和GET请求...

    构建一个简单的HTTP服务器的C#程序实例Ky_HttpServer.rar

    构建一个简单的HTTP服务器的C#程序实例。实现响应GET、POST请求。在服务端创建一个tcp通信来负责监听客户端连接。每次客户端发出请求后,我们根据请问报文来判断客户端的请求类型,然后根据不同的请求类型进行相应的...

    VB做的HTTP简单服务器源码

    标题 "VB做的HTTP简单服务器源码" 描述的是一个使用Visual Basic(VB)编程语言编写的简易HTTP服务器的源代码。这个服务器能够响应HTTP请求,为客户端提供服务,可能是为了教学目的或者作为小型项目的起点。VB是一种...

    C#实现HTTP代理

    在IT行业中,HTTP代理是一种网络通信机制,它允许客户端(如Web浏览器)通过另一台服务器作为中介来访问互联网上的资源。这种技术常用于提高匿名性、优化网络性能或绕过特定的网络限制。本篇文章将深入探讨如何使用...

    vc++HTTP客户端与服务端源代码

    在IT行业中,网络通信是至关重要的一个领域,而HTTP(超文本传输协议)作为网络通信的基础,被广泛应用于Web应用程序的开发。在这个场景下,我们关注的是使用VC++(Microsoft Visual C++)来实现HTTP客户端和服务器...

    图解HTTP,图解HTTP

    ### 图解HTTP:全面解析HTTP协议 #### 一、引言 HTTP协议作为互联网的核心组成部分,对于每一个从事Web开发或维护的技术人员来说都是必须掌握的基础知识。《图解HTTP》一书通过丰富的图表和深入浅出的文字解释,...

    C++编写的Linux下Http请求

    在IT领域,网络编程是不可或缺的一部分,特别是在操作系统如Linux中,开发者经常需要通过HTTP协议进行数据交换。本篇将深入探讨使用C++在Linux环境下实现HTTP请求,包括GET和POST方法。 HTTP(超文本传输协议)是...

    org.apache.http源代码和jar包

    import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponse; import org....

    c# http接口设计及调用demo

    在本示例中,我们将关注的是"C# HTTP接口设计及调用demo",这通常涉及到如何创建一个HTTP服务端接口,以及如何使用C#客户端进行调用。HTTP接口在分布式系统中扮演着重要角色,它允许不同组件之间通过HTTP协议交换...

    网络编程HttpServer c++实现

    在本项目中,"网络编程HttpServer c++实现" 是一个使用C++语言编写的HTTP服务器,它允许用户创建和管理基于HTTP协议的服务。HTTP服务器是互联网上的关键组件,它们接收HTTP请求并返回HTTP响应,使得网页和其他资源...

    VC++ HTTP Get Post请求

    在VC++编程环境中,HTTP(超文本传输协议)Get和Post请求是常见的网络通信方法,用于从或向服务器发送数据。这两个方法是Web应用程序与服务器交互的基础,理解它们的工作原理和如何在VC++中实现至关重要。 **HTTP ...

Global site tag (gtag.js) - Google Analytics