HTTP协议基础及实现简单的HTTP

HTTP协议基础


一、概念

在前面的文章,我们知道TCP/IP四层模型中,下三层是主要负责数据的传输处理,但是没有涉及到解析,关于解析主要由应用层来处理。
HTTP协议是应用层协议,是一个属于应用层的面向对象的协议,由于其间接,快速的方式,适用于分布式超媒体信息系统.

HTTP协议的主要特点

1、支持客户、服务器模式。
2、简单快速。
客户面向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:GET,HEAD,POST。在下文有介绍。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快。
3、灵活。
HTTP允许传输任意类型的数据对象,正在传输的类型需要加上Content-Type加以标记 。
4、无连接。
无连接的含义是每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,及立即断开链接。采用这种方式可以节约很多时间。
5、无状态。
HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,缺少状态以为如果后序处理前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。

二、认识URL

1、URL就是我们俗称的网址。

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
URL的一般语法格式为:
(带方括号[]的为可选项)
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
注:protocol(协议)、hostname(主机名)、port(端口号)、path(路径)、parameters(参数)、query(查询)、fragment(信息片断)
eg:
这里写图片描述

2、urlencode和urldecode

像 / ? : 等这样的字符, 已经被url当做特殊意义理解了。因此这些字符不能随意出现。
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式 。
比如:
这里写图片描述
urldecode就是urlencode的逆过程。

三、HTTP协议之请求

http请求由四部分组成:
请求行,消息报头,空行,请求正文

1、请求行

首行: [方法] + [url] + [版本]
如:
Method Request-URI HTPP-Version CRLF
其中:
Method 表示请求方法;
Reques-URI(我们可以把这个整体看成URL)是一个同一资源定位符;
HTTP-Version表示请求的HTTP协议版本;
CRLF表示回车和换行。
HTTP有很多请求方法,最常用的是GET方法和POST方法,但我们有必要了解一下其它的方法:
这里写图片描述 
我们可以这样理解:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

2、Header:

请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔

3、空行

遇到空行表示Header部分结束

4、Body

空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀一个 Content-Length属性来标识Body的长度。

四、HTTP协议之响应

HTTP响应也是四个部分组成:
分别是:状态行,消息报头,空行,响应正文.

1、状态行

首行: [版本号] + [状态码] + [状态码解释]
如:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,
HTTP-Version表示服务器HTTP版本信息;
Status-Code表示服务器发回响应状态代码;
Reason-Phrase表示状态代码的文本描述。
状态代码由三种数字组成,第一个数字定义了响应的类别,有五种可能取值:
这里写图片描述
了解一下常见的状态码:
200 OK //客户请求成功
400 Bad Request //客户端请求由语法错误,nunnery被服务器所理解
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable // 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

2、Header

Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤用\n分隔;

3、空行

遇到空行表示Header部分结束

4、Body:

空行后面的内容都是Body.
Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了⼀一个html页面, 那么html页面内容就是在 body中。

五、实现一个简单的HTTP服务器

我们可以实现一个最简单的HTTP服务器, 在网页上输出 “hello world”:
在以后会补充。

猜你喜欢

转载自blog.csdn.net/baidu_37964071/article/details/80286714
今日推荐