-
Notifications
You must be signed in to change notification settings - Fork 32
/
5.1、HTTP、SMTP、POP3.md
226 lines (134 loc) · 9.74 KB
/
5.1、HTTP、SMTP、POP3.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# HTTP
格式
<img src="https://img-blog.csdnimg.cn/20210112202731929.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt=""http协议请求报文格式"" width="70%"/>
非持续连接和持续连接
* 非持续连接(HTTP 1.0):每个请求/响应报文经一个单独的TCP连接发送
<img src="https://img-blog.csdnimg.cn/20210112202759501.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt="image-20210105122237000" width="25%"/>
* 响应1个对象:2RTT+文件传输时间
* 非持久性连接的问题
* 每个对象需要2个RTT
* 操作系统需要为每个TCP连接开销资源(overhead)
* 持续连接(HTTP 1.1):所有请求/响应经相同的TCP连接发送
* 保持TCP连接打开
* TCP连接经过一定时间没有使用,则关闭
* 两种方式
* 非流水线方式
* 流水线方式(可以并行)
## 细节阐述
Http 首部(大概是40多个,根据实际用途分为4中类型)
* 通用首部字段(General Header Fields) 请求和响应报文两方都会使用的首部字段。
* 常见:date、Cache-Control、pragma(历史遗留字段,仅为 no-cache)、Transfer-Encoding(传输编码,如 chunk)
* 请求首部字段(Reauest Header Fields)客户端向服务器发送请求的报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关的优先等级信息。
* 常见:Accept(媒体类型)、Accept*(Encoding、Language、Charset)、If\*(Match、Modified-since、...)、Host(目标主机域名或IP,因为被 DNS 解析后没有域名了)、Rerfer(发起请求页面域名或IP,包含相对路径,即 "/" 后的)、Origin(发起请求的页面或IP,不包含相对path,用来判断跨域)、UserAgent、range
* 响应首部字段(Response Header Fields)从服务器向客户端响应时使用的字段,补充响应的附加内容,也会要求客户端附加额外信息
* 常见:Accept-Range、Location(重定向的url)、Server
* 实体首部字段(Entiy Header Fields) 针对请求报文和响应报文的实体部分使用首部。补充了资源内容更新时间等实体有关的信息。
* 常见:Content*(Language、Encoding、Lenth、Type、Ranges..)
HTTP状态码
| 分类 | 描述 |
| ---- | ---------------------------------------------- |
| 1** | 信息,服务器收到请求,需要请求者继续执行操作 |
| 2** | 成功,操作被成功接收并处理 |
| 3** | 重定向,需要进一步的操作以完成请求 |
| 4** | 客户端错误,请求包含语法错误或无法完成请求 |
| 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
## 版本对比
HTTP协议
* HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
* HTTP协议的**性能瓶颈及其优化技巧都是基于TCP协议本身的特性**。
* 如TCP建立连接时三次握手有1.5个RTT(round-trip time)的延迟,并且 TCP 还有慢启动的特性,开始时的发送窗口也很小,所以应用层会选择不同策略的连接重用方案。
* HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
Http1.x
- 缺陷:**请求限制阻塞**,在同一时间,同一域名的请求有一定数量限制(连接数的限制和一个连接允许发送的请求数限制),超过限制数目的请求会被阻塞。会让每个连接的流水线经常出现断流,因为尤其一个 前端页面的文件,在初始化的时候会有许多请求(包括 png、js、css 还有其他静态资源或者 ajax 请求)。
- 还有对请求大小没有限制,如果一个请求很耗时,那么这个请求就长时间得不到回复,那么浏览器没法发下一个请求,会加剧流水线断流。
* http1.0
* 缺陷:**连接无法复用**,延时和资源消耗
* 解决方案:添加头信息——非标准的Connection字段`Connection: keep-alive`
* http1.1
* **持久连接**:引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用
* **管道机制**:即在同一个TCP连接里面,客户端可以同时发送多个请求。
* **断点续传**:HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始,使用 Range(请求头) & Content-Range(响应头)
* **新增请求方式**:PUT、DELETE、OPTIONS、TRACE、CONNECT
* **其他请求头**:身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
HTTP/2.0
* 特点
* 采用二进制格式而非文本格式;
* **完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行**;
* 使用报头压缩,降低开销
* 服务器推送
* **二进制协议**
* HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。
* 二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
* **完全多路复用**
* HTTP/2 的多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
* 因此 HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。
* **报头压缩**
* HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。
* 对于相同的头部,不必再通过请求发送,只需发送一次;
* 客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。
* HTTP/2 对这一点做了优化,引入了头信息压缩机制;
* 头信息使用gzip或compress压缩后再发送;
* 服务器推送
* HTTP/2 允许服务器未经请求,主动向客户端发送资源;
* 通过推送那些服务器任务客户端将会需要的内容到客户端的缓存中,避免往返的延迟
# SMTP、POP3
Email应用的构成组件
* 邮件客户端(user agent)
* 读、写Email消息
* 与服务器交互,收、发Email消息
* Outlook, Foxmail, Thunderbird
* Web客户端
* 邮件服务器
* 邮箱:存储发给该用户的Email
* 消息队列(message queue):存储等待发送的Email
* SMTP协议(Simple Mail Transfer Protocol)
* 邮件服务器之间传递消息所使用的协议
* 客户端:发送消息的服务器
* 服务器:接收消息的服务器
Email消息的传输/交换协议:SMTP 协议
* 使用TCP进行email消息的可靠传输
* 端口25
* 传输过程的三个阶段
* 握手
* 消息的传输
* 关闭
* SMTP以**命令—应答的方式**实现双方的通信
* 14个命令:ASCII文本
* 21种应答信息:状态代码和语句
* 交互示例
* telnet servername 25
* 服务器返回代码220
* 输入以下命令与SMTP服务器交互:HELO、MAIL FROM、RCPT TO、DATA、 QUIT
<img src="https://img-blog.csdnimg.cn/20210112202833412.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt="image-20210105135749880" width="40%" />
Email 消息格式
* RFC 822:文本消息格式标准
* 头部行(header):To、From、Subject
* 消息体(body):消息本身(只能是ASCII字符)
* MIME:多媒体邮件扩展 RFC 2045, 2056
* 通过在邮件头部增加额外的行以声明MIME的内容类型
* 增加了邮件主体的结构
* 定义了传送非ASCII的编码规则
<img src="https://img-blog.csdnimg.cn/20210112202856929.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt="image-20210105135911561" width="40%" />
* 增加5个新的邮件首部
* MIME-Version
* Content-Description
* Content-Id
* Content-Type:邮件主体的类型
* Content-Transfer-Encoding:邮件的编码方式,Base-64
<img src="https://img-blog.csdnimg.cn/20210112202926828.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt="image-20210105134704874" width="45%" />
SMTP一般不使用中间邮件服务器
* 发送方的邮件服务器与接收方邮件服务器直接建立TCP连接
* POP3: 采用TCP连接,端口110
* 认证过程
* 客户端命令
* User:声明用户名
* Pass: 声明密码
* 服务器响应
* +OK
* -ERR
* 事务阶段
* List:列出消息数量
* Retr:用编号获取消息
* Dele: 删除消息
* Quit
<img src="https://img-blog.csdnimg.cn/20210112202953768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70" alt="image-20210105135723467" width="25%"/>