背景
开始学习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,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
两台计算机交互时候各层之间数据流动:
一次HTTP沟通背后的数据封装:
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)
PS:以上摘自《图解HTTP》
HTTP和TCP,IP,DNS不得不说的故事
实际上本文第一副图已经说明了HTTP和TCP,IP之间密不可分的关系了:
HTTP作为应用层是依赖于TCP和IP层的:
- TCP作为传输层负责将数据打上MAC地址发给网络层IP,开始进行三次握手准备
- IP作为网络层负责将数据打包成报文段进行编号,发送给链路层进行传送
确保数据到达的TCP
TCP在将数据通过IP层下发时候将会打上SYN标记,请求端接受到数据时候,完成第一次握手,返回一个标记有SYN/ACK的数据包,TCP层接受到之后,完成第二次握手,最后发送一个标记有ACK的包给请求端完成第三次握手。
这里呢,看到这里有个问题了:
第一次握手失败请求端没响应会间隔一个时间后重复发送
第二次握手请求失败之后请求端会重复发送包完成握手
那么第三次握手没有反馈,如果第三次握手失败以后会发生什么呢?这样不是和TCP保证送达的说法有冲突吗?
然后重复看了资料,这里需要注意到:通讯的两头都是四个分层的,客户端和服务端都有对应的TCP层,按照上图的三个箭头路径可以看到:
- 每个TCP端都有三个端点(即三次握手)
- 当服务器端发送ACK(服务器端进行第三次握手但尚未完成)而客户端尚未接受到时候,此时客户端完成第二次握手等待第三次握手
- 如果服务端的发送ACK发送后但是客户端没有请求到,那么客户端第二次握手失败了,将会继续返回一个SYN/ACK,等待ACK包,这样思路就通顺了。
IP
IP属于网络层,《图解HTTP》对IP数据的传输有些语焉不详,说了IP传输需要IP地址和MAC地址两个最重要的数据,但是如何进行传输,中转按照什么规则进行,都没有说到,这里找了其他资料补充一下。
IP大致可以分为三个作用模块:
- IP寻址
- 路由
- 分包和组包
这样,大致就可以理清为什么IP可以一站一站转发了,每个转发服务都会有一个路由表,通过这个路由表来将数据转发到到下一台服务器。
DNS
DNS貌似没啥好说的,简单说,计算机队数据敏感,但是并不能理解单词,不能理解类似aaa.com到底代表什么,所以需要一个协议,将aaa.com这种域名转换成数字ip,使得计算机可以识别。
而DNS,就是负责从域名到ip的转换的协议,就这么简单,对电脑熟悉点的人都知道。
HTTP的特点
HTTP作为一个协议,如果非要给它说个特点,我觉得,它的的特点就是它足够简单。
HTTP特点
这里总结下HTTP:
- 服务器与客户端之间的通信协议
- 通过请求和响应完成通信
- HTTP协议不保存状态,即通信时候不做持久化,发完请求就忘了发给谁,发了什么,收到了什么
- 通过URI来定位访问资源
HTTP方法(mehthon)
HTTP的请求方法有:
- PUT
- POST
- PUT
- HEAD
- DELETE
- OPTIONS
- TRACE
- CONNECT
这里最常用的应该是GET和POST了。
GET用来获取资源,而POST一般是用来传输实体(最常见的是传输表格数据)