一,状态码
整体范围 | 以定义范围 | 分类 |
---|---|---|
100〜199 | 100〜101 | 信息提示 |
200〜299 | 200〜206 | 成功 |
300〜399 | 300〜305 | 重定向 |
400〜499 | 400〜415 | 客户端错误 |
500〜599 | 500〜505 | 服务器错误 |
版本号:版本号不会被当作小数来处理版本中的每个数字都会单独比较,例如HTTP / 2.22就比HTTP / 2.3的版本要高,因为22比3大。
常见错误码:
状态码 | 原因短语 | 含义 |
---|---|---|
304 | 没有修改 | 客户端可以通过所包含的请求首部,使其请求变成有条件的。如果端的客户发起了一个条件GET请求,而最近资源未被修改的话,就可以用这个状态码来说明资源未被修改。带有这个状态码的相应不应该包含实体的主体部分。 |
403 | 被禁止 | 用于说明请求被服务拒绝了。如果服务器想说明为什么拒绝请求,可以包含实体的主体部分来对原因进行描述。但这个状态码通常是在服务器不想说明拒绝原因的时候使用的。 |
405 | 方法不允许 | 发起的请求中带有所请求的网址不支持的方法时,使用此状态码。应该在响应中包含ALLOW首部,以告知客户端所请求的资源可以使用那些方法。 |
500 | 内部服务器错误 | 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码。(就是服务端报错了) |
502 | 错误的网关 | 作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应(比如,它无法链接到其父网关)时,使用此状态码。这通常并不意味着上游服务器已关闭(响应无网关 /代理),而是上游服务器和网关/代理不同意的协议交换数据。鉴于互联网协议的英文相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。(就是网关没从服务器中拿到数据,可能是没配置网关,也可能是服务器没启动) |
二,请求
http://www.elapse.club:80/photos/eaf8163b-6dff-4dca-ab47-5eaeba565a2a.png
(1)浏览器解析出主机名www.elapse.club
(2)浏览器查询这个主机名的IP地址(DNS) - > 120.77.41.38
(3)浏览器获得端口号80
(4)浏览器发起到120.77.41.38端口80的链接
(5)浏览器想服务器发送一条HTTP GET报文
(6)浏览器从服务器读取HTTP响应报文
(7)浏览器关闭连接。
三,TCP连接的握手时延
(1)延时确认(“HTTP权威指南”P88)
https://blog.csdn.net/turkeyzhou/article/details/6764389
(2)TCP慢启动
(就是在发送大数据之前,先试探一下服务端的网络状况)。主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小
(3)的Nagle算法和TCP_NODELAY
内格尔算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络速度。
Nagle算法会引发几种HTTP性能问题。首先,小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远不会到来的额外数据而产生时延。其次,Nagle算法与延迟确认之间的交互存在问题 --Nagle算法会阻止数据的发送,直到有确认分组抵达位置,但确认分组自身会被延迟确认算法延迟100-200毫秒。
HTTP应用程序常常会在自己的栈中设置参数TCP_NODELAY,禁用的Nagle算法,提高性能。(如果这么做的话,一定要确保会向TCP写入大块数据,这样就不会产生小堆分组了。)
(4)TIME_WAIT积累和端口耗尽(重要)
https://www.cnblogs.com/tiantiandas/p/time_wait.html
要修正这个问题,可以增加客户端负载生成器的数量,或者确保客户端和服务器在循环使用几个虚拟IP地址以增加更多的连接组合。即使没有遇到端口耗尽的问题,也要特别小心有大量连接出于打开状态的情况,或为处于等待状态的连接分配了大量控制块的情况。在有大量打开连接或控制块的情况下,有些操作系统的速度回严重减缓。
(5) keep-Alive
Connection:keep-Alive 这个首部是请求(希望)将连接状态保持在活跃状态。客户端和服务端并不一定会同意keep-alive会话。他们可以任意时刻关闭空闲的keep-alive连接,并可随意限制keep-alive 连接所处理事物的数量。
为了避免哑代理通信问题的发生,现代的代理都绝不能转发Connection首部和所有名字出现在Connection值中的首部。