HTTP 基础整理 - junruchen/junruchen.github.io GitHub Wiki

名词说明:

  • HTTP(HyperText Transfer Protocol)超文本传输协议
  • SGML(Standard Generalized Markup Language)标准通用标记语言
  • URL(Uniform Resource Locator)统一资源定位符
  • URI(Uniform Resource Identifer)统一资源标识符
  • TCP(Transmission Control Protocol)传输控制协议
  • IP(Internet Protocol)网际协议
  • UDP(User Data Protocol)用户数据报协议
  • MAC地址(Media Access Control)媒体访问控制地址/物理地址/硬件地址
  • ARP协议(Address Resolution Protocol)地址解析协议

基础

TCP/IP

TCP/IP是互联网相关的各类协议族的总称,而HTTP是TCP/IP协议族中的一个子集。

TCP/IP协议族可以分为以下四层:

  • 应用层(决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务,如HTTP、FTP、DNS等)
  • 传输层(提供处于网络连接中的两台计算机之间的数据传输。包含两个协议:TCP、UDP)
  • 网络层(或网络互连层。用来处理网络上流动的数据包,在众多的选项中选择一条传输线路,将数据包传送到对方计算机。包含的协议如:IP协议)
  • 数据链路层(或链路层、网络接口层。用来处理连接网络的硬件部分)

TCP协议

TCP协议位于传输层,提供可靠的字节流服务(即将大数据块分割成以报文段为单位的数据包进行管理)。

为了确保数据准确无误的到达目标处,TCP协议通常采用三次握手策略。

TCP协议三次握手策略.png

若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。

IP协议

IP协议位于网络层,负责将各种数据包传送给对方,为了保证确实传送成功,需要满足各类条件,其中两个重要的条件是IP地址和MAC地址。

  • IP地址,指明了节点被分配到的地址
  • MAC地址,指网卡所属的固定地址
  • IP地址可以和MAC地址进行配对,IP地址可以变换,但是MAC地址基本上不会更改
  • 使用ARP地址解析协议可以根据通信方的IP地址反查出对应的MAC地址

DNS协议

DNS协议位于应用层,提供域名到IP地址之间的解析服务。

URI与URL

URI是由某个协议方案表示的资源的定位标识符,协议方案是指访问资源所使用的协议类型名称,如http、ftp、file等。

URI用字符串标识某一互联网资源,而URL表示资源的地点,URL是URI的子集。

HTTP协议

HTTP协议用于客户端和服务器端之间的通信。请求必定由客户端发出,而服务器端回复响应。

  • 客户端:请求文本或图像等资源
  • 服务器端:提供资源响应

HTTP协议不保存状态,为无状态协议。这是为了更快的处理大量事务,确保协议的可伸缩性而特意设计的。但是随着Web的不断发展,这一特性也引发了一些问题,如:如何保持登录状态、如何记录用户信息等,为了解决这一问题,引入了Cookie技术。

HTTP协议通过URI定义资源

HTTP报文

用于HTTP协议交互的信息被称为报文。报文由报文首部、空行(CR+LF)、报文主体组成。

  • 请求报文,客户端发送请求的报文。请求报文首部由请求行、请求首部字段、通用首部字段、实体首部字段以及其他组成
  • 响应报文,服务器端响应的报文。响应报文首部由状态行、响应首部字段、通用首部字段、实体首部字段以及其他组成

HTTP首部字段

HTTP首部字段是构成HTTP报文的要素之一,在客户端与服务器之间以HTTP协议进行通讯的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外终于信息的作用。使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

HTTP方法

方法名称 方法描述
GET 获取资源
POST 传输实体主体
PUT 传输文件,自身不带验证机制 ,在无验证机制或不遵守REST标准时不建议使用
DELETE 删除文件,自身不带验证机制
HEAD 获取报文首部,和GET方法一样,不返回报文主体部分
OPTIONS 询问支持的方法,返回服务器所支持的方法
TRACE 追踪路径,可以通过该方法查询发送出去的请求是如何被加工修改或篡改的。容易引发XST攻击,不常用。
CONNECT 要求用隧道协议连接代理

HTTP状态码

状态码用来描述请求的结果

  • 1XX Informational 信息性状态码,接收的请求正在处理
  • 2XX Success 成功状态码,请求正常处理完毕
  • 3XX Redirection 重定向状态码,需要进行附加操作以完成请求
  • 4XX Client Error 客户端错误状态码,服务器无法处理请求
  • 5XX Server Error 服务器错误状态码,服务器处理请求出错

常用的状态码:

状态码 状态内容 状态描述
200 OK 表示客户端的请求在服务器端被正常处理
204 No Condent 表示请求被成功处理,但是不返回任何实体的主体,在浏览器中表现为页面不发生更新
206 Partial Condent 表示客户端进行了范围请求,且服务器成功执行了这部分的GET请求
301 Moved Permanently 永久性重定向,表示请求的资源已经被分配了新的URI,以后应使用新的URI访问
302 Found 临时性重定向,表示请求的资源已经被分配了新的URI,希望用户本次使用新的URI访问
303 See Other 与302功能相同,但是303状态码明确表示客户端应采用GET方法获取资源
304 Not Modified 表示客户端发送附带条件的请求时,服务器端允许访问资源,但当条件不满足时,返回304状态码
307 Temporary Redirect 临时重定向,与302状态码含义相同,307状态码会遵照浏览器标准,不会从POST变成GET,但是对于处理相应时的行为,每种浏览器有可能出现不同的情况
400 Bad Request 表示请求报文中存在语法错误
401 Unauthorized 表示需要有HTTP认证的认证信息或者用户认证失败
403 Forbidden 表示对请求资源的访问被服务器拒绝了
404 Not Found 表示服务器上无法找到请求的资源
500 Internal Server Error 表示服务器在执行请求时发生了错误或者web应用存在的bug或者某些临时故障
503 Service Unavailable 表示服务器暂时处于超负载或者正在停机维护,无法处理请求

常见问题

1、get与post的区别

1)get方法的请求参数是放在URL中,所以与post有以下明显区别:

  • get请求可以被添加到书签中,也可以保存在历史记录中,post不能
  • get请求可以给浏览器缓存,post不能
  • get请求URL长度受限制,数据长度受限制,post不会
  • get请求只能传输ASCII字,post不受限制,还可以传递二进制数据

2)get通常被用来获取数据,post通常被用来向指定资源提交数据 3)get产生一个TCP数据包,而post产生两个TCP数据包

  • 对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
  • 对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
  • 注意,Firefox进行post请求时,只会发送一次包