Http(超文本传输协议)是一个属于应用层的面向对象的协议。
-
HTTP结构
- HTTP请求:
- 请求行:Method-Request URI HTTP-Version(CRLF),eg:GET /form.html HTTP/1.1(CRLF);
- 请求报头
- 请求正文
- HTTP响应
- 状态行:HTTP-Version Status-Code Reason-Phrase(CRLF),eg: HTTP/1.1 200 OK(CRLF);
- 响应报头
- 响应正文
- 其中,报头(可选)由若干个报头域组成,每个报头域格式:“Name: Value(CRLF)”。
- HTTP请求:
主要特点:
(1)支持客户/服务器模式。
(2)简单快速: 客户向服务器请求服务时, 只需传送请求方法和路径。 请求方法常用的有GET、 HEAD、POST。 每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单, 使得HTTP服务器的程序规模小,因而通信速度很快。
(3)灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(4)无连接: 无连接的含义是限制每次连接只处理一个请求。 服务器处理完客户的请求, 并收到客户的
应答后,即断开连接。采用这种方式可以节省传输时间。
(5)无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面, 在服务器不需要先前信息时它的应答就较快
缺点
(1)通信使用明文(不加密),内容可能会被窃听
(2)不验证通信方的身份,因此有可能遭遇伪装
(3)无法证明报文的完整性,所以有可能已遭篡改
Https=Http+加密+认证+完整性保护
请求方法
GET 请求获取Request-URI 所标识的资源
POST 在Request-URI 所标识的资源后附加新的数据
HEAD 请求获取由Request-URI 所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI 作为其标识
DELETE 请求服务器删除Request-URI 所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS 请求查询服务器的性能
CONNECT 保留将来使用
状态代码
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误
5xx:服务器端错误
常见代码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在, eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
-
HTTP的长连接与短连接
- 本质上是TCP的长连接与短连接
HTTP/1.0默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
- HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入报头域:Connection:keep-alive。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
- 短连接
- 优点:管理简单,存在的连接都是有用的连接,不需要额外的控制手段;
- 缺点:如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
- 长连接
- 优点:省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
- 缺点:Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候
- 可采取的策略:(1)关闭长时间没有读写事件的连接;(2)限制每个客户端的最大长连接数。
-
CGI(Common Gateway Interface)通用网关接口
- 作用:服务动态内容。执行动态内容,将其返回值送回客户端。
- 判断是否动态内容:服务器常常将所有动态内容放在一个固定的文件夹下,通过判断URI的路径来识别是否需要服务动态内容。
- CGI的输入输出
- 服务器子线程通过环境变量将请求参数传送给CGI程序
- 通过将stdin和stdout重定向至已连接描述符实现CGI对客户端的直接通信。
-
HTTP1.1与HTTP1.0区别
- 默认长连接;
- 新增24个状态响应码,HTTP1.0只有16个;
- 可拓展性:如果HTTP的某个实现接收到了自身未定义的头域,将自动忽略它;
- 带宽优化。