自己空余的时间,做了一些总结性的笔记。每次阅读都会有不一样的收获。决定做一个笔记,记录下来。
一、认知
1.1 TCP/IP 协议族
常见的协议族成员:TCP、UDP、IP、HTTP、ICMP、DNS、FTP、SNMP等等,互联网依托这些协议关联起来。协议的统称认知为: TCP/IP ,HTTP就是协议族中一员。
1.2 协议族为什么分层
TCP/IP,分为四层,也有一种说法OSI七层模型。分层设计因为整个协议族涉及的协议很多,如果没有良好的分层接口设计,则修改一处可能引起多处改动,不利于维护,升级。跟我们应用架构一个道理。
- 应用层:为开发者,用户,提供API接口及通信应用服务。
- 传输层:为应用层提供设备之间的数据传输相关控制。
- 网络层:传输线路的规划选择,传输数据。
- 数据链路层:处理网络相关的硬件设备
更多细节的原因,需要深入每一层细细研究。
1.3 协议族的数据流
访问 www.ldysjun.com,产生的数据会在整个协议族中流转,HTTP协议发起web页面请求,TCP分割数据传输,IP规划传输路线传输数据,链路层接收。
- 客户端:应用层->传输层->网络层->数据链路层
- 数据链路层->网络层->传输层->应用层:服务器
(1)传输前对www.ldysjun.com,使用DNS服务进行解析
- DNS可以通过域名查找到对应的ip地址
(2)TCP 协议提供可靠传输、对数据的可控
- 依靠三次握手,使用SYN、ACK标志位确定传输可靠性
- 通过字节流传输服务,将数据分割传输,做到可控。
(3)IP协议的传输依靠需要ip地址、MAC地址。理论上网络设备出厂后MAC是唯一的。为什么有了MAC地址还需要ip地址呢?
- 依靠MAC地址在全球所有机器中寻找一个目标机器,很复杂。网络希望路由转发规则越简单越好。
- 可以依靠IP地址到达目标机器所在的网关,因为局域网内IP地址是不确定的,所以依靠ip地址寻址是不严谨的,所以依靠ARP找到对应的MAC地址。
- 机器从一个网络移动到另一个网络,只需要当前网络重新分配一个ip地址就可以。
1.4 总结
HTTP的使用依靠整个协议族成员的相互配合。各个协议族成员在各层中扮演着不同的角色,目的就是实现全球网络的通信。各个模块相互独立,发挥各自作用,TCP/IP的相关设计有很多值得思考,并且应用在于我们系统的设计。
二、初识HTTP
2.1 URL : 统一资源定位符
有时候会听到URL,有时会听到URI。URL 与 URI 的关系?(相关回答摘要自知乎用户wuxinliulei)
- URL是URI的子集
- 一个 URI 实例和一个支持语法意义上的、依赖于方案的比较、规范化、解析和相对化计算的结构化字符串差不多。
- 作为对照,URL 类的实例代表了 URL 的语法组成部分以及访问它描述的资源所需的信息。URL 必须是绝对的,即它必须始终指定一个方案
2.2 URL 结构
URL由Scheme(协议)、User(登录信息认证)、Host(服务器地址:端口)、Path(路径)、RawQuery(参数)、Fragment(片段符)组成
(1)例如:
1 | http://user:pass@host.com:4366/path/main?k=v#f |
Scheme | User | Host | Path | RawQuery | Fragment |
---|---|---|---|---|---|
http | user:pass | host.com:4366 | path/main | k=v | f |
2.3 请求
浏览一个页面,在浏览器中输入地址http://lastdays.cn/,会发生什么?简要概括总结下。
发起请求,客户端会生成以下报(我先过滤掉一部分,更详细的后面说明)。
1 | GET / HTTP/1.1 |
GET表示方法,/表示资源对象,HTTP/1.1表示使用的HTTP版本号。
HOST域名
总结起来,请求由,请求方法,请求资源路径,协议版本,还有一些可选字段组成。
2.4 响应
请求发出后,服务端会返回一个响应报文,携带着数据。
1 | HTTP/1.1 200 OK |
首部信息就是版本信息,状态码,原因短语。下面是包含一些其他信息,例如相应时间,其中Last-Modified经常用在客户端数据缓存更新的策略上。其他想赢内容还有一些静态文件。
总结:响应报文由协议版本,状态码,原因短语,以及其他可选字段构成
2.5 方法
请求头中看到GET方法,除了GET,还有:PUT、DELETE、POST、PUT
method | 描述 |
---|---|
GET | 请求指定的资源文件,如果目标地址是CGI服务,可能需要经过一些处理后返回 |
POST | 传输实体数据,也可以获取资源,但是定位并不是为了获取响应的主题内容 |
PUT | 作为文件传输,可以将文件传输到指定位置。因为安全原因,很多web服务并不支持 |
DELETE | 与PUT对应,删除指定路径的文件,web服务会添加验证机制进行开放 |
HEAD | 跟GET方法一样,但是不返回主体部分,经常用于资源有效期的询问 |
OPTIONS | 询问制定资源支持的方法 |
如果使用指定资源不支持的方法,会发生什么?
返回405错误信息,最好提供一个说明,例如
1
{"message":"Method Not Allowed"}
2.6 keep-alive
keep-alive(持久连接),初始版本每进行一次HTTP通信,就要经历一次TCP的断开连接,随着互网联媒体的发展。大量的音频,图片数据在传输中不停地断开连接。造成了一定的性能影响。所以出现了keep-alive(持久连接),一次连接,多次请求响应。
通过管线化的方式实现异步传输,管线化之前需要进行同步传输,管线化后,不需要等待回包,就可以进行下一次请求。
1.7 Cookie
Cookie的引入是因为HTTP协议本身是无状态的。在不修改HTTP无状态特性下,又为HTTP增加状态管理的目标出发,引入了Cookie。服务端通过Set-Cookie控制客户端是否保存Cookie
比如一个登入操作
- 客户端登入,服务端回包,附带Cookie数据
- 客户端保留Cookie
- 客户端再次请求,携带Cookie
- 服务端接收Cookie,校验,判断客户端之前登入过,赋予之前的状态信息
三、报文
3.1 请求报文
HTTP服务间交互的信息称为报文。
- 客户端:发出请求报文
- 服务端:回包响应报文
请求报文,响应报文
结构 | 描述 |
---|---|
请求行 | 版本信息、状态码 |
首部字段 | 通用首部、请求首部、响应首部、 |
其他 | Cookie、其他RFC首部 |
请求报文:
1 | GET / HTTP/1.1 |
响应报文:
1 | $ curl -I www.baidu.com |
3.2 编码
HTTP数据传输,可以传输原始数据,也可以使用编码,提升传输效率。注意,编码过程本机需要消耗CPU。编码后的实体由接收端解码。
内容编码 | 描述 |
---|---|
gzip | GNU |
compress | UNIX系统的标准压缩 |
deflate | zlib |
identity | 不进行编码 |
3.3 分割传输
大数据分割传输,可以让浏览器逐步显示。称之为,分块传输编码。
- 分块传输编码:每一块使用十六进制来标记大小,实体最后一块使用“0(CR+LF)”来标记。客户端负责接收解码,组装。
3.4 对象集合
客户端文件上传技术,大多数使用对象集合的方式,利用MIME来描述数据类型,在MIME中使用Multipart容纳多份不同数据类型数据。因此发送的报文可以包含图片,视频等媒体信息。多部分数据类型如下:
类型 | 描述 |
---|---|
multipart/form-data | web表单文件上传使用 |
multipart/byteranges | 响应报文,包含多段内容使用 |
3.5 范围请求
对于客户端而言,断点续传功能是一个很重要的能力。例如,暂停下载 ,回复下载。客户端实习该能力的方式基本流程就是,记录文件总大小,已经接受数据大小,未接受数据大小。通过范围请求,请求固定范围大小的数据。
例如:对于一份20000字节大小的数据,使用范围请求,可以请求,500-10000的数据。
byte范围设置格式:
500-10000数据
1
Range:bytes=500-10000
10001之后的所有数据
1
Range:bytes=10001-
多重范围
1
Range:bytes=500-7000,10001-
范围请求,返回码为206,响应首部Content-Type标记为multipart/byteranges。范围请求失败,返回码为200。
四、状态码
4.1 简介
针对状态码,客户端可以了解请求状态,请求是否发生错误,针对不同的状态,做出相应的处理动作。
code | 类别 | 原因短语 |
---|---|---|
1XX | 信息性状态 | 请求正在处理 |
2XX | 成功 | 请求处理完成 |
3XX | 重定向 | 请求需要做附加操作 |
4XX | 客户端错误 | 服务端无法处理该请求 |
5XX | 服务端错误 | 服务端 |