Karam
Articles71
Tags52
Categories15
HTTP协议学习

HTTP协议学习

HTTP是什么

HTTP是超文本传输协议,把它拆分成三个部分,超文本,传输,协议。
首先,HTTP是一个协议,是计算机的一种协议,使用计算机能够理解的语言确立了一种计算机之间的交流通信的规范,以及相关的各种控制和错误处理方式。
其次,HTTP是一个传输协议,它的数据流动是双向的,有发送方和应答方方,通过HTTP可以传输各种数据,所以,HTTP是在计算机世界专门用来在两点之间传输数据的约定和规范
HTTP是一种超文本传输协议,这里超文本就是超越文本的数据,所以*HTTP是计算机世界里专门在两点之间传输文字,图片,视频,音频等文件数据的约定和规范。*

七层模型和四层模型

TCP/IP网络分层模型

TCP/IP网络分层模型有四层,“从下往上”的层序是:

第一层叫做“链路层”,负责以太网,WIFI这样的底层网络上发送的原始数据包,工作在网卡这个层次,使用MAC地址来标记网络上的设备

第二层叫做“网际层”,在链路层的基础上,使用IP地址取代MAC地址,把局域网和广域网连接成一个大的虚拟网络,在网络里找设备的时候,只需要把IP地址翻译成MAC地址即可

第三层叫做“传输层“,这个层次协议的职责是保证数据在IP地址标记的两点之间”可靠“的传输,是TCP,UDP协议工作的层次

第四层叫做”应用层“,面向具体应用的协议,这一层的协议有HTTP,FTP,SSH,SMTP等

MAC层的传输单位是帧,IP层的传输单位是包,TCP层的传输单位是段,HTTP的传输单位是消息或者报文

OSI网络分层模型

OSI全称为开放式系统互联通信参考模型,它从下到上分别是:

  1. 第一层:物理层,信号的传输,通过物理介质传输比特流,常用设备有例如电缆,光纤,网卡,集线器等
  2. 第二层:数据链路层,建立通信的时候需要经过建立通信联络和拆除通信联络的两个过程,把比特流转成“帧”的数据块进行传输,为了确保数据通信的准确,实现数据有效的差错检测,网络设备有网桥,交换机等
  3. 第三层:网络层,通过IP寻址来建立两个节点之间的连接,负责对子网间的数据包进行路由选择,这层的协议有IP协议,ICPM协议,ARP协议,RARP协议
  4. 第四层:传输层,传输层建立了主机端到端的连接,为上层协议提供可靠的端到端的传输数据服务,主要协议有TCP,UDP
  5. 第五层:会话层,负责建立,管理和终止表示层实体之间的通信会话
  6. 第六层:表示层,提供各种应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统应用层识别
  7. 第七层:应用层,为用户提供各种网络服务,该层协议有HTTP,FTP,SMTP,POP3,DNS等

域名的解析

DNS的核心系统是一个三层的树状分布式服务,基本对应域名的结构:

  1. 根域名服务器:管理顶级域名服务器,返回”com”,”net”,”cn”等顶级域名服务器的IP地址
  2. 顶级域名服务器:管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址
  3. 权威域名服务器:管理自己域名下主机的IP地址

HTTP的报文

报文结构

HTTP报文包括三个部分:起始行,首部,实体

请求行

请求行包括,协议版本,请求地址,请求方法
这三个部分通常使用空格来分分隔,最后使用CRLF换行表示结束

状态行

状态行包括协议版本,状态码,原因短语

头部字段

头部字段以kv形式存在,最后使用CRLF换行表示结束

常用头字段

HTTP的头部字段可以分为四类:

  1. 通用字段:在请求头和响应头里都可以出现
  2. 请求字段:只能出现在请求头中
  3. 响应字段:只能出现在响应头中
  4. 实体字段:实际上属于通用字段

    HTTP的请求方法

    HTTP1.1规定了八种方法:GET,POST,HEAD,PUT,DELETE,CONNECT,OPTIONS,TRACE

    GET/HEAD

    GET请求的含义是从服务器获取资源,HEAD方法与GET方法类似,但是服务器不会返回请求的尸体数据,只会传响应头,通常用来检查服务器是否存在某个资源

    POST/PUT

    POST方法向服务器提交数据,PUT是修改服务器资源

    其他方法

DELETE方法指示服务器删除资源
CONNECT要求客户端和服务器建立连接
OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回
TRACE用于对HTTP链路的测试和诊断,可以显示出请求-响应的传输路径

安全和幂等

GET和HEAD方法是“安全”的,因为它们对资源只有“只读”操作,不会对服务器上的资源造成实质上的修改,GET和HEAD多次请求的结果一致,所以他是幂等的,POST请求的操作和结果不一致,所以是不幂等的,PUT请求的多次操作和结果一致,所以是幂等的

URL和URI

URL是统一资源定位符,URI是统一资源标识符

URI的格式

scheme://host:port path ?query
上面就是URI的基本组成,scheme就是协议,host为资源所在主机名,port为资源所在主机的端口号,path为资源所在的目录,query为查询字符串
w
URI的完整格式为
scheme://user:password@host:port path ?query#fragment
user:password@为登录信息,#fragement为片段标识符,URI定位的资源内部的一个锚点或者标签

响应状态码

状态行由协议版本,状态码,原因短语组成

状态码

状态码分为5类,具体含义是:

  • 1xx:提示信息,表示目前是协议处理的中间状态,还需要后续的操作
  • 2XX:成功,报文意见收到并被正确处理
  • 3XX:重定向,资源位置发生变动,需要客户端重新发送请求
  • 4XX:客户端错误,请求报文有误,服务器无法处理
  • 5XX:服务器错误,服务器在处理请求时内部发生了错误

1XX

1XX是提示信息类的状态码,当前处于协议处理的中间状态,比较常见的状态码是101 Switching Protocols,意思为客户都安使用Upgrade头字段,要求在HTTP协议的基础上改成其他的协议继续通信

2XX

2XX是成功,服务器接收请求并正确处理
200 OK“表示一切正常
204 No Content“表示请求成功但是响应头后没有body数据
206 Parial Content“当用户在使用分块传输的时候,返回body里的数据是资源的一部分

3XX

3XX是重定向,客户端请求的资源发生了变动,必须用新的URI重新发送请求获取资源
301 Moved Permanently”永久性重定向,
302 Found”临时性重定向,也会给一个地址重定向,但是不是永久性的
在Location字段中指明资源的新地址
304 Not Modified”表示资源未修改,用户缓存控制,缓存重定向

4XX

4XX表示客户端发送的请求报文有无,服务器无法处理
400 Bad Request”表示请求报文有错误,但没有明确的含义
403 Forbidden”表示服务器禁止访问资源
404 Not Found”资源在本服务器上未找到

  • 405 Method Not Allowed:不允许使用某些方法操作资源
  • 406 Not Acceptable:资源无法满足客户端请求的条件
  • 408 Request Timeout请求超时
  • 409 Conflict:多个请求发生冲突
  • 413 Request Entity Too Large:请求报文里的body太大
  • 414 Request-URI Too Long:请求行里的URI太大
  • 429 Too Many Requests:客户都安发送了太多的请求
  • 431 Request Header Fileds Too Large:请求头中的某个字段胡总和总体太大

    5XX

    5XX代表服务器错误,服务器内部处理发生了错误
    500 Internal Server Error”通用错误码,没有具体错误
    501 Not Implemented”表示客户端请求的功能还不支持
    502 Bad Gateway”通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误
    503 Service Unavailable”表示服务器当前很忙,暂时无法响应服务

    HTTP有哪些特点

    灵活可扩展

    HTTP的body可以传输图片,音频,视频等任意数据

    可靠传输

    因为HTTP时基于TCP协议的,所以也是可靠的传输协议

    请求-应答

    HTTP的通信模式是请求-应答,通俗来讲就是“一发一收”,请求方法请求,接收方响应

    无状态

    HTTP的收发报文都是相互独立的,没有任何联系,收发报文也不会对客户端或服务器产生任何影响,连接后也不会保存任何信息

    HTTP有哪些优点?有哪些缺点?

    HTTP的优点有,简单,灵活可扩展,跨语言,跨平台,所以应用广泛
    无状态即是优点也是缺点,优点是不需要额外的资源来记录状态信息,减轻服务器的负担;缺点是不支持连续多个步骤的“事务”操作,所以引进了cookie技术,作为服务器对客户端的标识
    缺点:明文传输,数据会被暴露,容易被窥探信息
    HTTP性能的问题,因为请求应答的模式,导致队头阻塞等等问题

    HTTP的实体数据

    数据类型与编码

    HTTP使用MIME type来标记body中俄的数据类型。其中,HTTP经常遇到的MIME类型为:
  • text:文本格式可读数据,text/html,text/plain,text/css
  • image:即图像文件,有image/jpg,image/jpeg,image/png等
  • audio/video:音频和视频数据,如audio/mpeg,video/mp4等
  • application:数据格式不固定,application/json,application/javascript等
    除了数据类型,有时候数据会被压缩,所以还有编码类型,编码类型通常只有三种:
  1. gzip:GNU zip压缩格式
  2. deflate:zlib压缩格式
  3. br:专门为HTTP优化的新压缩算法

    数据类型使用的头字段

    HTTP协议定义了两个字段进行客户端和服务器的“内容协商”,Accept请求头字段,Content实体头字段,客户端用Accept告诉服务器希望接收什么样的数据,服务器使用Content告诉客户端实际发了什么样的数据

    语言类型与编码

    Accept-Language客户端可理解的自然语言,Content-Language是服务器告知客户端实际发送的语言类型

    内容协商的质量值

    Accept这类请求头中可以使用q参数表示权重来设置优先级
    权重值最大为,最小为0.01,默认值是1,0表示拒绝
    服务器使用Vary字段记录服务器在进行内容协商的时候参考的请求头字段

    HTTP传输大文件的方法

    数据压缩

    Accept-Encoding是浏览器支持的压缩方式,Content-Encoding是实际服务器压缩的方式

    分块传输

    在响应报文里用头字段”Transfer-Encoding:chunked“来表示,body部分是分块发送的,这个字段和Content-Length是互斥的
    分块传输的规则:
  4. 每个分块包含两个部分,一个是分块的长度,一个是数据块
  5. 长度头是以CRLF结尾的一行明文,用16进制数字表示长度
  6. 数据块紧跟在长度后面,最后也以CRLF结尾
  7. 最后用一个长度为0的块表示结束

    范围请求

    范围请求允许客户端在请求头里使用专用字段来表示只获取文件的一部分,服务器使用Accept-Ranges:bytes告知客户端,是否支持范围请求,如果服务器不支持,那只能将数据整块发送
    客户端使用Range来表示自己请求的数据范围

    多段数据

    特殊的MIME类型:multipart/byteranges,表示报文的body是由多段字节序列组成的,并且还要用一个参数”boundary=xxx“给段之间的分隔标记

    HTTP的连接管理

    因为HTTP短连接,导致每次请求都需要先建立连接,当请求频繁的时候,就会消耗无意义的时间。

    长连接

    HTTP1.1提出了持续连接,使用长连接在请求头中添加Connection:keep-alive,如果服务器支持长连接,就会在响应里发送Connection:keep-alive,客户端可以在Connection:close来关闭连接

    Cookie机制

    Cookie的属性

    可以设置Expire和Max-Age来设置Cookie的有效期,这两者可以同时出现,浏览器会优先采用Max-Age来计算失效期
    Cookie可以通过设置HttpOnly,sameSite,Secure