《图解HTTP协议》 计算机基础知识

Posted by CodingWithAlice on July 3, 2019
  • 缩写名词解释

HTTP 中文名称 功能
HTTP 超文本传输协议(应用层) 生成针对目标Web服务器的HTTP请求报文
HTML 超文本标记语言  
URL 统一资源定位符(文档地址) 表示资源的地点。是URI的子集。
URI 统一资源标识符 用字符串表示某一互联网资源
TCP/IP协议族 与互联网相关的协议集合  
DNS 域名系统(应用层) 域名到IP地址之间的解析服务。DNS协议提供通过域名/IP名双向查找。
TCP 传输控制协议(传输层 提供可靠的字节流服务,即对HTTP请求报文进行分割(为了方便运输,将大块数据分割成以报文段为单位的数据包进行管理);并打上标记序号和端口号后转发给网络层。三次握手
IP 网际协议(网络层) 把各种数据包传给对方。要确保传送有两个重要条件:IP地址、MAC地址。
IP地址   指明了节点被分配到的地址;
MAC地址   指网卡所属的固定地址;(通信双方经过多台计算机和网络设备中转进行连接,中转的时候,会利用下一站中转设备的MAC地址来搜索下一个中转目标
ARP协议 解析地址的协议 根据通信方的IP地址,反查出对应的MAC地址
SSL 安全套接层  
TLS 传输层安全  
MIME 多用途因特网邮件扩展  

第一章 了解Web及网络基础

网络基础TCP/IP 的分层管理

注 http是TCP/IP内部的一个子集。

  • 应用层:为用户提供应用服务。DNS(域名系统)、FTP(文件传输协议)、HTTP属于应用层。

  • 传输层:对上层应用层,提供两台计算机之间的数据传输。TCP(传输控制协议)、UDP(用户数据报协议)属于传输层。

  • 网络层:处理网上流动的数据包,选择通过怎样的路径,把数据包给对方。IP(网际协议)属于网络层。

  • 数据链路层/网络接口层:处理链接网络的硬件部分。 包括控制操作系统、硬件设备的驱动、NIC(网络适配器,即网卡)

数据包是网络传输的最小数据单位。

TCP/IP通信传输流:客户端到服务器通过分层顺序传输 路由选择:在到达通信目标前的中转过程,计算机和路由器等网络设备,都只能获悉很粗略的传输路线,无法掌握互联网中全面传输情况

1571468854066

发送端:从应用层往下走;每通过一层会增加该层的首部信息(这种把数据信息包装起来的做法称为封装);

接收端:则从链路层往上走到应用层;每通过一层会删除该层的首部信息;

客户端发送到服务器的过程:

1571468842842

TCP的三次握手(是为了准确无误得将数据送达目标处,把包送出去后,向对方确认是否送达成功)

  • 1.发送端发送一个带SYN标志的数据包给对方。
  • 2.接收端收到后,回传一个带有SYN/ACK标志的数据包传达确认信息。
  • 3.最后,发送端再回传一个带ACK标志的数据包,代表握手结束。

第二章 简单的HTTP协议

HTTP协议规定,请求从用户端发出,最后服务器响应改请求。(肯定是从客户端开始建立通信的,服务器在没有收到请求之前不会发送响应)

请求报文/响应报文

请求报文:由请求方法、请求URI、协议版本(三者组成请求行)、可选的请求首部字段和内容实体构成。 GET /index.htm HTTP/1.1 Host:hackr.jp 请求方法:请求访问服务器的类型;请求URI:指明请求访问的资源对象;

1571468761996

响应报文:由协议版本、状态码、解释状态码的原因短语(三者组成状态行)、可选的响应首部字段及实体主体构成。 两种报文中,报文首部和报文主体由最初的空行来划分。

1571468744879

  • 请求方法:GET访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。

    1571468713950

    ​ POST用来传输实体的主体。返回服务器接收数据的处理结果。

    1571468684320

    ​ HEAD获得报文首部。用于确认URI的有效性及资源更新的日期时间。

    ​ OPTIONS查询针对请求URI指定的资源支持的方法 - 复杂请求的是否支持跨域使用 options 作为预检请求进行查询。

    ​ CONNECT用隧道协议连接代理。用SSL和TLS把通信内容加密后经网络隧道传输。

    ​ PUT用来传输文件,但是自身不带验证机制,任何人都可以上传文件,存在安全性问题。

    ​ DELETE按请求URI删除指定的资源,但是自身不带验证机制,存在安全性问题。

    ​ TRACE追踪路径,查询发出去的请求是怎么样被加工的,存在安全性问题。

  • 请求URI:指定方式很多种,可以用*代替,可以写完整,也可以在首部字段Host中写明网络域名或IP地址

①GET http://hackr.jp/index.htm HTTP/1.1 (URI是完整的请求URI) ②GET /index.htm HTTP/1.1
Host: hackr.jp (在首部字段Host写明网络域名或IP地址)
③OPTIONS * HTTP/1.1.(这是用来查询HTTP服务器端支持的HTTP方法种类)

如果用*代替URI的话, 表示对服务器本身发起请求。

  • 常见请求头属性

Accept: text/html,image/*      // 浏览器接受的数据类型
Accept-Charset: ISO-8859-1     // 浏览器接受的编码格式
Accept-Encoding: gzip,compress  //浏览器接受的数据压缩格式
Accept-Language: en-us,zh-       //浏览器接受的语言
Host: www.it315.org:80          //(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT  --浏览器最后的缓存时间
Referer: http://www.it315.org/index.jsp      -- 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)  --浏览器类型
Cookie:name=eric                     -- 浏览器保存的cookie信息
Connection: close/Keep-Alive  -- 浏览器跟服务器连接状态。close: 连接关闭  keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT      -- 请求发出的时间
content-type常见的属性:–实体主体内对象的媒体类型
  1. application/x-www-form-urlencoded

浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以此方式提交数据;该种方式提交的数据放在 body 里面,数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。

  1. multipart/form-data

一个常见的 POST 提交方式,通常表单上传文件时使用该种方式。

  1. application/json

告诉服务器消息主体是序列化后的 JSON 字符串。

  1. text/xml

主要用来提交 XML 格式的数据。

  • 状态码:表示请求成功或失败的数字代码

Cookie技术

  • HTTP协议自身不具备保存之前发送过的请求或响应的功能,即无状态协议

为了实现期望的保持状态功能,于是引入了Cookie技术。

  • Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
    • Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。

为Cookie服务的首部字段

Cookie的工作机制是用户识别及状态管理。Web网站通过Web浏览器,把一些数据写入用户的而计算机内。

首部字段名 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段

Set-Cookie的几个属性:

​ expires=DATE: Cookie的有效期(默认为浏览器关闭前);

​ path=PATH:将服务器上的文件目录作为Cookie的适用对象;

​ domain=域名: 作为Cookie使用对象的域名;

Secure:仅在HTTPS安全通信时才会发送Cookie

​ HttpOnly:加以限制,使Cookie不能被JavaScript脚本访问(防止跨站脚本攻击XSS);

获取部分内容的范围请求

  • 执行范围请求时,会用到请求报文首部字段 Range:bytes = 5001 - 10000 来指定资源的byte范围。

状态码

  • 200 OK 的响应结果表明请求被正常处理了。
  • 204 No Content 服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分
  • 206 Partial Content 客户端进行了范围请求

面试被问过:301和302有什么区别?

  • 301 Moved Permanently 永久性重定向。表示请求的资源已被分配了新的URI,以后应使用新URL
  • 302 Found 临时性重定向。表示请求的资源已被分配了新的URI,本次请求暂且使用新URL
  • 307 Temporary Redirect 临时性重定向。与302含义相同。
  • 303 See Other 由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
  • 304 Not Modified 客户端发送的附带条件的请求时,服务器允许请求访问资源,但服务器端资源未改变,可直接使用客户端未过期的缓存

  • 400 Bad Request 请求报文中存在语法错误
  • 401 Unauthorized 请求需要通过HTTP认证。第一次返回,会弹出认证窗口,第二次返回,表示认证失败。
  • 403 Forbidden 请求资源的访问被服务器拒绝了。
  • 404 Not Found 服务器上没有请求的资源

  • 500 Internal Server Error 服务器在执行请求时发生了错误。
  • 503 Service Unavailable 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

  • 代理:客户端和服务器的中间人。代理不改变URI。

    常用:缓存代理(代理转发响应时,会保存资源在代理服务器上,再次请求相同资源时即可不去源服务器获取资源;有有效期,过期后会确认资源有效性,无效就再次获取新资源);通过设置组织内部的代理服务器可做到针对特定URI访问的控制。

  • 网关:为客户端和网关之间的通信线路加密,提高通信的安全性。

  • 隧道:确保客户端与服务器安全通信,建立一条与其他服务器的通信线路。不会去解析HTTP请求。

HTTP首部字段

结构:首部字段名:字段值

根据实际用途分为四类

  1. 通用首部字段:请求报文和响应报文都会使用的首部

    常见:Cache-Control 操作缓存工作机制:public 其他用户也可利用缓存 / private 特定用户 / no-cache 不缓存过期资源 吧 / no-store 不缓存,有机密信息 / max-age 数值代表资源保存为缓存的最长时间 / min-fresh 要求缓存服务器返回 还未过指定时间的缓存资源 / max-stale 即使过期也照常接收 / no-transform 规定不能改变实体主体的媒体类型(防止压缩图片);

    Connection:不再转发的首部字段名 / 管理持久连接 (默认都是持久连接) Close (断开连接)、Keep-Alive 持续连接(默认是非持久连接);

    Date:创建HTTP报文的日期和时间;

    Warning:警告。格式:[警告码] [警告的主机:端口号] “[警告内容 ]”([日期时间]可省略)

  2. 请求首部字段:客户端发请求报文给服务器时使用,补充请求附加内容、客户端信息、相应内容相关优先级等;

    Accept 通知服务器,用户代理能够处理的媒体类型及其相对优先级,可采用type/subtype形式;

    Accept-Charset 字符集及其优先级;Accept-Encoding 内容编码及其优先级;Accept-Language 自然语言集及其优先级;Authorization 认证信息;

    Host 通知服务器,请求的资源所处的互联网主机名和端口号(HTTP/1.1规范内,Host是唯一一个必须项);

    If-Match:条件请求,只有If-Match的字段值和服务器上的实体标记ETag一致时,服务器才会接收请求;

    If-Range :字段值和ETag一致时,作为范围请求处理,否则,返回全体资源;Max-Forwards:每次转发数值减一,为0时返回(检测路径中的通信状况);

    Referer:告知服务器请求的原始资源的URI;

  3. 响应首部字段:服务器返回响应报文给客户端时使用,补充响应附加内容,要求客户端附加额外的内容信息;

    Accept-Ranges:告知客户端,能(bytes)否(none)处理范围请求;

    Age:服务器多久前创建了响应;

    ETag唯一性标识:实体标识(资源更新后,URI虽然没变,ETag却会重新生成);

    Location:将响应接收方,引导至某个与请求URI位置不同的资源;

  4. 实体首部字段:请求报文和响应报文的实体部分使用的,补充资源内容更新时间等。

    Allow:告知客户端,能够支持的Request-URI指定资源的所有HTTP方法;

    Content-Encoding:服务器对实体的主体部分选用的内容编码方式(压缩);

    Content-Language:实体主体用的自然语言;Content-Length:实体主体部分大小;

    Content-Location:报文主体返回资源对呀的URI;

    Content-Range:告知客户端作为响应返回的实体的哪个部分符合范围请求(Content-Range:bytes 5001-10000/10000

    Expires:将资源失效的日期告知客户端,超过时间的,缓存服务器会向源服务器请求资源。(源服务器不希望缓存服务器对资源缓存时,最好在Expires字段内写入与首部字段Date相同的时间值。)(但当首部字段Cache-Control指定了max-age指令时,优先处理max-age)

其他常用首部字段

X-Frame-Options:DENY 拒绝 / SAMEORIGIN 仅同源域名下的页面匹配时许可;属于HTTP响应首部,用于控制网站内容在其他网站的Frame标签内的显示问题,主要目的是为了防止点击劫持攻击。

X-XSS-Protection:0 将XSS 过滤器设置成无效状态 / 1 有效状态;属于HTTP响应首部,针对跨站脚本攻击XSS的一种对策,用于控制浏览器XSS防护机制的开关。

DNT(do not track的简称):0 同意被追踪 / 1 拒绝被追踪;属于HTTP请求首部,是表示拒绝被 精准广告追踪的一种方法;

P3P,属于HTTP响应首部,让Web网站上的个人隐私,变成一种仅供程序可理解的形式,达到保护用户隐私的目的。

HTTP的缺点

  1. 通信使用明文(不加密),内容可能会被窃听;

  2. 不验证通信方的身份,因此有可能遭遇伪装;
  3. 无法验证报文的完整性,所以有可能已遭篡改;

HTTP+加密+认证+完整性保护=HTTPS(身披SSL协议外壳的HTTP)

HTTP其他缺点:

  1. 一条连接上只可发送一个请求;
  2. 请求只能从用户端开始,客户端不可以接收除响应以外的指令;
  3. 请求/响应首部未经压缩就发送。首部信息越多,延迟越大;
  4. 发送冗长的首部,每次互相发送相同的首部造成的浪费较多;
  5. 可任意选择数据压缩格式, 非强制压缩发送;

解决办法:Ajax、Comet、SPDY、WebSocket(Web浏览器和Web服务器之间全双工通信标准)