命令行窗口中用telnet测试HTTP协议

1. 命令行窗口中用telnet测试HTTP协议 

HTTP消息是由普通ASCII文本组成。消息包括消息头和数据体部分。消息头以行为单位,每行以CRLF(回车和换行)结束,消息头结束后,额外增加一个CRLF,之后内容就是数据体部分了。

我们可以在命令行窗口,通过TELNET,来测试HTTP协议。

1. 使用telnet连接到HTTP服务器,如要从google上请求index.html页面,首先要连接到服务器的80端口 

telnet www.baidu.com 80

2. 现在已经连接上了服务器,发送http请求消息:

GET /index.html HTTP/1.1

connection: close

Host: www.baidu.com

输入上面内容后,连续敲入两个回车,哈哈,是不是看到返回结果了。

这个请求的意思是:通过1.1版本协议请求index.html页面;connection: close是实用短连接,即服务器返回后就断开连接;Host字段知名页面所在的主机名。

返回结果应该是这样的:

HTTP/1.1 200 OK

Cache-Control: private, max-age=0

Date: Fri, 02 Jan 2009 12:26:17 GMT

Expires: -1

Content-Type: text/html; charset=GB2312

Set-Cookie: PREF=ID=7bbe374f53b6c6a8:NW=1:TM=1230899177:LM=1230899177:S=2EGHuZJnrtdQUB_A; expires=Sun, 02-Jan-2011 12:26:17 GMT; path=/; domain=.baidu.com

Server: gws

Transfer-Encoding: chunked

Connection: Close

这里有一个额外的CRLF

<html>

html数据

</html>

2. 请求消息格式 

下图是HTTP协议请求的一般格式:

  • 请求行

第一行是请求行:请求方法 URL路径 HTTP版本号,上面的例子中的请求行是:

GET /index.html HTTP/1.1

使用GET方法请求服务器根目录下的index.html文件,约定使用HTTP/1.1版本。

请求方法包括GET、POST、HEAD、OPTIONS、TRACE、PUT等几种,最常用的前2种。

1. GET方法。通过将参数附加在URL后面提交参数。如http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&rls=com.microsoft%3Azh-cn%3AIE-SearchBox&q=%E6%89%8B%E6%9C%BA&meta=&aq=f&oq=

GET

2. POST方法。通过将参数附加在请求的头部行后面(GET方式是没有数据体的)提交参数。GET方式提交参数数据量一般限制在1k一下,而POST是没有限制的。POST一般用在表单数据提交的时候。

3. HEAD方法不让服务器在回应中返回任何实体。对HEAD请求的回应部分来说,它的HTTP标题中包含的元信息与通过GET请求所得到的是相同的。通过使用这种方法,不必传输整个实体主体,就可以得到请求URI所指定资源的元信息。该方法通常用来测试超链接的合法性、可访问性及最近更新。 

  • 头部行

头部行中的内容一般用来描述客户端能兼容的类型。如Accept-Language告诉服务器客户端支持哪些语言;Cache-Control告诉服务器客户端是否支持cache。

  • 附属体(数据实体)

请求的附属体,GET不适用,POST方法提交数据时,用来存放请求的参数。

  • 客户端传递参数方式

1. GET方式传递,直接在URL后面。

2. POST方式传递,请求行告诉服务器参数长度,通过附属体独立传给服务器。

3. Cookie方式传递,不要忘记这种方式了,会话Session功能就是通过这种方式实现的哦。

  • 一些常用的头部行请求参数

User-Agent:客户端的浏览器信息。

Connection:close表示使用短连接,Keep-Alive表示客户端支持持久连接。

Date:消息产生的当前时间。

Accept-Language:客户端支持的语言。

Cache-Control:客户端是否支持cache。no-cache表示客户端不支持cache,如max-age=3600,告诉User Agent 该请求的响应结果在多长时间内有效,在有效期内,当用户再次需要访问时,直接从客户端本地提取,不需要访问服务器。

Referer:Referer用以告诉服务器该请求来自于哪个URL,可以用追踪用户的WEB访问路径。

If-Modified-Since: 如果请求消息包含If-Modified-Since标题域,GET方法的语法就变成“条件GET”,即“(conditional GET)”。 条件GET方法可以对指定资源进行判断,如果它在If-Modified-Since标题域中的指定日期后发生了更新,才启动传输,否则不传输。这种条件GET允许被缓存的实体在不必经过多次请求或不必要的数据传输就能进行刷新,从而有助于降低网络负载。

Last-Modified: Sun, 03 Dec 2008 23:52:56 GMT

ETag: “1cbf3-dfd-3a2adcd8″

    一般应用在文件下载上,用于标识响应内容的最后修改时间或内容较验码,当下一次User agent需要时,服务首先判断这二个值是否跟服务器上一致,一样则不需要返回内容。

Expires:该请求的响应结果在什么时间失效,在没有失效之前,代理可直接从缓存中返回以前的响应结果。

Host:指定请求资源的主机和端口号。HTTP/1.1请求必须指定Host,否则服务器会返回400状态码。

  • 请求消息例子

GET请求例子:

GET /css/news070130.css HTTP/1.1

Accept: */*

Referer: http://news.qq.com/a/20081224/000088.htm

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

If-Modified-Since: Thu, 29 Mar 2007 02:05:43 GMT; length=11339

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

Host: news.qq.com

Connection: Keep-Alive

Cookie: ssid=idlsesels; flv=9.0; icache=ADLFMBGC; adid=adsdifids; isflucky_50829637=0; 

POST请求例子:

POST /Login.php  HTTP/1.1

Accept: image/gif,*/*

Accept-language: zh-cn

Accept-encodeing: gzip

User-Agent: MSIE6.0

Host: www.some.com

Connection: Keep-Alive

Content-Length: 7

Cache-Control:no-cache

Cookie: name1=value1; name2=value2;

这里有一个额外的CRLF

username=b&passwd=d

3. 响应消息格式 

响应消息包括状态行、若干头部行和附属体(html数据实体)。

  • 状态行

状态行包括:HTTP协议版本号、状态码、状态码的文本描述信息。如:HTTP/1.1 200 OK

状态码由一个三位数组成,状态码大体有5种含义:

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

2. 2xx。成功。200请求成功;206断点续传。

3. 3xx。重定向。一般跳转到新的地址。

4. 4xx。客户端错误。404文件不存在

5. 5xx。服务器错误。500内部错误。

  • 头部行

Set-Cookie:服务器设置客户端Cookie。设置格式是name=value,设置多个参数时中间用分号隔开。Set-Cookie时还会用到几个参数:PATH设置有效的路径,DOMAIN设置cookie生效的域名,Expire设置cookie的有效时间,0表示关闭浏览器就失效。

Location:当服务器返回3xx重定向时,该参数实现重定向。广告链接的跳转就使用这种协议。

Content-Length:附属体(数据实体)的长

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS 开发杂谈

HTTP协议详解

HTTP协议,即超文本传输协议(Hypertext transfer protocol)。

2093
来自专栏超然的博客

学习前端前必知的——HTTP协议详解

原文参考博客园http://kb.cnblogs.com/page/130970/#statecode

1472
来自专栏那些年遇到的坑

HTTP所有常用状态码的含义

这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何...

1392
来自专栏极客猴

Django 实战2:利用 Session 实现自动登录机制

上篇文章中讲到 Django 如何启动以及配置 sessions 功能。sessions 功能用是跟踪用户的状态,经常结合 Cookie 功能实现自动登录功能。...

2143
来自专栏刘望舒

Android网络编程(一)HTTP协议原理

前言 这篇文章是这个系列的开篇,作为移动开发者,开发的应用不免会对网络进行访问,虽然现在已经有很多的开源库帮助我们可以轻而易举的访问网络,但是我们仍要去了解网络...

2325
来自专栏magicsoar

windows下的C++ socket服务器(4)

void handleAccept(int socket_fd) { char buf[1024] = { '\0' }; string cmd...

2925
来自专栏Linyb极客之路

网络编程之HTTP协议结构

Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

1043
来自专栏互扯程序

HTTP状态码大全

写在前面 我们在开发Web服务的时候,经常会遇到404,500等错误。对于初学者来说遇到错误,不知如何下手,今天我们来看看每个状态都表示什么意思? HTTP状...

4194
来自专栏技术博文

H5缓存机制浅析

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离...

4198
来自专栏信安之路

http 协议详解

HTTP 协议,即超文本传输协议 (Hypertext transfer protocol)。 是一种详细规定了浏览器和万维网 (WWW = World Wid...

1320

扫码关注云+社区

领取腾讯云代金券