HTTP协议总结记录

HTTP协议是移动端开发中最常使用到的协议;客户端的接口请求、网页内容加载等都通过该协议完成数据传输;这篇文章记录HTTP协议相关的基础知识内容,并会补充一些与HTTP协议相关的其它网络知识;

  • 协议介绍
  • 关联的网络知识(TCP、IP、DNS等)
  • HTTP首部与响应状态码
  • HTTPS通信安全

1、协议介绍

HTTP是一种无状态、无长连接(不同于Socket等)的客户端与服务端之间的通信协议;

  • 无状态:HTTP协议本身不保存通信的状态,也就是说所有的请求与响应在协议层面上都不会被记录;
    但是在使用HTTP协议的很多应用中,都希望能记录一些状态信息(比如在登录后希望能记住登录的状态,在请求新的页面时不需要重新去登录);为了解决这个问题,引入了cookie技术;
  • 无长连接:HTTP在客户端与服务端的通信过程中,不保持长连接;数据的更新必须通过“请求->响应”这种模式完成,服务端不能主动推送更新数据给客户端;
    为了解决这一问题,出现了Ajax、Comet、SPDY、全双工通信的WebSocket等技术弥补这一缺陷,这些都是基于HTTP扩展出来的技术;

2、与HTTP关联的网络知识(TCP、IP、DNS)

我们在面试的过程中,经常会被问道什么是“三次握手”等一些和网络有关的基础知识,这本身并不属于HTTP协议内容;但HTTP协议需要这些更低层的网络模块的支持才能实现通信;接下来看看HTTP是如何与这些低层网络模块完成协作的;

我们先通过下面这张图看一下计算机网络的分层,和网络通信过程中的数据包的传递流向,实际通信过程中可能存在更多的中间路由器转发:


网络通信分层.png

通过一些不同的网络设备(包括集线器、交换机、路由器等)把接入到互联网内的主机连接在一起,以便让这些主机实现互相通信;实现通信除了需要有物理设备连接外,还需要制定一些协议来完成数据的传输过程,这本身是一个非常复杂的过程,因此对整个网络通信按不同的功能划分进行了网络分层;

分层的好处是可以方便网络的维护与扩展,只要制定好跨层之间的通信接口,在具体层的内部可以自由的进行扩展更新;同时分层也降低了实现的复杂度,不同层只需要关注自己的那部分功能就好,在网络需要扩展时不需要对整个网络结构进行修改;

  • 物理层与数据链路层:提供数据传输的物理线路支持,还有部分协议和简单的数据验证功能;其中集线器工作在物理层,交换机工作在数据链路层;

  • 网络层:也叫“网际层”、“IP层”,负责连接不同的子网络,企业或者一些机构的内部网络通过网络层,接入到互联网中;这一层通过IP协议实现把数据包传送给目标主机,内部还有很多具体协议做支持(包括路由选择、ARP地址解析协议等);路由器工作在这一层;

  • 运输层:负责数据的可靠传输与交付;从应用层过来的数据包一般比较大,并不适合在互联网中传输;在运输层首先会把接收到的数据包进行分割,把大的数据包分割成很多小的数据包,并对分割后的数据包进行编号;在目标主机上通过运输层把接收到的数据包按编号重新组合后交付给上层;TCP与UDP协议工作在这一层;

1、UDP不提供可靠传输,只做尽最大可能的数据交付工作;

2、TCP协议提供可靠传输服务,也就是在传输过程中会对丢失的数据包进行重传;上面说的“三次握手”就是TCP协议中的内容,其主要目的就是为了保障可靠传输服务,除了三次握手TCP还有一些其他方式保证可靠传输服务;

三次握手是指:发送端在发送一个数据包时会对这个数据包带上SYN(TCP的标志)标志,接收端在接收到这个数据包后会返回一个带有SYN/ACK标志的数据包给发送端,客户端在接收到SYN/ACK数据包后就知道服务端已经接受到了数据,在发送一个带有ACK标志的数据包给接收端,表示握手结束;中间有任何一次握手断开了,这个数据包都需要重传;


三次握手.png

这里可以考虑一下为什么是三次握手,而不是两次或四次;如果只有两次握手,接收端为了避免发送端重传一个数据包,在收到SYN数据包后需要发送SYN/ACk数据包,告诉发送端我已经收到了这个数据包;但接收端并不知道发送端是否已经收到了SYN/ACK数据包,因此它会认为客户端可能不知道它已经接收到数据包,所以它可能会不停地发送SYN/ACK数据包告诉发送端我已经收到了,所以需要发送端在发送一个ACK数据包,告诉接收端我已经知道你收到了这个数据包,这次握手可以结束了;在接受端收到ACK之后,就知道这个数据包已经完成了,因此就可以结束握手了;

  • 应用层:这一层主要是向用户提供各种不同服务的网络协议,其中DNS和HTTP都是工作在这一层;
    DNS(域名解析服务)提供把域名解析到IP地址的服务;计算机都有自己的IP地址和MAC地址,在IP层转发数据包时会使用这两个地址进行路由选择;但是这两个地址并不符合人的记忆习惯,所以在标识主机时通过使用域名来方便理解(比如baidu.com等);DNS就是提供把域名解析成IP或通过IP反查域名的服务的;

3、HTTP首部与响应状态码

3.1、HTTP协议用于客户端与服务端之间的通信;

客户端发起对资源的请求,服务端负责处理请求并返回客户端请求的资源;通过请求和响应的交互完成通信;下面两张图分别展示了请求和响应的报文格式:


请求报文.png

请求报文中主要包括三个部分,分别是“请求行”、“报文首部信息”、“报文主体内容”;“请求行”和“首部信息”统称为报文首部,在报文首部与报文主体之间通过空行(CR+LF)来分割;

  • 请求行:包括请求方法、请求的URI、和HTTP协议版本信息
  • 报文首部信息:请求报文首部信息一般包括几种类型的首部信息,分别是“通用首部信息”、“请求首部信息”、“实体首部信息”和“其他部分首部字段”;这些都是用来分别表示请求的各种条件和属性的首部内容;
  • 报文主体内容:可以为空,也可以传递状态数据给服务端(POST请求等);
响应报文.png

响应报文中对应也包括三部分信息,分别是“响应行(也叫状态行)”、“报文首部信息”、“报文主体内容”;其中“状态行”和“首部信息”统称为响应报文首部,在报文首部与报文主体之间通过空行(CR+LF)来分割;

  • 响应行:包括HTTP协议版本,响应状态码和解释状态码对应的原因短语;
  • 报文首部信息:响应报文首部信息也包括几种类型的首部信息,分别是“通用首部信息”、“响应首部信息”、“实体首部信息”和“其他部分首部字段”;这些都是用来分别表示响应的各种条件和属性的首部内容;
  • 主体内容:请求对应的资源数据会在响应报文的主体内容中,可以为空(HEAD请求的响应);

3.2、HTTP存在不同的请求方法,请求的资源会根据不同的请求方法作出不同的响应

常用的请求方法包括以下这些:

  • GET:用来请求访问服务端的某个资源,指定的资源在经过服务端解析后会返回响应内容(如果是文本,会直接返回;如果是接口程序,会在程序执行完后返回执行的结果);

  • HEAD:HEAD方法与GET方法一样,但是不返回报文的主体内容(body为空);

  • POST:POST请求可以传输请求的body信息;与GET的区别在于POST一般可以传送数据量更大的数据体;

  • PUT:PUT方法用来传输文件,在请求的报文主体中包含文件内容,在指定的URL中保存文件;由于PUT方法本身不带验证机制,任何人都可以上传文件,所以一般使用的比较少;实际使用中可以通过POST请求实现文件上传功能;

  • OPTION:OPTION方法用来确认资源可以接收哪几种请求方法;通过返回可以知道这个资源可以使用哪几种方式去请求;

  • DELETE:DELETE方法用于删除指定URL的文件,与PUT的作用相反;也不提供验证机制,所以一般也使用的比较少;

  • CONNECT:CONNECT方法要求与代理服务器通信时建立隧道,使用SSL进行安全通信;

3.3、部分首部字段与Cookie技术的介绍

HTTP首部是HTTP报文的重要组成部分,他可以用来传递额外的重要信息(除报文主体之外的信息);请求和响应报文都会使用HTTP首部,下面介绍几种比较重要的首部字段;

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

Cache-Control:该首部的值用于控制缓存的行为,如“Cache-Control : private, max-age=0, no-cache”

Connection:该首部字段有两个作用;
1、控制代理服务器不再转发首部字段;如“ Connection : Upgrade”表示在第一个代理服务器收到数据包后,会把Upgrade首部字段删除后,在继续往下转发;
2、管理持久链接;这个作用主要用于优化性能,减少创建和关闭网络连接的开销;如“ Connection : Keep-Alive”、“ Connection : Close”;

Transfer-Encoding:规定传输报文主体时的编码方式,如“Transfer-Encoding : chunked”;

  • 请求首部字段:请求报文使用的首部,补充请求的附件内容,客户端信息等内容;

Accept:代表用户代理能够处理的媒体类型和类型的优先级,如“ Accept : text/html; q=0.3, application/xml”

Accept-Encoding:告知服务器用户代理支持的内容编码和内容编码的优先级顺序,如“Accept-Encoding : gzip, deflate”

Authorization:发送用户的认证信息给服务端;

Max-Forwords:指定可经过的最大服务器数目,如“Max-Forwords : 3”表示可经过3个服务器,每经过一个代理服务器字段值会减一然后继续往下发送,到值为0时,服务器就会立即返回响应;

Range:用于范围请求获取实体的部分资源;如“ Range : 200-400”可获取200字节到400字节之间的数据;

User-Agent:会发送创建请求的浏览器和用户代理名称等信息给服务端,也可以自己写入一些系统信息;

  • 响应首部字段:响应报文会使用的首部,补充了响应的附件内容;

Accept-Ranges:用于告知客户端服务器是否能处理指定的范围请求,存在两个值,能处理时为“Accept-Ranges : bytes”,不能处理时为“Accept-Ranges : none”;

ETag:用于标识一个资源,当资源的内容更新时,URL没有改变,但是ETag值对应会发生改变;

Location:在需要重定向时,放入需要重定向访问的URL资源地址;

Server:返回客户端当前服务端的HTTP服务器信息;

WWW-Authenticate:告知客户端访问指定资源时需要的认证方法,一般会和401状态码一起返回;

  • 实体报文首部:针对报文实体信息的首部,补充与实体有关的信息;

Allow:用于告知客户端请求的资源能接受的访问方法,如“Allow : GET, HEAD, POST”;

Content-Encoding:告知客户端服务器对实体主体的内容编码方式,如“Content-Encoding : gzip”;

Content-Length:实体主体的内容大小;

Content-Type:说明实体主体内的对象的媒体类型

Cookie的概念和与Cookie有关的首部字段
HTTP协议本身是无状态的,即协议本身不保存请求和响应的任何信息,也就无法根据之前的状态进行下一次请求的处理;

但是很多实际的应用场景中需要记录一些用户信息的状态值;比如一个需要登录才能访问的网站,在完成登录之后如果不记录登录的状态,在继续访问一些其他页面时,又要去重新登录,这显得很不合理;因此引入了Cookie技术解决此问题;

服务端在首次接收到用户的请求信息后,会根据用户的信息生成一个可以唯一标识用户身份的字符串信息;然后通过响应首部字段“Set-Cookie”把这一信息返回给客户端,客户端在接收到返回的Set-Cookie后,会把信息在本地保存下来,在下次请求时通过请求首部字段“Cookie”把这一信息带上,服务端在收到包含Cookie的请求后做一下验证就知道是之前用户发送过来的请求,因此可以用来标记用户的身份信息;

3.4、常见响应状态码介绍

响应状态码代表了HTTP请求的处理结果,可以表示服务端处理请求是否正常完成或者是出现了错误;常见的状态码一般分为2XX、3XX、4XX、5XX等;其中1XX的状态码比较少见,它代表请求正在处理;

  • 2XX状态码,请求成功的返回状态码
    200 OK:请求成功,结果正常返回;
    204 NO Content:请求处理成功,但没有数据内容可以返回,即返回的报文不包含主体内容;一般用在只需要从客户端发送信息,不需要服务端返回新数据的情况;
    206 Partial Content:表示处理范围请求成功,返回了指定范围的数据内容,可以用在下载功能的断点续传上;根据Content-Range首部字段指定范围的大小;

  • 3XX状态码,请求需要重定向
    301 Moved Permanently:资源被永久性的重定向,以后访问资源需要使用资源的新URL地址;
    302 Found:临时性重定向,希望本次访问可以使用新指定的URL进行;
    303 See Other:与302效果一样,不同之处在于,明确指定这次请求应该以GET方式访问新URL;
    304 Not Modified:当发送了附带条件的请求后,服务端允许访问;但因发生了请求未满足条件的情况(附带条件没有被满足),直接返回了304(资源未更新,可使用客户端缓存);304返回不包含任何主体内容;

  • 4XX状态码,代表客户端请求体发生了错误
    400 Bad Request:请求报文中存在语法错误需要修改;
    401 Unauthorized:表示请求的资源需要使用通过HTTP认证的认证信息;如果已经进行过一次认证,则表示认证失败;
    403 Forbidden:访问请求的资源时被服务器拒绝了;可以在响应的主体中说明拒绝原因;
    404 Not Found:在服务器上没有找到请求的资源;或者是服务器拒绝请求但不想说明理由时使用;

  • 5XX状态码,代表服务端处理请求时发生了错误
    500 Internet Server Error:服务器在处理请求时发生了错误,一般很有可能是服务端的程序bug;
    503 Service Unavailable:服务端处于超负载或正在停机维护中,一般还会在响应首部中带上Retry-After指示可以恢复访问的时间值;

4、 HTTPS通信安全

HTTPS(HTTP Secure)的主要作用是可以对通信方的身份进行确认,并在通信过程中对数据进行加密以确保数据的安全性,使用的是混合加密方式;这些是通过SSL(安全套接层)协议完成的,SSL使用证书机制来验证身份,使用加密算法来保证数据传输的安全性;

在HTTP数据包下发到运输层之前,增加了SSL层的调用;SSL是独立于HTTP之外的协议,所以应用层的其他协议也可以使用SSL做数据加密处理;其中TLS协议是基于SSL3.0的,目前TLS的最新版本是TLS1.2;既可以使用SSL3.0协议也可以使用TLS协议,所以有时也会叫SSL/TLS1.2协议;

对通信方身份的确认主要是通过CA证书实现的;由认证机构颁发的数字签名证书很难被仿制,所以只要验证了证书的签名没有问题,就可以确认访问的服务器的身份,可以避免第三方伪装的服务器;如果客户端端也存在认证证书,则可以确认通信双方的身份,但是一般只有服务端才会布置CA证书;

通信过程中的数据加密使用的是混合加密方式,即既包括非对称加密算法也包括对称加密算法,共同保证数据传输的安全性;

在客户端发送了请求给服务端后,服务端首先会返回认证证书信息给客户端;客户端在接收到证书后,会验证证书的有效性,一般是验证证书的有效期,然后根据植入到手机系统中的CA根证书验证服务端返回的证书签名是否有效(即验证是否是有认证机构签名的证书),如果验证通过,则会生成一串“随机码”,并使用证书中公钥信息对这个随机码做加密处理,然后发送到服务端,服务端接收到加密的随机码后,用私钥对数据做解密处理,得到客户端发送过来的随机码;之后这个“随机码”会被用作对称加密算法的密钥,服务端与客户端接下来的数据传输都会使用对称加密算法做加密处理;

最后

这篇文章记录了关于HTTP协议的基础内容和 与HTTP相关的其他网络基础知识;方便自己后续可以快速的回顾复习这部分的内容;HTTP协议还会涉及到一些其他的关联内容,如怎样更安全的完成身份验证、缓存处理机制、网关服务器、预防网络攻击等,有些不属于HTTP协议本身的内容,但是却是在协议实际使用中需要考虑的问题;如果需要了解更多这方面内容,建议可以查看一些对应主题的技术文章来加深理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270