深入理解HTTP消息头
HTTP协议中的请求头和响应头

HTTP协议中的请求头和响应头HTTP协议是互联网中最重要的协议之一,它是实现Web服务的基础。
在HTTP通信过程中,客户端与服务器之间需要交换大量的信息,而其中的请求头和响应头则是最重要的两个部分。
本文将针对HTTP协议中的请求头和响应头进行详细介绍,探究其基本原理、常见类型以及使用方法,帮助读者更好地理解HTTP 协议。
HTTP请求头HTTP请求头通常包含以下内容:1. 请求的方法: HTTP协议规定了几种请求方法,包括GET、POST、PUT、DELETE等。
客户端在发送请求时需要指定请求方法,服务器接收到请求后便根据不同的方法处理请求。
2. 请求的URL:请求的URL通常指明了客户端请求数据的地址,包括主机名、端口号、路径等。
客户端通常通过浏览器输入URL来发起HTTP请求。
3. 请求的HTTP版本: HTTP标准目前有1.0和1.1两个版本,通常请求头中会包含HTTP版本信息。
4. 请求头部字段:请求头中可以包含多个字段,用于提供额外的请求信息,例如用户代理、接受的编码方式等。
5. 请求正文:请求体中包含了客户端向服务器传递的数据,通常用于提交表单数据或上传文件等操作。
HTTP响应头HTTP响应头通常包含以下内容:1. HTTP版本:响应头中会包含HTTP版本信息,以便客户端与服务器进行协议匹配。
2. 状态码: HTTP响应中的状态码用于表明服务器对请求的处理结果。
常见的状态码包括200表示成功、404表示未找到资源、500表示服务器内部错误等。
3. 响应头部字段:响应头中可以包含多个字段,用于提供响应信息,例如数据内容类型、服务器软件等。
4. 响应体:响应体中包含了由服务器返回给客户端的数据,可以是HTML页面、图片、视频等内容。
常见的请求头与响应头1. User-Agent:请求头中的User-Agent字段用于标明客户端浏览器的代理信息,例如Chrome、Safari等。
服务器可以利用该字段进行浏览器兼容性检测、广告投放等操作。
HTTP中header头部信息详解

HTTP中header头部信息详解HTTP Request的Header信息1、HTTP请求⽅式如下表:GET向Web服务器请求⼀个⽂件POST向Web服务器发送数据让Web服务器进⾏处理PUT向Web服务器发送数据并存储在Web服务器内部HEAD检查⼀个对象是否存在DELETE从Web服务器上删除⼀个⽂件CONNECT对通道提供⽀持TRACE跟踪到服务器的路径OPTIONS查询Web服务器的性能说明:主要使⽤到“GET”和“POST”。
实例:POST /test/tupian/cm HTTP/1.1分成三部分:1. POST:HTTP请求⽅式2. /test/tupian/cm:请求Web服务器的⽬录地址(或者指令)3. HTTP/1.1: URI(Uniform Resource Identifier,统⼀资源标识符)及其版本备注:在Ajax中,对应method属性设置。
2、Host说明:请求的web服务器域名地址3、User-Agent说明:HTTP客户端运⾏的浏览器类型的详细信息。
通过该头部信息,web服务器可以判断到当前HTTP请求的客户端浏览器类别。
实例:User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.114、Accept说明:指定客户端能够接收的内容类型,内容类型中的先后次序表⽰客户端接收的先后次序。
例如:Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5备注:在Prototyp(1.5)的Ajax代码封装中,将Accept默认设置为“text/javascript, text/html, application/xml, text/xml, */*”。
HTTP协议详解(深入理解)

HTTP协议详解(深⼊理解)引⼊超⽂本传输协议(HTTP,HyperText Transfer Protocol)是互联⽹上应⽤最为⼴泛的⼀种⽹络协议。
所有的WWW⽂件都必须遵守这个标准。
设计HTTP最初的⽬的是为了提供⼀种发布和接收HTML页⾯的⽅法。
1960年美国⼈Ted Nelson构思了⼀种通过计算机处理⽂本信息的⽅法,并称之为超⽂本(hypertext),这成为了HTTP超⽂本传输协议标准架构的发展根基。
Ted Nelson组织协调万维⽹协会(World Wide Web Consortium)和互联⽹⼯程⼯作⼩组(Internet Engineering Task Force )共同合作研究,最终发布了⼀系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
http协议的作⽤及特点HTTP是⼀个客户端和服务器端请求和应答的标准(TCP)。
客户端是终端⽤户,服务器端是⽹站。
通过使⽤Web浏览器、⽹络爬⾍或者其它的⼯具,客户端发起⼀个到服务器上指定端⼝(默认端⼝为80)的HTTP请求。
(我们称这个客户端)叫⽤户代理(user agent)。
应答的服务器上存储着(⼀些)资源,⽐如HTML⽂件和图像。
(我们称)这个应答服务器为源服务器(origin server)。
在⽤户代理和源服务器中间可能存在多个中间层,⽐如代理,⽹关,或者隧道(tunnels)。
尽管TCP/IP协议是互联⽹上最流⾏的应⽤,HTTP协议并没有规定必须使⽤它和(基于)它⽀持的层。
事实上,HTTP可以在任何其他互联⽹协议上,或者在其他⽹络上实现。
HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使⽤。
通常,由HTTP客户端发起⼀个请求,建⽴⼀个到服务器指定端⼝(默认是80端⼝)的TCP连接。
HTTP服务器则在那个端⼝监听客户端发送过来的请求。
⼀旦收到请求,服务器(向客户端)发回⼀个状态⾏,⽐如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的⽂件、错误消息、或者其它⼀些信息。
深入理解http(三)----http进阶hhtps

深⼊理解http(三)----http进阶hhtps⼀、https概述https=http+SSL/TSL在http中,没有加密机制,所有的内容都以明⽂的形式传输,在⽹络上“裸奔”,这是极其不安全的,为了解决这个问题,可以通过SSL(Secure Socket Layer安全套接层)或者TSL(Transport Layer Security安全车传输协议)的组合使⽤,达到加密http的通信内容,这个时候,http就变成了https协议。
⼆、加密⽅式通过前⾯的概述,我们知道,SSL/TSL最主要的作⽤就是⽤来加密信息。
但他们加密的⽅式是什么呢? 1.对称加密的⽅式:对称加密就是说:加密使⽤的密钥和解密使⽤的密钥是相同的。
⽐如,我们在⼿机加锁时,解密的密码和加锁的密码是⼀样的。
我们很容易想到,对称加密存在很⼤的安全隐患,万⼀你的⼿机密码不⼩⼼泄漏了,那么⼿机在任何⼈⼿⾥都可以使⽤,完全不存在隐私。
⾮对称加密是⼀种⽐对称加密更加优秀的加密算法,当然算法有利有弊,对称加密速度快但是安全性相对于⾮对称加密来说低,为什么呢,你想啊,要想使⽤对称加密,那么分享信息的各个个体之间都需要分享这个密钥,⽐如你们1000个⼈之间都使⽤同⼀个密钥进⾏密⽂传输,只要其中⼀个⼈密钥被盗窃了,那么整体加密的信息将都被破解了。
好了,那么我们开始说说⾮对称加密。
三、⾮对称加密⽅法(/mujian/p/7665958.html)1公钥私钥的使⽤原则①每⼀个公钥都对应⼀个私钥。
②密钥对中,让⼤家都知道的是公钥,不告诉⼤家,只有⾃⼰知道的,是私钥。
③如果⽤其中⼀个密钥加密数据,则只有对应的那个密钥才可以解密。
④如果⽤其中⼀个密钥可以进⾏解密数据,则该数据必然是对应的那个密钥进⾏的加密。
⾮对称密钥密码的主要应⽤就是公钥加密和公钥认证。
2公钥加密、解密加密的⽬的,是不希望第三者看到当前两个通讯⽤户的通讯内容。
2.1加密A(客户)想给B(服务器)发送⼀段⽂字,但是不想让别⼈看到,因此想使⽤⾮对称加密⽅法来加密这段⽂字,当然,B需要有⼀对公钥和私钥:① B将他的公钥发送给A② A⽤B给他的公钥加密这段⽂字,然后传给B③ B⽤他的私钥解密A发过来的消息,这⾥要强调的是,只要B的私钥不泄露,这封信就是安全的,即使落在别⼈⼿⾥,也⽆法解密。
HTTP头部详解及使用Java套接字处理HTTP请求

HTTP头部详解及使用Java套接字处理HTTP请求进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页图像以及因特网上在浏览器与服务器间传输的其他类型文件只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子)本文从HTTP协议的结构上初步探讨HTTP协议的工作原理和请求响应格式,并最后通过一个使用Java编写的小HTTP服务器验证了如何处理和响应HTTP请求HTTP由两部分组成:请求和响应当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据直到浏览器解析该响应并显示出网页(或其他资源)为止HTTP请求HTTP请求的格式如下所示:<request-line><headers><blank line>[<request-body>]在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型要访问的资源以及使用的HTTP版本紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源对于 的GET请求如下所示:GET / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive请求行的第一部分说明了该请求是GET请求该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)那么请求发到哪里去呢?这就是第二行的内容第2行是请求的第一个首部,HOST首部HOST将指出请求的目的地结合HOST 和上一行中的斜杠(/),可以通知服务器请求的是/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)注意,在最后一个首部之后有一个空行即使不存在请求主体,这个空行也是必需的如果要获取一个诸如/books的域内的页面,那么该请求可能类似于:GET /books/ HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意只有第一行的内容发生了变化,它只包含URL中后面的部分要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面其格式类似于:URL ? name1=value1&name2=value2&..&nameN=valueN该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:GET /books/?name=Professional%20Ajax HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Connection: Keep-Alive注意,为了将文本Professional Ajax作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)名称值(namevalue)对用 & 隔开绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式当然,如何使用这些数据还是由服务器决定的浏览器发送的首部,通常比本文中所讨论的要多得多为了简单起见,这里的例子尽可能简短另一方面,POST请求在请求主体中为服务器提供了一些附加的信息通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器以下就是一个典型的POST请求:POST / HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1Content-Type: application/x-www-form-urlencodedContent-Length: 40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley从上面可以发现, POST请求和GET请求之间有一些区别首先,请求行开始处的GET改为了POST,以表示不同的请求类型你会发现首部Host和User-Agent 仍然存在,在后面有两个新行其中首部Content-Type说明了请求主体的内容是如何编码的浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型首部Content-Length说明了请求主体的字节数在首部 Connection后是一个空行,再后面就是请求主体与大多数浏览器的POST请求一样,这是以简单的名称值对的形式给出的,其中name是Professional Ajax,publisher是Wiley你可以以同样的格式来组织URL的查询字符串参数正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET 请求和POST请求相同下一步我们来看看服务器将对HTTP请求发送什么响应HTTP响应如下所示,HTTP响应的格式与请求的格式十分类似:<status-line><headers><blank line>[<response-body>]正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息状态行(status line)通过提供一个状态码来说明所请求的资源情况以下就是一个HTTP响应的例子:HTTP/1.1 200 OKDate: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122<html><head><title>Wrox Homepage</title></head><body><!-- body goes here --></body></html>在本例中,状态行给出的HTTP状态代码是200,以及消息OK状态行始终包含的是状态码和相应的简短消息,以避免混乱最常用的状态码有:200 (OK): 找到了该资源,并且一切正常304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改这通常用于浏览器的缓存机制401 (UNAUTHORIZED):客户端无权访问该资源这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器403 (FORBIDDEN):客户端未能获得授权这通常是在401之后输入了不正确的用户名或密码404 (NOT FOUND):在指定的位置不存在所申请的资源在状态行之后是一些首部通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length在本例中,首部 Content-Type指定了MIME 类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)浏览器将把这些数据显示给用户注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据Java代码1./** *//**2. * SimpleHttpServer.java3. */4.5.import java.io.*;6.import .*;7.import java.util.StringTokenizer;8.9./** *//**10. * 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及11. * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.12. * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息13. * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.14. * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.15. * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉16. * HTTP 协议.17. * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.18. *19. * <pre>20. * 当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.21. * 随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:22. * < Method > < URL > < HTTP Version > < >23. * { <Header>:<Value> < >}*24. * < >25. * { Entity Body }26. * 请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等. 27. * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.28. * 在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt.29. * Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:30. * < HTTP Version> <Status Code> [<Message>]< >31. * { <Header>:<Value> < > } *32. * < >33. * { Entity Body }34. * 应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:35. * 参看:HTTP应答码及其意义36. *37. * 1XX 保留38. * 2XX 表示成功39. * 3XX 表示URL已经被移走40. * 4XX 表示客户错误41. * 5XX 表示服务器错误42. * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.43. * 在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.44. * 下面是一个应答消息的例子:45. * HTTP/1.0 200 OK46. * Date: Moday,07-Apr-97 21:13:02 GMT47. * Server:NCSA/1.148. * MIME_Version:1.049. * Content_Type:text/html50. * Last_Modified:Thu Dec 5 09:28:01 199651. * Coentent_Length:310752. *53. * <HTML><HEAD><TITLE></HTML>54. *55. * 在用Java语言实现HTTP服务器时,首先启动一个.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用 PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用 String.getBytes()方法转换为字节数组返回,或者使用PrintStream 的print()方法写入文本,用 write(byte[])方法写入二进制数据.56. *57. * </pre>58. * @author 刘长炯59. * @version 1.0 2007-07-24 Sunday60. */61.public class SimpleHttpServer implements Runnable ...{62. /** *//**63. *64. */65. ServerSocket serverSocket;//服务器Socket66.67. /** *//**68. * 服务器监听端口, 默认为 80.69. */70. public static int PORT=80;//标准HTTP端口71.72. /** *//**73. * 开始服务器 Socket 线程.74. */75. public SimpleHttpServer() ...{76. try ...{77. serverSocket=new ServerSocket(PORT);78. } catch(Exception e) ...{79. System.out.println("无法启动HTTP服务器:"+e.getLocalizedMessage());80. }81. if(serverSocket==null) System.exit(1);//无法开始服务器82. new Thread(this).start();83. System.out.println("HTTP服务器正在运行,端口:"+PORT);84. }85.86. /** *//**87. * 运行服务器主线程, 监听客户端请求并返回响应.88. */89. public void run() ...{90. while(true) ...{91. try ...{92. Socket client=null;//客户Socket93. client=serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器94. if(client!=null) ...{95. System.out.println("连接到服务器的用户:"+client);96. try ...{97. // 第一阶段: 打开输入流98. BufferedReader in=new BufferedReader(new InputStreamReader(99. client.getInputStream())); 100.101. System.out.println("客户端发送的请求信息: ***************");102. // 读取第一行, 请求地址103. String line=in.readLine(); 104. System.out.println(line); 105. String resource=line.substring(line.indexOf('/'),stIndexOf('/')-5);106. //获得请求的资源的地址107. resource=URLDecoder.decode(resourc e, "UTF-8");//反编码 URL 地址108. String method = new StringTokenize r(line).nextElement().toString();// 获取请求方法, GET 或者 POST109.110. // 读取所有浏览器发送过来的请求参数头部信息111. while( (line = in.readLine()) != n ull) ...{112. System.out.println(line); 113.114. if(line.equals("")) break; 115. }116.117. // 显示 POST 表单提交的内容, 这个内容位于请求的主体部分118. if("POST".equalsIgnoreCase(method) ) ...{119. System.out.println(in.readLine ());120. }121.122. System.out.println("请求信息结束 ***************");123. System.out.println("用户请求的资源是:"+resource);124. System.out.println("请求的类型是: " + method);125.126. // GIF 图片就读取一个真实的图片数据并返回给客户端127. if(resource.endsWith(".gif")) ...{128. fileService("images/test.gif", client);129. closeSocket(client);130. continue;131. }132.133. // 请求 JPG 格式就报错 404 134. if(resource.endsWith(".jpg")) ...{135. PrintW riter out=new PrintWriter(client.getOutputStream(),true); 136. out.println("HTTP/1.0 404 Not foun d");//返回应答消息,并结束应答137. out.println();// 根据 HTTP 协议, 空行将结束头信息138. out.close();139. closeSocket(client);140. continue;141. } else ...{142. // 用 writer 对客户端 socket 输出一段 HTML 代码143. PrintWriter out=new PrintWrite r(client.getOutputStream(),true);144. out.println("HTTP/1.0 200 OK") ;//返回应答消息,并结束应答145. out.println("Content-Type:text /html;charset=GBK");146. out.println();// 根据 HTTP 协议, 空行将结束头信息147.148. out.println("<h1> Hello Http S erver</h1>");149. out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.<br>");150. out.println("您请求的路径是: " + resource + "<br>");151. out.println("这是一个支持虚拟路径的图片:<img src='abc.gif'><br>" +152. "<a href='abc.gif'>点击打开abc.gif, 是个服务器虚拟路径的图片文件.</a>");153. out.println("<br>这是个会反馈 404 错误的的图片:<img src='test.jpg'><br><a href='test.jpg'>点击打开test.jpg</a><br>");154. out.println("<form method=post action='/'& gt;POST 表单 <input name=username value='用户'> < input name=submit type=submit value=submit></form>"); 155. out.close();156.157. closeSocket(client);158. }159. } catch(Exception e) ...{160. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());161. }162. }163. //System.out.println(client+"连接到HTTP服务器");//如果加入这一句,服务器响应速度会很慢164. } catch(Exception e) ...{165. System.out.println("HTTP服务器错误:"+e.getLocalizedMessage());166. }167. }168. }169.170. /** *//**171. * 关闭客户端 socket 并打印一条调试信息.172. * @param socket 客户端 socket.173. */174. void closeSocket(Socket socket) ...{175. try ...{176. socket.close();177. } catch (IOException ex) ...{178. ex.printStackTrace();179. }180. System.out.println(socket + "离开了HTTP服务器");181. }182.183. /** *//**184. * 读取一个文件的内容并返回给浏览器端.185. * @param fileName 文件名186. * @param socket 客户端 socket.187. */188. void fileService(String fileName, Socket socket)189. ...{190.191. try192. ...{193. PrintStream out = new PrintStream(socket.getOu tputStream(), true);194. File fileToSend = new File(fileName); 195. if(fileToSend.exists() && !fileToSend.isDirect ory())196. ...{197. out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答198. out.println("Content-Type:application/bina ry");199. out.println("Content-Length:" + fileToSend .length());// 返回内容字节数200. out.println();// 根据 HTTP 协议, 空行将结束头信息201.202. FileInputStream fis = new FileInputStream( fileToSend);203. byte data[] = new byte[fis.available()];204. fis.read(data);205. out.write(data);206. out.close();207. fis.close();208. }209. }210. catch(Exception e)211. ...{212. System.out.println("传送文件时出错:" + e.getLocalizedMessage());213. }214. }215.216. /** *//**217. * 打印用途说明.218. */219. private static void usage() ...{220. System.out.println("Usage: java HTTPServer <port> Default port is 80.");221. }222.223.224. /** *//**225. * 启动简易 HTTP 服务器226. * @param args227. */228. public static void main(String[] args) ...{229. try ...{230. if(args.length != 1) ...{231. usage();232. } else if(args.length == 1) ...{233. PORT = Integer.parseInt(args[0]); 234. }235. } catch (Exception ex) ...{236. System.err.println("Invalid port arguments. It must be a integer that greater than 0");237. }238.239. new SimpleHttpServer();240. }241.242.}。
网络协议知识:HTTP请求和响应头的应用场景和优缺点

网络协议知识:HTTP请求和响应头的应用场景和优缺点HTTP请求和响应头是网络协议中非常重要的一部分,它们在网络通信中发挥着重要的作用。
在本文中,我们将了解HTTP请求和响应头的应用场景和优缺点。
一、HTTP请求HTTP请求是客户端向服务器发送请求的过程。
HTTP请求通常包含URL地址、HTTP方法、请求报头和请求正文等内容。
1、应用场景(1)浏览器请求页面当用户在浏览器地址栏中输入URL地址时,浏览器会向服务器发送HTTP请求,请求得到该URL对应的页面。
(2)表单提交当用户填写一个表单并点击提交按钮时,浏览器会向服务器发送HTTP请求,将表单数据发送给服务器。
2、优缺点(1)优点a.灵活性高:HTTP请求支持多种请求方法和数据格式,让用户可以根据需要自由选择。
b.高效节省:HTTP请求采用TCP协议,数据传输速度快,能够高效地传输数据,节省时间和资源。
(2)缺点a.请求数据容易被窃听:HTTP请求中的数据是明文传输,容易被黑客截获和窃听,从而导致信息泄露和数据被篡改。
b.没有安全保障:HTTP请求没有加密机制,没有安全保障,无法保护被传输的数据的安全性。
二、HTTP响应头HTTP响应头是服务器向客户端发送响应时的消息头,通常包含响应状态、响应报头和响应正文等内容。
1、应用场景(1)网页加载当用户在浏览器中输入URL或者点击某个链接时,服务器会返回一个响应头,告诉浏览器需要加载的网页内容。
(2)浏览器下载文件当用户在浏览器中点击下载文件时,服务器会返回一个响应头,告诉浏览器需要下载的文件类型和文件大小等信息。
2、优缺点(1)优点a.能够读取服务器响应状态:HTTP响应头能够告诉浏览器服务器返回的响应状态,从而帮助浏览器判断处理方式。
b.能够读取服务器返回的信息:HTTP响应头能够告诉浏览器服务器返回的信息,从而帮助浏览器正确地显示页面和资源。
(2)缺点a.响应头的体积较大:HTTP响应头可能包含大量信息,导致响应头的体积增大,从而使得传输效率下降。
http协议报头详解HTTP协议结构

http协议报头详解HTTP协议结构http协议请求报⽂和响应报⽂都是由以下4部分组成1.请求⾏2.请求头3.空⾏4.消息主体下图为http请求的报⽂结构下图为http响应报⽂结构请求⾏格式为:Method Request-URI HTTP-Version 结尾符结尾符⼀般⽤\r\n请求头通⽤报头既可以出现在请求报头,也可以出现在响应报头中Date:表⽰消息产⽣的⽇期和时间Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接Cache-Control:⽤于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独⽴的(⼀个消息的缓存指令不会影响另⼀个消息处理的缓存机制)请求报头请求报头通知服务器关于客户端求求的信息,典型的请求头有:Host:请求的主机名,允许多个域名同处⼀个IP地址,即虚拟主机User-Agent:发送请求的浏览器类型、操作系统等信息Accept:客户端可识别的内容类型列表,⽤于指定客户端接收那些类型的信息Accept-Encoding:客户端可识别的数据编码Accept-Language:表⽰浏览器所⽀持的语⾔类型Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表⽰保持连接。
Transfer-Encoding:告知接收端为了保证报⽂的可靠传输,对报⽂采⽤了什么编码⽅式。
响应报头⽤于服务器传递⾃⾝信息的响应,常见的响应报头:Location:⽤于重定向接受者到⼀个新的位置,常⽤在更换域名的时候Server:包含可服务器⽤来处理请求的系统信息,与User-Agent请求报头是相对应的实体报头实体报头⽤来定于被传送资源的信息,既可以⽤于请求也可⽤于响应。
请求和响应消息都可以传送⼀个实体,常见的实体报头为:Content-Type:发送给接收者的实体正⽂的媒体类型Content-Lenght:实体正⽂的长度Content-Language:描述资源所⽤的⾃然语⾔,没有设置则该选项则认为实体内容将提供给所有的语⾔阅读Content-Encoding:实体报头被⽤作媒体类型的修饰符,它的值指⽰了已经被应⽤到实体正⽂的附加内容的编码,因⽽要获得Content-Type报头域中所引⽤的媒体类型,必须采⽤相应的解码机制。
http1.1信息头

Http1.1信息头,请求头Http中的消息头包括通用消息头,请求头,响应头,实体头。
一、通用信息头(可用于请求,也可用于响应)1、Cache-Control请求:用于请求时表示客户与服务器之间的代理服务器如何使用已缓存的界面响应:通知客户机何代理服务器如何缓存该页面取值为public,private,no-cache,no-store,no-transform,must-ridate,proxy-ridate,max-age,s-maxage。
一个cache-control可以设置多个字段,各字段间以逗号分割如Cache-Control:no-store,no-cache2、Connection用于指示处理完本次请求/响应后,客户端与服务器是否继续保持连接取值为Keep-Alive,close。
默认为Keep-Alive3、Date用于表示Http消息产生的时间,格式必须是GMT格式,如Date:True,11 Jul 2000 18:23:16 GMT4、Pragma与Cache-Control类似,但值只能固定为no-cache5、Trailer有些消息头可以放在消息头中,也可以放在实体内容之后。
对于后者需在Trailer字段中指定,如Trailer:Date6、Transfer-Encoding如何实体部分采用某种编码方式传输,则该字段指定该编码方式,目前的值只能为chuncked7、UpgradeUpgrade字段允许客户端指定它所支持并希望将当前换到的通讯协议对于101状态码,服务器必须使用Upgrade头字段指定切换的协议,如Upgrade:Http/2.0 SHTTP/1.38、Viavia头字段用于指定Http消息途径的中介代理服务器名称和所使用的协议,这个头字段由代理服务器产生,每个代理服务器必须把他的信息追加到via字段的最后,以反应http消息途径的多个代理服务器的顺序Via: Http/1.1 Proxy1 Http/1.1 Proxy29、WarningWarning头字段主要用于说明其他头字段和状态码不能表示的一些其它警告信息,例如,返回的实体信息可能已经过时二、请求头(用于客户端)请求头是客户端在请求消息中向服务器传递附加信息,主要包括客户端可以接受的数据类型,压缩方法,语言以及发出请求的超链接所属页面的URL地址信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(一)初识HTTP消息头但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。
做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。
HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP 体两部分,后者是可选的,而前者是必须的。
每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。
下面就来看一个简单的例子:首先制作一个非常简单的网页,它的内容只有一行:<html><body>hello world</body></html>把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:1 解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:协议名:http主机名:localhost端口:8080对象路径:/simple.htm2 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包3 使用TCP协议连接到主机的指定端口(localhost, 8080),并发送已封装好的数据包4 等待服务器返回数据,并解析返回数据,最后显示出来由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:GET /simple.htm HTTP/1.1<CR>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, */*<CR>Accept-Language: zh-cn<CR>Accept-Encoding: gzip, deflate<CR>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>Host: localhost:8080<CR>Connection: Keep-Alive<CR><CR>为了显示清楚我把所有的回车的地方都加上了“<CR>”,注意最后还有一个空行加一个回车,这个空行正是HTTP规定的消息头和消息体的分界线,第一个空行以下的内容就是消息体,这个请求数据包是没有消息体的。
消息的第一行“GET”表示我们所使用的HTTP动作,其他可能的还有“POST”等,GET的消息没有消息体,而POST消息是有消息体的,消息体的内容就是要POST的数据。
后面/simple.htm就是我们要请求的对象,之后HTTP1.1表示使用的是HTTP1.1协议。
第二行表示我们所用的浏览器能接受的Content-type,三四两行则是语言和编码信息,第五行显示出本机的相关系信息,包括浏览器类型、操作系统信息等,很多网站可以显示出你所使用的浏览器和操作系统版本,就是因为可以从这里获取到这些信息。
第六行表示我们所请求的主机和端口,第七行表示使用Keep-Alive方式,即数据传递完并不立即关闭连接。
服务器接收到这样的数据包以后会根据其内容做相应的处理,例如查找有没有“/simple.htm”这个对象,如果有,根据服务器的设置来决定如何处理,如果是HTM,则不需要什么复杂的处理,直接返回其内容即可。
但在直接返回之前,还需要加上HTTP消息头。
服务器发回的完整HTTP消息如下:HTTP/1.1 200 OK<CR>Server: Microsoft-IIS/5.1<CR>X-Powered-By: <CR>Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>Content-Type: text/html<CR>Accept-Ranges: bytes<CR>Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT<CR>ETag: "5ca4f75b8c3ec61:9ee"<CR>Content-Length: 37<CR><CR><html><body>hello world</body></html>同样,我用“<CR>”来表示回车。
可以看到,这个消息也是用空行切分成消息头和消息体两部分,消息体的部分正是我们前面写好的HTML代码。
消息头第一行“HTTP/1.1”也是表示所使用的协议,后面的“200 OK”是HTTP 返回代码,200就表示操作成功,还有其他常见的如404表示对象未找到,500表示服务器错误,403表示不能浏览目录等等。
第二行表示这个服务器使用的WEB服务器软件,这里是IIS 5.1。
第三行是的一个附加提示,没什么实际用处。
第四行是处理此请求的时间。
第五行就是所返回的消息的content-type,浏览器会根据它来决定如何处理消息体里面的内容,例如这里是text/html,那么浏览器就会启用HTML解析器来处理它,如果是image/jpeg,那么就会使用JPEG的解码器来处理。
消息头最后一行“Content-Length”表示消息体的长度,从空行以后的内容算起,以字节为单位,浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。
理解HTTP消息头(二)常见的HTTP返回码上一篇文章里我简要的说了说HTTP消息头的格式,注意到在服务器返回的HTTP 消息头里有一个“HTTP/1.1 200 OK”,这里的200是HTTP规定的返回代码,表示请求已经被正常处理完成。
浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么,每一种返回代码都有自己的含义。
这里列举几种常见的返回码。
1 403 Access Forbidden如果我们试图请求服务器上一个文件夹,而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话,就会返回这个代码。
一个完整的403回复可能是这样的:(IIS5.1)HTTP/1.1 403 Access ForbiddenServer: Microsoft-IIS/5.1Date: Mon, 06 Mar 2006 08:57:39 GMTConnection: closeContent-Type: text/htmlContent-Length: 172<html><head><title>Directory Listing Denied</title></head><body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>2 404 Object not found当我们请求的对象在服务器上并不存在时,就会给出这个返回代码,这可能也是最常见的错误代码了。
IIS给出的404消息内容很长,除了消息头以外还有一个完整的说明“为什么会这样”的网页。
APACHE服务器的404消息比较简短,如下:HTTP/1.1 404 Not FoundDate: Mon, 06 Mar 2006 09:03:14 GMTServer: Apache/2.0.55 (Unix) PHP/5.0.5Content-Length: 291Keep-Alive: timeout=15, max=100Connection: Keep-AliveContent-Type: text/html; charset=iso-8859-1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL /notexist was not found on this server.</p> <hr><address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address></body></html>也许你会问,无论是404还是200,都会在消息体内给出一个说明网页,那么对于客户端来说二者有什么区别呢?一个比较明显的区别在于200是成功请求,浏览器会记录下这个地址,以便下次再访问时可以自动提示该地址,而404是失败请求,浏览器只会显示出返回的页面内容,并不会记录此地址,要再次访问时还需要输入完整的地址。
3 401 Access Denied当WEB服务器不允许匿名访问,而我们又没有提供正确的用户名/密码时,服务器就会给出这个返回代码。
在IIS中,设置IIS的安全属性为不允许匿名访问(如下图),此时直接访问的话就会得到以下返回结果:HTTP/1.1 401 Access DeniedServer: Microsoft-IIS/5.1Date: Mon, 06 Mar 2006 09:15:55 GMTWWW-Authenticate: NegotiateWWW-Authenticate: NTLMConnection: closeContent-Length: 3964Content-Type: text/html<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html dir=ltr>……此时浏览器上给出的提示如下图,让我们输入用户名和密码:因返回信息中消息体较长,只取前面两行内容。