HTTP协议介绍(分析tinyhttpd【上】)
来源:互联网 发布:navicat for linux 64 编辑:程序博客网 时间:2024/06/03 16:59
概述
超文本传输协议(HyperText Transfer Protocol,HTTP)是从服务器传输数据到客户端的传输协议。
HTTP 的主要特点
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协+ 议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。传输的类型由 Content-Type 加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
客户端和服务器端交互的过程
- 客户发起连接
- 客户发送请求
- 服务器响应请求
- 服务器关闭连接 //因为是无连接的,所以响应完毕就断开了连接
HTTP报文
请求端(客户端)的HTTP报文叫做请求报文,响应段(服务器端)的叫做响应报文。HTTP报文本身是由多行(CR+LF作换行符’\r\n’)数据构成的字符串文本
请求报文和响应报文的结构:
请求行
请求消息的第一行就是请求行。它指明使用的请求方法、资源标示符、和 HTTP 版本。如
GET /hello.htm HTTP/1.1
请求方法
GET:获取资源
GET 方法用来请求访问已被 URI 识别的资源。指定的资源进服务器端解析后返回响应内容。换言之,如果请求的资源是文本(静态页面请求),那就保持原样返回;如果是像CGI 那样的程序(动态页面请求),则返回经过执行后的输出结果。
POST:传输实体主体
POST 的主要目的是用来传输实体的主体,不是获取响应的主体内容
请求方法用来定义操作资源的方式,HTTP/1.1 协议中定义了八种请求方法:
GET:读取资源数据
POST:新建资源数据
PUT:更新资源数据
DELETE:删除资源数据
HEAD:读取资源的元数据
OPTIONS:读取该资源所支持的所有请求方法
TRACE:回显服务器收到的请求,主要用于测试或诊断
CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)
此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
资源标示符
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下
如:schema://host[:port#]/path/…/[?query-string][#anchor]
scheme 指定低层使用的协议(例如:http, https, ftp)
host HTTP服务器的IP地址或者域名
port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/
path 访问资源的路径
query-string 发送给http服务器的数据
anchor- 锚
更多关于URL的资料请参考URL详解
请求头字段
用来传递客户端的更多信息,以及传递解析消息主体的必要信息。如
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)Host: example.comAccept-Language: en-usAccept-Encoding: gzip, deflate
常见请求头字段有
- Accept: 客户端接受哪些 Mine 类型。如 Accept: text/html
- Accept-Encoding: 支持的编码类型。如 gzip, deflate, sdch
- Accept-Language: 可接受的语言。如 en-US,en;q=0.8
- User-Agent:一个标识客户端的字符串。如 User-Agent: Mozilla/5.0 - (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/38.0.2125.101 Safari/537.36
- Cookie: Cookie。如 sessionid=c8422b97-98e2-4bc6-aa31-9b667d6ca4a5; theme=4;
- Referer: 从那个页面到的该页面。
空行
指示头字段区完成,消息主体开始(如果有消息主体的话)。
响应消息
状态行
由http版本、状态码、状态描述文字构成。如
HTTP/1.1 200 OK
状态码
HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的3位数字代码。
所有的状态码的第一个数字代表了响应的五种状态之一:
1xx:代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行 结束。
2xx:代表请求接收、理解并且接受。
3xx:代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目 标)在本次响应的Location域中指明。当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才可以 在没有用户介入的情况下自动提交所需要的后续请求。
4xx:代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应 该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。
5xx:代表了服务器在处理请求的过程中有错误或者异常状态发生,,也有可能是服务器意识到以当前的软硬件资源 无法完成对请求的处理。
常见状态码有:
200: 请求已经成功,请求所希望的响应头或者数据体将随着此响应返回
202: 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了
204: 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息
304: 被请求的资源内容没有发生更改
400: 包含语法错误,无法被服务器解析
403: 服务器已经接收请求,但是拒绝执行
404: 请求失败,请求所希望得到的资源未在服务器上发现
408: 请求超时。客户端可以再次提交这一请求而无需任何修改
500: 服务器内部错误,无法处理请求
502: 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效响应
504: 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应
响应头字段
和请求消息类似,首部字段会包括服务器本身的一些信息指示、以及响应消息本身的元数据。如
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
常见响应头有:
Content-Encoding: 数据的编码类型。如 Content-Encoding: gzip
Server: 服务器的名称。如 Server:thin 1.5.0 codename Knife
Location: 通知客户端新的资源位置。如 Location: http://www.github.com/login
Content-Type: 响应数据的类型。如 Content-Type:text/html; charset=UTF-8
Content-Encoding: 响应数据的编码格式。如 gzip。客户端会根据该值对响应内容解码。
消息主体
消息主体是请求消息的承载数据。比如在提交POST表单,并且表单方法不是GET时,表单数据就是打包在消息主体内的。消息主体是可选的。
参考资料
- HTTP协议详解
- HTTP协议全览
- HTTP协议介绍(分析tinyhttpd【上】)
- HTTP协议介绍(分析tinyhttpd【下】)
- TinyHTTPd--超轻量型Http Server源码分析
- TinyHttpd----超轻量型Http Server源码分析
- HTTP协议与REST基础介绍(上)
- 源码分析之tinyhttpd(一)
- Tinyhttpd轻量型Http Server
- HTTP协议(一):介绍
- HTTP协议(1)入门-协议介绍
- 【http协议】协议介绍
- HTTP协议学习(上)
- 【源代码分析】tinyhttpd学习
- Tinyhttpd源码分析
- tinyhttpd源码分析
- tinyhttpd源码分析
- HTTP协议分析(待)
- 从零开始学写HTTP服务器(七)muduo+tinyhttpd
- Android中Http+https协议的详细介绍(汇总上)
- Private感染扫描工具
- 1800万知乎用户的爬取
- 可变参数列表,stdarg
- dbcp连接池简单封装
- golang设计模式(5)原型模式
- HTTP协议介绍(分析tinyhttpd【上】)
- 函数指针
- 判断回文问题
- jdbc:mysql连接字符串
- Ansible部署TiDB集群
- html 布局方式
- 认识Linux和安装 centos7
- [CF]_[心得]_[870B]
- 判断等式进制问题