http 使用面向连接的 TCP 作为传输层协议. http 本身无连接.
请求报文
CRLF 是回车换行
方法为 GET 的请求报文
方法为 POST 的请求报文
方法
OPTIONS: 这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法. 用'*'来代替资源名称, 向 web 服务器发送 OPTIONS 请求, 可以测试服务器功能是否正常运作.
HEAD: 与 GET 方法一样, 都是向服务器发出指定资源的请求. 只不过服务器将不传回资源的本文部分. 它的好处在于, 使用这个方法可以在不必传输全部内容的情况下, 就可以获取其中 "关于该资源的信息"(元信息或称元数据).
GET: 向指定的资源发出 "显示" 请求. 使用 GET 方法应该只用在读取数据, 而不应当被用于产生 "副作用" 的操作中, 例如在 Web Application 中. 其中一个原因是 GET 可能会被网络蜘蛛等随意访问. 参见安全方法
POST: 向指定资源提交数据, 请求服务器进行处理(例如提交表单或者上传文件). 数据被包含在请求本文中. 这个请求可能会创建新的资源或修改现有资源, 或二者皆有.
PUT: 向指定资源位置上传其最新内容.
DELETE: 请求服务器删除 Request-URI 所标识的资源.
TRACE: 回显服务器收到的请求, 主要用于测试或诊断.
CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器. 通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器).
虽然 HTTP 的请求方式有 8 种, 但是我们在实际应用中常用的也就是 get 和 post, 其他请求方式也都可以通过这两种方式间接的来实现.
URL
URL 一般的组成成分是<协议>://<主机>:<端口号>/<路径>
协议
http-- 超文本传输协议资源
https-- 用安全套接字层传送的超文本传输协议
ftp-- 文件传输协议
mailto-- 电子邮件地址
ldap-- 轻型目录访问协议搜索
file-- 当地电脑或网上分享的文件
news--Usenet 新闻组
gopher--Gopher 协议
telnet--Telnet 协议
主机 - 是指在因特网上的域名
端口有时可省略
路径
绝对 URL(absolute URL)显示文件的完整路径, 这意味着绝对 URL 本身所在的位置与被引用的实际文件的位置无关.
相对 URL(relative URL)以包含 URL 本身的文件夹的位置为参考点, 描述目标文件夹的位置.
如果路径省略 URL 就指到因特网上的某个主页.
第一个 URL 省略了路径, 代表百度知道的主页.
第二个是文件 1742817.html 的相对路径, 指出了他的位置.
它们都使用 https 协议. 端口号省略了.
版本号
以前使用的协议是 HTTP/1.0 , 现在升级为 HTTP/1.1. 两个的区别是什么?
请求一个万维网文档需要的时间是 2*RTT + 文档传输时间. 因为要和服务器建立 TCP 连接需要 3 次握手, 在第三次握手的时候捎带了发送请求相关的数据, 然后 HTTP 服务器响应报文总共是四次交互, 也就是 2*RTT 时间. 再加上一些其他的开销, 万维网服务器要服务大量的客户, 所以每次浏览都需要建立连接, HTTP/1.0 中这种非持续连接 (短链接) 服务器负担很重. HTTP/1.1 使用了持续连接(长链接), 服务器在发送响应后仍然保持这条连接.
持续链接还分为流水线方式和非流水线方式. 非流水线方式规定客户发送浏览请求得到响应后才能发送下一个. 流水线方式客户不用等到响应就可以发送下一个请求, 服务器收到请求后就可以连续响应, 不用等待, 节省了时间.
HTTP 1.1 的持续连接, 也需要增加新的请求头来帮助实现.
例如, Connection 请求头的值为 Keep-Alive 时, 客户端通知服务器返回本次请求结果后保持连接; Connection 请求头的值为 close 时, 客户端通知服务器返回本次请求结果后关闭连接.
HTTP 1.1 还提供了与身份认证, 状态管理和 Cache 缓存等机制相关的请求头和响应头.
HTTP 报首部字段
从上面看 HTTP 一共有四种类型的首部字段通用首部字段, 请求首部字段, 响应首部字段, 实体首部字段.
通用首部字段: 请求报文和响应报文两方都会使用的首部.
请求首部字段: 从客户端向服务器发送请求报文时使用的首部.
响应首部字段: 从服务器向客户端返回响应报文时使用的首部.
实体首部字段: 针对请求报文和响应报文的实体部分使用的首部.
HTTP/1.1 首部字段
通用首部字段
请求首部字段
响应首部字段
实体首部字段
http 操作过程
http 是面向事物的应用层协议. 每个万维网站点都有一个服务器进程, 不断监听 tcp 80 端口, 以便发现有浏览器向他发出连接请求, 一旦建立连接, 浏览器就向万维网服务器发出某个页面的浏览请求. 浏览器与服务器必须按照规定的格式和遵循一定的规则, 这些规则就是超文本传输协议 http.
用 HTTP/1.0 说明用户发出浏览请求 (在浏览器地址输入 URL 或者鼠标点击可选事件, 浏览器会自动找到所要连接的页面) 后的事件.
1. 浏览器分析 URL.
2. 向 DNS 请求解析域名的 IP 地址.
3. 得到 IP 地址.
3. 浏览器服务器建立 TCP 连接(IP 地址 + 端口号).
4. 发出取文件命令如上面 URL 中 GET /question/1742817.HTML
5. 服务器做出响应吧 1742817.HTML 发送给浏览器.
6. 释放 TCP 连接.
7. 浏览器显示 HTML 中的文本.
响应报文
状态码和短语
1xx: 指示信息 - 表示请求已接收, 继续处理.
2xx: 成功 - 表示请求已被成功接收, 理解, 接受.
3xx: 重定向 - 要完成请求必须进行更进一步的操作.
4xx: 客户端错误 - 请求有语法错误或请求无法实现.
5xx: 服务器端错误 - 服务器未能实现合法的请求.
常见状态代码, 状态描述的说明如下.
200 OK: 客户端请求成功.
400 Bad Request: 客户端请求有语法错误, 不能被服务器所理解.
401 Unauthorized: 请求未经授权, 这个状态代码必须和 WWW-Authenticate 报头域一起使用.
403 Forbidden: 服务器收到请求, 但是拒绝提供服务.
404 Not Found: 请求资源不存在, 举个例子: 输入了错误的 URL.
500 Internal Server Error: 服务器发生不可预期的错误.
503 Server Unavailable: 服务器当前不能处理客户端的请求, 一段时间后可能恢复正常, 举个例子: HTTP/1.1 200 OK(CRLF).
GET 方法和 POST 方法的区别
参考链接
1.GET 提交, 请求的数据会附在 URL 之后(就是把数据放置在 HTTP 协议头<request-line>中), 以? 分割 URL 和传输数据, 多个参数用 & 连接; 例如: login.action?name=hyddd&password=idontknow&verify=你 好. 如果数据是英文字母 / 数字, 原样发送, 如果是空格, 转换为 +, 如果是中文 / 其他字符, 则直接把字符串用 BASE64 加密, 得出如: 你好, 其中%XX 中的 XX 为该符号以 16 进制表示的 ASCII.
POST 提交: 把提交的数据放置在是 HTTP 包的包体<request-body>中. 上文示例中红色字体标明的就是实际的传输数据
因此, GET 提交的数据会在地址栏中显示出来, 而 POST 提交, 地址栏不会改变
2. 传输数据的大小:
首先声明, HTTP 协议没有对传输的数据大小进行限制, HTTP 协议规范也没有对 URL 长度进行限制. 而在实际开发中存在的限制主要有:
GET: 特定浏览器和服务器对 URL 长度有限制, 例如 IE 对 URL 长度的限制是 2083 字节(2K+35). 对于其他浏览器, 如 Netscape,Firefox 等, 理论上没有长度限制, 其限制取决于操作系统的支持.
因此对于 GET 提交时, 传输数据就会受到 URL 长度的限制.
POST: 由于不是通过 URL 传值, 理论上数据不受限. 但实际各个 Web 服务器会规定对 post 提交数据大小进行限制, Apache,IIS6 都有各自的配置.
3. 安全性:
POST 的安全性要比 GET 的安全性高. 注意: 这里所说的安全性和上面 GET 提到的 "安全" 不是同个概念. 上面 "安全" 的含义仅仅是不作数据修改, 而这里安全的含义是真正的 Security 的含义, 比如: 通过 GET 提交数据, 用户名和密码将明文出现在 URL 上, 因为 (1) 登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录, 那么别人就可以拿到你的账号和密码了.
来源: http://www.jianshu.com/p/65986fed912b