http协议解析
1 http的操作过程
http协议定义了浏览器怎么想万维网请求万维网文档,以及服务器怎么把文档传给浏览器。从层次角度看HTTP是面向事务的应用层协议,它是万维网可以可靠地交换文件的重要基础(不仅传输跳转所必须的信息,也传送任何可以从互联网上得到的信息,如文本、超文本、声音、图片)。
工作过程如下:
(1)浏览器发送请求,建立tcp连接(双向)
(2)浏览器发送HTTP请求报文
(3)服务器返回HTTP响应报文
(4)释放tcp连接(双向)
每个web网点都有一个服务进程,不断监听TCP的80端口,以便发现是否有浏览器向它发送连接请求。一旦监听到请求,并建立了TCP连接之后,浏览器就向web服务器发送某个页面请求,服务器接着返回响应。最后tcp释放。请求和响应必须按照HTTP规则进行定义,这就是HTTP协议。
HTTP之间的交互都是通过一个ASCII串组成,HTTP使用了面向连接的TCP为运输层协议,保证数据可靠性,HTTP不必考虑数据在传输过程中被丢弃之后怎么重传。但是HTTP本身是无连接的,虽然使用tcp连接,但是在通信双方交换HTTP报文之前不需要建立HTTP连接。HTTP是无状态的,就是说同一客户第二次访问同一个服务器页面时,服务器的响应与第一次被访问时的相同。
HTTP的持续连接方式:非流水线和流水线
流水线方式特点,客户在收到http的响应报文之前就能够接着发送新的报文请求。于是服务器也可以连续发回响应报文。
2、HTTP报文结构
http有两种报文,请求报文和响应报文
HTTP请求报文主要由请求行、请求头部、请求正文3部分组成
2.1 请求行
由3部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔
请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
2.2 请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔
常见请求头如下:
请求头 |
说明 |
Host |
接受请求的服务器地址,可以是IP:端口号,也可以是域名 |
User-Agent |
发送请求的应用程序名称 |
Connection |
指定与连接相关的属性,如Connection:Keep-Alive |
Accept-Charset |
通知服务端可以发送的编码格式 |
Accept-Encoding |
通知服务端可以发送的数据压缩格式 |
Accept-Language |
通知服务端可以发送的语言 |
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少
2.3 请求正文
可选部分,比如GET请求就没有请求正文
GET请求示例:
POST请求示例:
HTTP响应报文格式:
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成
2.4 状态行
由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔
状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)
这里列举几个常见的:
状态码 |
说明 |
200 |
响应成功 |
302 |
跳转,跳转地址通过响应头中的Location属性指定(JSP中Forward和Redirect之间的区别) |
400 |
客户端请求有语法错误,不能被服务器识别 |
403 |
服务器接收到请求,但是拒绝提供服务(认证失败) |
404 |
请求资源不存在 |
500 |
服务器内部错误 |
2.5 响应头部
与请求头部类似,为响应报文添加了一些附加信息
常见响应头部如下:
响应头 |
说明 |
Server |
服务器应用程序软件的名称和版本 |
Content-Type |
响应正文的类型(是图片还是二进制字符串) |
Content-Length |
响应正文长度 |
Content-Charset |
响应正文使用的编码 |
Content-Encoding |
响应正文使用的数据压缩格式 |
Content-Language |
响应正文使用的语言 |
响应示例:
2.6 URI、URL和URN之间的区别
http://www.tsinghua.edu.cn/publish/newthu/newthu_cnt/faculties/index.html
其中主机域名为:http://www.tsinghua.edu.cn 路径名为:publish/newthu/newthu_cnt/faculties/index.html
默认端口是80。
URL的组成为<协议>://<主机>:<端口>、<路径>
URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成
URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源
URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化
HTTP规范将更通用的概念URI作为其资源标识符,但是实际上,HTTP应用程序处理的只是URI的URL子集
参考:https://blog.csdn.net/a19881029/article/details/14002273