HTTP协议学习

基础概念

什么是HTTP?

HTTP协议是超文本传输协议(Hyper Text Transfer Protocol)的缩写,是一种用于分布式、协作式和超媒体信息系统的应用层(Application Layer)协议,是万维网的数据通信基础.最初HTTP是为了提供一种发布和接受HTML页面的方法.

HTTP的特点

  1. HTTP是无状态的(stateless): 服务器对客户端的访问没有任何记录,因此当客户端第二次访问访问服务器的同一个页面时,服务器的响应和第一次访问是一样的. HTTP的无状态特性使服务器更容易支持大量并发的HTTP请求.
  2. HTTP是无连接的: 每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间.
  3. 支持Client/Server模式.
  4. 灵活: HTTP允许传输任意类型的数据,使用Content-Type标记传输的数据类型即可.
  5. 简单快速: 客户端向服务器请求数据时, 只需要传送请求方法和路径.

HTTP URL

HTTP URL 用来标识可以通过HTTP进行访问的网络资源. HTTP URL使用如下格式(参考RFC1738):

// HTTP URL格式
http://:/?
// HTTP URL 例子
http://www.tinyscope.com:8080/repes/index.asp?user=zhang&pwd=123
  • 协议部分: http 是 HTTP URL的协议部分.用来标记这是一个使用HTTP协议的URL.
  • 主机地址(host): 网络主机的完全限定名(域名)/网络主机的IP地址,比如: www.tinyscope.com192.168.1.1.
  • 端口(port): 请求服务器的端口, 如果省略则默认是 80 端口.
  • 资源路径(path): repes/index.asp代表访问的资源在服务器上的路径.
  • 参数/搜索部分(searchpart): user=zhang&pwd=123 传递给服务端的一些查询条件.

HTTP 工作原理

  • 客户端与服务器建立连接, HTTP是在传输层使用的可靠TCP连接, 因此在发送HTTP请求前需要先建立TCP连接.
  • 客户端发送HTTP请求给服务器
  • 服务器发送HTTP响应给客户端.
  • 客户端和服务器断开连接(TCP连接).

HTTP报文格式

HTTP请求报文

HTTP 的请求报文主要由请求行请求头部请求体组成格式如下

HTTP协议学习_第1张图片

  1. 请求行: HTTP请求行由 方法名、URL中的path部分和HTTP协议的版本组成三部分中金使用空格隔开,最后是一个回车换行.
    1. Method: GET、POST、DELETE、HEAD、PUT等.
    2. Path: 资源在服务器的路径.
    3. 协议版本: HTTP/主版本号.次版本号, 比如: HTTP/1.0和HTTP/1.1 等.
  2. 请求头(Headers): HTTP所支持的头部字段组成的键值对.会在后面进行详细介绍.
  3. 请求体(Body) : 可选部分, 请求携带的数据,比如GET没有这部分, POST上传上传数据时就有.

示例数据

GET /users HTTP/1.1
Host: www.tinyscop.com
Content-Type: text/plain
Content-Length: 5

12345

对应的解释如下
HTTP协议学习_第2张图片

HTTP响应报文

HTTP响应报文主要由状态行、响应头和响应数据组成
HTTP协议学习_第3张图片

  1. 状态行: http协议版本、状态码和状态信息组成, 使用空格隔开
    1. 协议版本: 和请求中的一样
    2. 状态码: HTTP响应状态码,下面会详细介绍
    3. 状态信息: 对响应状态码的进一步描述信息.
  2. 响应头: 增加一些HTTP头部字段, 比如Content-Type、Accept等.
  3. 响应体: 服务器返回的数据.

示例数据

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 5

12345

HTTP 请求方法

  • GET: 用于获取服务器资源, 对服务器数据不进行修改 请求体没有Body.如果有参数则拼接在URL中
    GET /users/1 HTTP/1.1
    Host: www.baidu.com
    
  • POST: 向指定资源提交数据,请求服务器进行处理, 用于增加/修改服务器资源, 发送的数据在Body中.
    POST /users HTTP/1.1
    Host: www.baidu.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 16
    
    name=wsj&pwd=123
    
  • HEAD: 与GET方法一样,都是向服务器发出指定资源的请求.只不过服务器将不传回资源的本文部分.它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息"(元信息或称元数据). 和GET的却别就是不返回Body.
  • PUT: 向指定资源位置上传其最新内容.也就是修改资源, 发送给服务器的数据放在Body中.
  • DELETE: 删除服务器资源, 不发送Body.

HTTP 头部字段(Headers)

协议头的字段,是在HTTP请求行/响应行之后传输的. 协议头的字段是以明文的键值对字符串格式传输的.并以回车(CR)加换行(LF)符号序列结尾.

  1. Host: 服务器的域名以及服务器监听的端口, 如果没有写端口则使用协议默认端口,HTTP的默认端口是80.
  2. Content-Type: 指定Body数据类型
    1. application/x-www-form-urlencoded: 数据被编码成以 ‘&’ 分隔的键-值对, 同时以 ‘=’ 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因(应使用 multipart/form-data 代替).
    2. multipart/form-data: HTTP POST上传文件.
    3. text/html: 将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理.
    4. text/plain : 将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理.
    5. application/json: body 是json 字符串的格式.
  3. Accept: 客户端能接受的数据类型。如 text/html
  4. Accept-Charset: 客户端接受的字符集。如 utf-8
  5. Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
  6. Content-Encoding:压缩类型。如 gzip
  7. Content-Length: 指定Body的长度单位字节.
  8. Transfer-Encoding: chunked : 分块传输, 此时Body会分成多个块来传输.
  9. Location : 重定向后的URL地址.
  10. User-Agent: 用户代理, 也就是客户端程序.
  11. Range/Accept-Range : 获取指定范围的数据. 可以实现断点续传.多线程下载等.
    1. Accept-Range: bytes 响应报⽂中出现,表示服务器⽀持按字节来取范围数据
    2. Range: bytes=- 请求报⽂中出现,表示要取哪段数据
    3. Content-Range:-/total 响应报⽂中出现,表示发送的是哪段数据

HTTP 状态码(Status Code)

HTTP状态码是用以表示HTTP响应状态的3位数字代码, 有五种打的状态分类, 状态码的第一个数字代表五种状态之一.

  1. 1xx消息: 请求已被服务器接收,继续处理.
    1. 101 : 切换协议.比如切换HTTP版本.
  2. 2xx成功: 代表请求已成功被服务器接收、理解、并接受.
    1. 200 : 客户端请求成功.
  3. 3xx重定向: 需要客户端采取进一步的操作才能完成请求.通常,这些状态码用来重定向,后续的请求地址在本次响应的Location域中指明.
    1. 301: 永久移动.
    2. 302: 暂时移动.
    3. 303: 暂时移动.
    4. 304: 内容未改变.
  4. 4xx客户端错误: 说明客户端发送的请求有问题, 比如参数不合法等.
    1. 400 : Bad Request 客户端请求有语法错误,不能被服务器所理解
    2. 401 : Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    3. 403 : Forbidden 服务器收到请求,但是拒绝提供服务
    4. 404 : Not Found 请求资源不存在,eg:输入了错误的URL
  5. 5xx服务器错误: 服务端发生错误.
    1. 500 : Internal Server Error 服务器发生不可预期的错误
    2. 503 : Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

参考

  • RFC1738-URL
  • RUL的#
  • URL的组成
  • 如何理解HTTP协议的 “无连接,无状态” 特点?
  • 关于HTTP协议,一篇就够了
  • HTTP状态码
  • HTTP状态码-wikipedia
  • 超文本传输协议-wikipedia
  • HTTP头字段-wikipedia

你可能感兴趣的:(Java---基础学习)