HTTP协议之HTTP消息(HTTP Message)

by:授客 QQ1033553122

1.   消息类型(Message Type)

HTTP messages包含从客户端到服务器的请求和服务器到客户端的响应

HTTP-message   = Request | Response;

Request和Response都采用通用消息格式来传输实体

两种类型都包含一起始行(start-line),0或更多个header域, 一暗示header域结束的空行,可能还有一个消息主体

generic-message = start-line

message-header

空行

[ message-body ]

1)起始行(start-line)

start-line= Request-Line | Status-Line

 

2)消息头(Message Headers

HTTP头(HTTP header), 包含通用头(general-header),请求头(request-header), 响应头(response-header)和实体头(entity-header)

消息头书写形式

message-header = field-name : [ field-value ]

header域名(field-name)大小写敏感

通用头域(General Header Fields

通用头域为请求和响应消息都可使用,传输实体不能使用的头域

general-header = Cache-Control

| Connection

| Date

| Pragma

| Trailer

| Transfer-Encoding

| Upgrade

| Via

| Warning

不被识别的头域被视为实体头域

3)消息主体(Message Body)

消息主体(如果有的话)用于运送与请求或响应相关的实体主体(entity-body)

格式

message-body = entity-body

|

也就是说,仅在通过传输编码对进行编码后的实体主体才与消息主体不同,否则消息主体和实体主体是相同的。

4)消息长度(Message Length)

消息长度指的是消息主体的长度;

 

2.  

请求
(Request)

1)格式

Request = Request-Line

general-header | request-header | entity-header

空行

[ message-body ]

如图,访问http://ishouke.sohu.blog.com网址,发送的请求

2)请求行(Request-Line)

Request-Line   =
Method Request-URI HTTP-Version

说明:

1)  Method

Method  = OPTION | GET | HEAD|
POST | PUT | DELETE | TRACE |CONNECT

OPTION--请求一些选项的信息

GET--请求由Request-URI所标识的信息

HEADE--请求读取由URL所标识的信息的首部

POST--给服务器添加信息(例如,注释)

PUT--在指明的URI下存储一个文档

DELETE--删除指明的URL所标志的资源

TRACE--用来进行回环测试的请求报文

CONNECT--用于代理服务器

(方法的说明待补充)

3)Request-URI

统一资源标识符(Uniform Resource
Identifier),标识了方法所请求的资源。

Request-URI = "*" | absoluteURI |
abs_path | authority

*:代表不是请求特定资源,而是请求服务器本身,仅当method不是应用于资源时才可用.例如

OPTIONS * HTTP/1.1

说明:

absoluteURI:当向代理服务器发起请求时,必须使用绝对URI(absoluteURI)。代理服务器转发请求或通过有效缓存读取并返回响应。注意,代理服务器可能会把请求转发给另一个代理服务器或直接转发给由绝对URI指定的服务器。

为了避免循环请求,代理必须能识别所有服务器名字,包扩任意别名,本地变量和ip地址

请求行(Request-Line)的另一个例子:

GET http://www.w3.org/pub/WWW/TheProject.html
HTTP/1.1

abs_path:绝对路径

authority:仅用于CONNECT方法

Request-URI最常见的形式为用于标识一个在原始服务器或网关上的资源.在这种情况下,Request-URI必须使用绝对URI,并且URI的网络地址必须包含在HOST header域中被发送

例如,客户端想直接从原始服务器接收上述资源TheProject.html,将创建一个通往主机“www.w3.org”的80端口的TCP连接,并发送以下请求行

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

行后接请求的剩余部分。

注意:绝对路径不能为空,如果URI中啥都没给,必须以“/”(服务器根目录)的形式给出。

代理服务器在转发请求时,不能重写从Request-URI中接收的绝对路径“abs_path”

4)请求头域(Request Header
Fields)

Request Header Fields允许客户端传递额外关于请求和客户端自身的信息给服务器

request-header = Accept

| Accept-Charset

| Accept-Encoding

| Accept-Language

| Authorization

| Expect

| From

|
Host

| If-Match

| If-Modified-Since

| If-None-Match

| If-Range

| If-Unmodified-Since

| Max-Forwards

| Proxy-Authorization

| Range

| Referer

| TE

| User-Agent

 

3.  

响应
(Response)

1)格式

Response= Status-Line

general-header |
response-header  |
entity-header

空行

[ message-body ]

如图,访问http://ishouke.sohu.blog.com网址,发送请求后接收到的响应

2)状态行(Status-Line)

Status-Line = HTTP-Version
Status-Code Reason-Phrase

说明:

1)Status-Code和Reason-Phrase

Status-Code:3个数字的整数

Reason-Phrase:对Status-Code简短的文本描述

Status-Code的第一个数字定义了响应的类型:

1xx:
通知信息的 -
请求收到,继续处理

2xx:
成功-
操作被成功,理解和接受

3xx:
重定向 -
为了完成请求采取进一步的操作

4xx:
客户端错误-
请求包含无法实现或者包含语法错误

5xx:
服务器错误 -
服务器无法完成合法的请求

Status-Code   
=

"100"  ;
Continue

| "101"  ;
Switching Protocols

| "200"  ;
OK

| "201"  ;
Created

| "202"  ;
Accepted

| "203"  ;
Non-Authoritative Information

| "204"  ;
No Content

| "205"  ;
Reset Content

| "206"  ;
Partial Content

| "300"  ;
Multiple Choices

| "301"  ;
Moved Permanently

| "302"  ;
Found

| "303"  ;
See Other

| "304"  ;
Not Modified

| "305"  ;
Use Proxy

| "307"  ;
Temporary Redirect

| "400"  ;
Bad Request

| "401"  ;
Unauthorized

| "402"  ;
Payment Required

| "403"  ;
Forbidden

| "404"  ;
Not Found

| "405"  ;
Method Not Allowed

| "406"  ;
Not Acceptable

| "407"  ;
Proxy Authentication Required

| "408"  ;
Request Time-out

| "409"  ;
Conflict

| "410"  ;
Gone

| "411"  ;
Length Required

| "412"  ;
Precondition Failed

| "413"  ;
Request Entity Too Large

| "414"  ;
Request-URI Too Large

| "415"  ;
Unsupported Media Type

| "416"  ;
Requested range not satisfiable

| "417"  ;
Expectation Failed

| "500"  ;
Internal Server Error

| "501"  ;
Not Implemented

| "502"  ;
Bad Gateway

| "503"  ;
Service Unavailable

| "504"  ;
Gateway Time-out

| "505"  ;
HTTP Version not supported

| extension-code

extension-code = 3DIGIT

Reason-Phrase  = *

3)响应头域(Response Header
Fields

response-header
fields允许服务器传递不能放在状态行(Status-Line)的关于响应的额外信息.这些头域给出了关于服务器和更多关于进一步获得由Request-URI标识的资源

response-header =
Accept-Ranges

| Age

| ETag

| Location

| Proxy-Authenticate

| Retry-After

| Server

| Vary

| WWW-Authenticate

无法识别的header域可以视为entity-header域

4.  

实体
(Entity)

Request和Response消息如果没有被请求方法或请求状态码限制,可传送一个实体

实体有实体头域(entity-header
fields)和实体主体(entity-body),虽然有些response仅包含实体头域entity-header

1)实体头域(Entity Header
Fields

实体头域定义了关于实体主体的维护信息,或者是关于请求标识的资源,如果没有主体的话.一些维护信息是可选的,一些是必须的.

entity-header  = Allow

| Content-Encoding

| Content-Language

| Content-Length

| Content-Location

| Content-MD5

|
Content-Range

| Content-Type

| Expires

| Last-Modified

2)实体主体(Entity Body)

伴随request或response发送的entity-body(如果有的话)

entity-body仅在消息主体出现时才出现。

网络基础 HTTP协议之HTTP消息(HTTP Message)的更多相关文章

  1. 软件定义网络基础---NETCONF协议

    netconf协议最早被作为网管协议被提出来的,与SNMP网管协议相比较:SNMP的优势在于网络设备的监测,在大规模网管应用中有很大不足,正是针对这种不足之处,提出了NETCONF协议 一:NETCO ...

  2. 网络基础 HTTP协议之http url简介

    HTTP协议之http url简介 by:授客 QQ:1033553122 http url简介 http url通过http协议,用于定位网络资源,是一种特殊类型的URI(统一资源定位) http_ ...

  3. 软件定义网络基础---OpenFlow协议

    一:OpenFlow协议概述 OpenFlow协议为控制器与交换机之间的通信,提供了一种开放标准的方式.OpenFlow交换机通过安全通道与控制器进行信息交互 二:OpenFlow消息类型 (一)co ...

  4. 软件定义网络基础---OF-Config协议

    交换机与控制器继续通信前,是需要对其功能.特性以及资源进行配置才能进行工作,这些配置是如何实现的?是由专门的配置协议指导完成的 一:OF-Config协议 是OpenFlow交换机管理配置协议,是Op ...

  5. 网络基础 HTTP协议之缓存简介

    HTTP协议之缓存简介 by:授客 QQ:1033553122 用浏览器查看缓存 IE为例,Tools->Internet options -> View files,如图 点击图示的Vi ...

  6. 三分钟网络基础-ARP协议

    什么是 ARP 协议 地址解析协议 ARP (Address Resolution Protocal):在同一局域网下,根据已知道的主机或路由器的 IP 地址,找出其相应的硬件地址. 高速缓存 每一个 ...

  7. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  8. 网络编程基础:网络基础之网络协议、socket模块

    操作系统(简称OS)基础: 应用软件不能直接操作硬件,能直接操作硬件的只有操作系统:所以,应用软件可以通过操作系统来间接操作硬件 网络基础之网络协议: 网络通讯原理: 连接两台计算机之间的Intern ...

  9. 【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇

    一.前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工作来说这些并不是重点,因此,我不可能从最基础的网络知识开始讲起.本节内容更多是从一个梳理和 ...

随机推荐

  1. .NET平台常用框架

    分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的K ...

  2. Android学习总结——输入法将BottomNavigationBar(底部导航栏)顶上去的问题

    在应用清单中给当前<Activity>设置: android:windowSoftInputMode="adjustPan" 关于android:windowSoftI ...

  3. Mac终端配置,DIY你的Terminal (iTerm 2 + Oh My Zsh)

    使用mac osx一年以来,自带的Terminal终端一直都是白底黑字,食之无味,越来越缺乏新鲜感,怎么也得想个法子来刺激下眼球. 不然花那么多大洋买你回来是要哪般,难道真是为来学习工作??? 怎么可 ...

  4. 解决Maven工程install时[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources

    一.背景 最近的项目在用maven 进行install的时候,发现老师在控制台输出警告:[WARNING] Using platform encoding (UTF-8 actually) to co ...

  5. Hibernate的集合一对多与多对一

    需求:   部门与员工 一个部门有多个员工;       [一对多] 多个员工,属于一个部门    [多对一] 1.javaBean ——Dept.java package com.gqx.oneto ...

  6. JDBC中链接数据库前为什么要用Class.forName(驱动类)加载驱动类?

    使用JDBC链接数据库时,为什么要先使用Class.forName(String name)来加载类? 答: 实际上就是为了加载类时,调用静态初始化块中的注册函数. 可以看一下MySql的Driber ...

  7. 【K8S学习笔记】Part1:使用端口转发访问集群内的应用

    本文介绍如何使用kubectl port-forward命令连接K8S集群中运行的Redis服务.这种连接方式有助于数据库的调试工作. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同 ...

  8. Java-Maven(八):配置远程中央仓库的各种方法

    一.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求,可能项目需要的某些构件中央仓库中是没有的,而在其他 ...

  9. CPU简单科普

    CPU简单科普 本文仅限于对小白科普. 误解一:CPU使用率和硬盘使用率一样. 误解二:一台电脑只有一个CPU. 误解三:CPU的核数,就是CPU的数量. 误解三:CPU主频越高越厉害:CPU核数越多 ...

  10. ASP.NET MVC显示异常信息

    开发ASP.NET多了,它的异常信息显示也习惯了.但在ASP.NET MVC中,却是另外一番情形. 以前只习惯使用IE浏览器,现在开发ASP.NET MVC程序,为了捕获到异常信息,Firefox的f ...