BeWithYou

胡搞的技术博客

  1. 首页
  2. 数据结构/实用算法/知识
  3. HTTP知识(1)-网络基础部分

HTTP知识(1)-网络基础部分


HTTP知识(1)-网络基础部分

最近在读《图解HTTP》,比起大部头的权威指南,这本书图文并茂,偏科普性质,但是介绍的只是都是简单实用的。也借此机会把以前WEB开发工程中遇到的方方面面串起来思考,感觉不错。
所以在此记录一些要点。

HTTP网络基础

HTTP协议版本

  • HTTP(HyperText Transfer Protocol),超文本传输协议。
  • HTTP0.9 不完善版本
  • HTTP1.1 1997年公布 沿用至今 最新修订版RFC2616
  • HTTP/2.0 正在制订中

TCP/IP

  • 网络是在TCP/IP协议族的基础上运作的,HTTP是属于它内部的一个子集
  • HTTP作用于应用层,同层的还有FTP,DNS等
  • TCP作用于传输层,同层的还有UDP
  • IP作用于网络层,传递数据包
  • OSI七层模型,但是TCP/IP通常关注5层结构,物理层上是数据链路层,传输数据帧
  • HTTP请求过程中,发送端从应用层往下走,接收端从下层往应用层走
  • 由外到内头部的顺序:以太网首部+IP首部+TCP首部+HTTP数据。这一个过程叫分割和封装。
  • 网络传输中使用ARP协议,借助MAC地址进行通信。根据IP地址反查出对应的MAC地址。
  • TCP建立连接3次握手,SYN,SYN/ACK,ACK
  • TCP断开连接4次握手,FIN,ACK,FIN,ACK
  • DNS协议用于根据域名查找IP地址,或从IP地址反查域名

一次HTTP请求在协议层的体现

  1. 客户端通过DNS服务查找www.sogou.com对应的IP地址
  2. HTTP协议生成针对目标web服务器的HTTP请求报文
  3. TCP协议将HTTP请求报文分割成报文段,可靠传输给WEB服务器
  4. 传输过程中依赖IP协议,搜索对方的地址,中转+传送
  5. TCP协议将分组好的报文段按顺序重组
  6. HTTP将重组好的报文解析出来
  7. 服务端知道本次HTTP请求的具体内容
  8. 后续由服务端类似的返回给客户端HTTP响应

URI

http://user:pass@www.example.com:8080/path/to/index.php?uid=1#ch1
协议名://登陆信息@服务器地址:端口号/文件路径?查询字符串#片段标识符

HTTP的简单内容

基础认知

  • HTTP请求中,必须有一头是服务端,有一头是客户端
  • 请求必定由客户端发起,服务端响应
  • 请求报文的组成:请求方法+请求URI+协议版本+可选的请求首部字段+内容实体
  • 响应报文的组成:协议版本+状态码+状态短语+可选的响应首部字段+内容实体
  • 例子可以直接在Chrome的开发者工具里看
  • HTTP是无状态协议,为了保存用户的会话状态,需要引入Cookie

HTTP方法

方法 说明 支持的HTTP协议版本
GET 获取资源 1.0 1.1
POST 传输实体主体 1.0 1.1
PUT 传输文件 1.0 1.1
HEAD 获取报文首部 1.0 1.1
DELETE 删除文件 1.0 1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议链接代理 1.1
LINK 建立和资源的联系 1.0
ULINK 断开连接关系 1.0

目前流行的REST设计,普遍使用GET POST PUT DELETE等方法来标记请求的语义,比如Laravel框架自带的resource路由

持久连接

  • HTTP1.1之后可使用HTTP keep-alive方法,只要任意一段没有明确提出断开连接,则保持TCP连接状态
  • 这样一个页面里许多许多的请求,不用每次都重新建立TCP连接了
  • 而且多数请求都是以管线化,并行发送,不用一个一个排队
  • 当然浏览器也有并行限制

报文内容

  • HTTP报文是由多行数据构成的字符串文本,用CR+LF换行分隔
  • 报文首部+(CR LF)+报文主体,其中主体并不一定要有
  • 报文首部的组成:请求行/状态行+请求/响应首部字段+通用首部字段+实体首部字段+其他
  • 请求报文的例子:
GET/HTTP/1.1            请求行
-------------------------- 各首部字段
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Cookie:ssuv=XXX;ssuid=xxx;
Host:123.sogou.com
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
  • 响应报文的例子
HTTP/1.1 200 OK         状态行
-------------------------- 各首部字段
Cache-Control:no-cache
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Fri, 26 Aug 2016 12:19:50 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
P3P:CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Cache:BYPASS
X-Powered-By:PHP/5.3.3
  • Cookie属于RFC中未定义的首部

编码提升传输速率

  • 报文由8位字节流组成,是通信中的基本单位
  • 可以对实体进行编码传输,常用的内容编码有gzip(GNU zip),compress(UNIX系统标准压缩),deflate(zlib),identity(不编码)
  • 数据分块会将实体主题分成多个块,每一块都会用一个十六进制标记块的大小,主题最后一块用CR+LF来标记。

获取范围内的内容

  • 使用首部字段Range来实现指定范围获取内容的功能
  • Range: bytes=5001-10000,请求5001到10000字节的内容
  • 我们下载软件中的断点续传就是使用了这种方法

内容协商

  • 首部的Accept系列字段,用于客户端与服务端协商可以接受的内容
  • 常用的有Accept Accept-Charset Accept-Encoding Accept-Language Content-Language

返回结果的HTTP状态码

  • 状态码由三位数字和原因短语组成。其中第一位数字表明响应类型。
返回码 类别
1xx Informational(信息性状态码)
2xx Success(成功状态码)
3xx Redirection(重定向)
4xx Client Error(客户端错误)
5xx Server Error(服务端错误)

列举一下常用的状态码。

  1. 200 OK
  2. 204 No Content 成功了但是没有主体部分,不需要刷新页面
  3. 206 Partial Content 成功返回了范围内容,因为请求的是Range
  4. 301 Moved Parmanently 永久重定向,需要更新书签
  5. 302 Found 临时重定向
  6. 303 See Other 服务端希望客户端用GET方法请求新的URI
  7. 304 Not Modified 资源没有改变,客户端读本地缓存即可 我们在浏览器里会经常见到这个状态码
  8. 307 Temporary Redirect 同302
  9. 400 Bad Request 请求中存在语法错误
  10. 401 Unauthorized 需要认证,浏览器会弹出一个认证框
  11. 403 Forbidden 服务端拒绝这个请求,一般都是访问文件没有权限
  12. 404 Not Found 你想要的东西啊,并不存在
  13. 500 Internal Server Error 服务端执行请求时错误,比如PHP语法错误
  14. 503 ServiceUnavailable 服务器正在维护或者已经超载了

下一篇笔记将会详细介绍HTTP报文首部的各个字段。

回到顶部