URI:包括URL和URN
URN:统一资源名称,在收索过程中由一个中间资源定位符,定位符服务器对资源的实际URL进行等级和跟踪,所以client可以请求一个永久的URL,定位符将clien定向到实际的URL。
URL:<sheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
<sheme>:协议,包括:
http
https :在应用层(http协议)和传输层(tcp协议)之间插入安全层ssl的端到端加密机制
ftp :文件
mailto :email
rtsp,rtspu :通过实施流传输解析的音/视频媒体资源的标识符
file :指定主机的文件(本地磁盘,,网络文件或文件共享系统)
news
telnet
<frag> :请求资源的部分或片段
报文:起始行,头部,正文
起始行:请求行 method url http_version 和 响应行 http_version status reason
method: put,post,delete,get,head(不实际获取资源,查看资源状态),trace(诊断),options(请求服务器支持的功能,例如Allow:GET,PUT,POST,DELETE)
头部: content_type等
TCP连接:
浏览器通过DNS解析域名->浏览器请求TCP连接->服务器接受应答->浏览器发送http请求->服务器从TCP连接中读取请求报文->服务器处理>服务器会送http响应
TCP将http报文将数据流分成段的小数据块,分装在IP分组中
IP分组包括:
1 IP分组首部(ip源地址和目的地址,长度和其他);
2 TCP段首部(源端口号,目的端口和数据排序完整性检查等字段)
3 TCP数据块
TCP连接问题:
tcp连接时的握手时延
延时确认
tcp慢启动:tcp限制了分组传输数量,但是如果成功发送了一个分组就获取了发送两个分组的权限,之后获取了发送四个分组的权限。这种方式称为 打开拥塞窗口
nagle算法和tcp_nodelay :Nagle 算法鼓励发送全尺寸(LAN 上最大尺寸的分组大约是 1500 字节,在因特网 上是几百字节)的段。只有当所有其他分组都被确认之后,Nagle 算法才允许发送 非全尺寸的分组,引发几种 HTTP 性能问题。尤其对于小的报文,HTTP 应用程序常常会在自己的栈中设置参数 TCP_NODELAY,禁用 Nagle 算法
TIME_WAIT :当某个 TCP 端点关闭 TCP 连接时,会在内存中维护一个小的控制块,用来记录最 近所关闭连接的 IP 地址和端口号。这类信息只会维持一小段时间,通常是所估计的 最大分段使用期的两倍(称为 2MSL,通常为 2 分钟 8)左右 ,客户端每次连接到服务器上去时,都会获得一个新的源端口,以实现连接的唯一性。 但由于可用源端口的数量有限(比如,60 000 个),而且在 2MSL 秒(比如,120 秒)内连接是无法重用的,连接率就被限制在了 60 000/120=500 次 / 秒。
Connection首部:Connection 首部字段中有一个由逗号分隔的连接标签列表,这些标签为 此连接指定了一些不会传播到其他连接中去的选项。Connection: close 来说明发送完下一条报文之后必须关闭的连接。
串行连接:
减少tcp事务处理延时方法:
•并行连接
通过多条 TCP 连接发起并发的 HTTP 请求。问题:带宽占用太多,消耗服务器内存资源,tcp慢启动性,以及额外的开销可能时加载时间比串行更长
• 持久连接
重用 TCP 连接,以消除连接及关闭时延。问题:可能出现空闲链接。
客户端发送头部connection:keep-alive,服务器如果应答,返回connection:keep-alive,且不关闭连接,客户端如果收到connection:keep-alive,不关闭连接,否则关闭连接
connection:keep-alive
keep-alive:max=5,timeout=120 //最多为5个事务保持连接的打开状态打开状态到连接空闲2min之后,
但是亚代理不支持keep-alive,会带来问题:
解决方法:http/1.1在默认情况下激活持久连接,除非头部包含connection: close,但是客户端可以关闭空闲的连接。
一个客户端对任何服务器或代理最多只能维护两条持久连接。
• 管道化连接
通过共享的 TCP 连接发起并发的 HTTP 请求
• 复用的连接 交替传送请求和响应报文(实验阶段)。
限制:如果无法确认连接是持久的,不应该使用管道;相应顺序要和请求顺序对应;不应该用管道化的方式发送有副作用的请求,比如post(如果post失败,客户端不确定是否需要再发送)