HTTP笔记(一)

背景

开始学习HTTP了,清明望乡不能回,其实也是好惆怅。言归正传吧,之前对HTTP有过一些学习,主要是HTTP状态码和缓存这块的需要,这次试试深入学习一下,如果只是这样浅浅了解难免一叶障目,所以这次翻出《图解HTTP》,深入学一学,聊做笔记了。

HTTP相关基础

“网络基础 TCP/IP”

HTTP是TCP/IP的一个子集,它是TCP/IP四级分层顶部应用层协议,与HTTP类似的位于应用层的协议还有FTP&NDNS等等。

TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。

TCP/IP 协议族分层

  • 应用层

应用层决定了向用户提供应用服务时通信的活动。

TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。

HTTP 协议也处于该层。

  • 传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。

  • 网络层(又名网络互连层)

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

  • 链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

两台计算机交互时候各层之间数据流动:
http1

一次HTTP沟通背后的数据封装:
http2

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)

PS:以上摘自《图解HTTP》

HTTP和TCP,IP,DNS不得不说的故事

实际上本文第一副图已经说明了HTTP和TCP,IP之间密不可分的关系了:
HTTP作为应用层是依赖于TCP和IP层的:

  1. TCP作为传输层负责将数据打上MAC地址发给网络层IP,开始进行三次握手准备
  2. IP作为网络层负责将数据打包成报文段进行编号,发送给链路层进行传送

确保数据到达的TCP

TCP在将数据通过IP层下发时候将会打上SYN标记,请求端接受到数据时候,完成第一次握手,返回一个标记有SYN/ACK的数据包,TCP层接受到之后,完成第二次握手,最后发送一个标记有ACK的包给请求端完成第三次握手。

http2

这里呢,看到这里有个问题了:
第一次握手失败请求端没响应会间隔一个时间后重复发送
第二次握手请求失败之后请求端会重复发送包完成握手
那么第三次握手没有反馈,如果第三次握手失败以后会发生什么呢?这样不是和TCP保证送达的说法有冲突吗?

然后重复看了资料,这里需要注意到:通讯的两头都是四个分层的,客户端和服务端都有对应的TCP层,按照上图的三个箭头路径可以看到:

  1. 每个TCP端都有三个端点(即三次握手)
  2. 当服务器端发送ACK(服务器端进行第三次握手但尚未完成)而客户端尚未接受到时候,此时客户端完成第二次握手等待第三次握手
  3. 如果服务端的发送ACK发送后但是客户端没有请求到,那么客户端第二次握手失败了,将会继续返回一个SYN/ACK,等待ACK包,这样思路就通顺了。

IP

IP属于网络层,《图解HTTP》对IP数据的传输有些语焉不详,说了IP传输需要IP地址和MAC地址两个最重要的数据,但是如何进行传输,中转按照什么规则进行,都没有说到,这里找了其他资料补充一下。

IP大致可以分为三个作用模块:

  1. IP寻址
  2. 路由
  3. 分包和组包

这样,大致就可以理清为什么IP可以一站一站转发了,每个转发服务都会有一个路由表,通过这个路由表来将数据转发到到下一台服务器。

DNS

DNS貌似没啥好说的,简单说,计算机队数据敏感,但是并不能理解单词,不能理解类似aaa.com到底代表什么,所以需要一个协议,将aaa.com这种域名转换成数字ip,使得计算机可以识别。
而DNS,就是负责从域名到ip的转换的协议,就这么简单,对电脑熟悉点的人都知道。

HTTP的特点

HTTP作为一个协议,如果非要给它说个特点,我觉得,它的的特点就是它足够简单。

HTTP特点

这里总结下HTTP:

  1. 服务器与客户端之间的通信协议
  2. 通过请求和响应完成通信
  3. HTTP协议不保存状态,即通信时候不做持久化,发完请求就忘了发给谁,发了什么,收到了什么
  4. 通过URI来定位访问资源

HTTP方法(mehthon)

HTTP的请求方法有:

  • PUT
  • POST
  • PUT
  • HEAD
  • DELETE
  • OPTIONS
  • TRACE
  • CONNECT

这里最常用的应该是GET和POST了。
GET用来获取资源,而POST一般是用来传输实体(最常见的是传输表格数据)