HTTP服务器用途
- 用于Web服务器访问网站
- 上传,下载
- 注册,登录,数据请求交互操作
- 服务器GM封号,限制登录,发放道具,后台充值
- 其他企业级应用的数据获取
HTTP工作原理
HTTP协议采用请求/响应模型——客户端向服务器发送请求报文,服务器以一个状态作为响应。
客户端和服务器进行一次交互的过程主要可以拆解为一下5步:
- 客户端连接到HTTP服务器:Http客户端与Web服务器建立一个TCP连接
- 客户端向服务器发起HTTP请求:客户端通过已建立的TCP连接向服务器发送一个请求报文
- 服务器受到HTTP请求,并返回Http响应:服务器解析请求,定位请求资源,服务器将资源副本写道TCP连接,由客户端进行读取
- 释放TCP连接:若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keep-alive,则该连接会保持一段时间,在该时间内可以继续接收请求
- 客户端浏览器解析html内容:客户端将服务器响应的信息进行解析
URL
何为URL?URL全拼Uniform Resource Locator,即统一资源定位符,我们俗称的网址一般就是指它。
组成:
- 传送协议、层级URL标记符号(“//”)
- 传送资源需要的凭证信息(可省略)
- 服务器(通常为域名,有时为IP地址)
- 端口号(以数字方式表示,若为Http的默认值“:80”可省略)
- 路径(以“/”区分路径中的各级目录)
- 查询(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突)
在浏览器内键入某个URL,其内部一般具体会有以下的流程:
- 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
- 之后,根据IP地址和默认端口80,和服务器建立TCP连接
- 浏览器发送出读取文件的Http请求
- 服务器对浏览器请求做出响应,将对应的请求数据发送给浏览器
- 释放TCP连接
- 浏览器将对应数据进行显示
报文
请求报文
请求报文的结构:
请求行(requestline)
- 请求方法
GET
方法主要用于查询和下载,参数直接显示在地址栏中,不适合传递私密数据,也不适合传递大量数据;
POST
方法常用于游戏行业,将数据封装在请求数据中,对数据量没有限制,不会显示在地址栏中;
PUT
方法主要用于上传,将资源存放到指定位置,与POST
的区别主要体现在是否指定存放位置(POST
是服务器自己决定位置);
HEAD
DELETE
OPTIONS
TRACE
CONNECT
- 请求URL(不包括域名)
- HTTP协议版本
POST /user HTTP/1.1 \r\n
请求头部(header)
请求头部由关键字/值对组成,每行一对。
HOST: 127.0.0.1:8080 \r\n
User-Agent: Mozilla/5.0 \r\n
Accept: text/xml, application/xml, text/html \r\n
Accept-Language: zh-cn,zh;q=0.5 \r\n
Accept-Encoding: gzip,deflate \r\n
Accept-Charset: gb2312,urf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded;charset=:UTF-8 \r\n
Content-Length: 12
Connection: keep-alive/close
Keep-Alive: 300
- 客户端告诉服务器,其想要访问的主机名;
- HTTP客户端运行的浏览器类型的详细信息;
- 客户端希望接收的数据类型;
- 指定HTTP客户端浏览器用来展示返回信息所优先选择的语言;
- 浏览器能够进行解码的数据编码方式;
- 请求头用来告诉服务器客户端所能够处理的字符集类型;
- 显示此HTTP请求提交的内容类型;
- 表示请求消息正文的长度;
- 表示是否需要持久连接;
- 显示此HTTP连接的Keep-Alive时间;
空行
请求头之后是一个空行,通知服务器以下不再有其他的请求头的内容。
\r\n
请求体
待发送的数据。
GET
没有请求数据,POST
有。相关的请求头内容有Content-Type
和Content-Length
。
name=world
请求报文的实体举例:
响应报文
响应报文的结构:
状态行
HTTP/1.1 200 OK
- 服务器HTTP协议版本
- 响应状态码
由3位数字组成,第一个数字定义了响应的类别:
1xx消息——表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程;
2xx成功——表示成功接收请求并已完成整个处理过程,常用200;
3xx重定向——需要后续操作才能完成这一请求;
4xx请求错误——客户端的请求有错误,常用404,403;
5xx服务器错误——服务端出现错误,常用500;
- 状态码的文本描述
取值举例:
200 OK:表示客户端请求成功;
400 Bad Request:表示客户端请求有语法错误,不能被服务器理解;
401 Unauthorized:表示请求未经授权;
403 Forbidden
404 Not Found
响应头部
用于描述服务器的基本信息以及数据的描述,服务器通过返回这些数据的描述信息,可以通知客户端如何处理它返回的信息。
- Allow:服务器支持哪些请求方法
- Content-Encoding:文档的编码方式
- Content-Length:内容长度
- Content-Type:后续文档属于什么类型
- Date:当前的GMT时间
- Expires:告知浏览器把回送的资源缓存多长的时间,-1或0表示不缓存
- Last-Modified:文档的最后改动时间
- Location:配合302状态码使用,用于重定向接收者到一个新的URL地址
- Refresh:告诉浏览器隔多久刷新一次,以秒计
- Server:服务器通过这个头告诉浏览器服务器的类型
- Set-Cookie:设置和页面关联的Cookie
- Transfer-Encoding:数据的传送格式
- WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息
空行
通过客户端以下不再有其他的响应头
响应体
响应的消息体。
响应报文的实体举例: