http

《HTTP权威指南》每章的知识点总结

View the Project on GitHub lvzhenbang/http

内容提要

TCP/IP连接

  1. 浏览器从地址栏中解析处域名(主机名),也就是拿到www.xxx.com

  2. 浏览器根据得到的主机名查询出ip地址,比如算出ip为202.43.78.3,(中间可能经过查找host文件或去查询dns服务器)

  3. 浏览器解析出端口(http默认为80,https默认为443)

  4. 浏览器发起一条到202.43.78.3端口为80的链接,(重建需要经过几次确定相关参数的来回“握手”)

  5. 浏览器发起请求报文

  6. 服务器返回响应报文

  7. 浏览器关闭连接(其实浏览器和服务器都可以在不通知对方的情况关闭连接)

	1. ip分组首部(通常为20字节)
	2. tcp段首部 (通常为20字节)
	3. tcp数据块 (0个或多个字节,实际http报文数据就在这里) 

用一句话描述这个过程就是,http报文流给到tcp,tcp把报文分成一段一段的,然后tcp把每个tcp段交给ip,ip封装成一个ip分组,最后传输的是ip分组。(当然了这里我们忽略了ip下面的数据链路层和物理层)

TCP确定一个连接

对TCP性能的考虑

  1. 首先客户端解析ip地址或者端口号需要时间,如果当前没有访问过相关资源,那么解析还需要查询dns服务器,此操作,造成的时延较多,可能花费数十秒。

  2. 建立tcp链接会有建立时延,通常2s左右,如果当前的http事务较多,那么会很快叠加上去。

  3. 传输、处理请求报文需要时间

  4. 回传响应报文需要时间

  5. 当然还有其他因素,比如硬件、网络负载,以及报文尺寸等!

这里简要说明一下,建立tcp链接这个过程可能存在的时延分析,包括:经典三次“握手”、tcp慢启动拥塞控制机制等!

  1. 客户端发送携带“SYN”标记的TCP段说明发起连接请求

  2. 服务端返回“SYN”和“ACK”的TCP段说明已接受

  3. 最后客户端发送确认信息以确认连接

HTTP连接的处理

常被误解的connection首部

	HTTP首部字段名,列出了只与此有关的首部;

	任意标签值,用于描述此链接的非标准选项;

	值close,说明操作完成之后需关闭这条持久连接。

接收端在收到请求报文之后,对报文进行解析,并查看connection首部中列出的首部列表,并在转发出去之前,删除相关首部,这一行为称为:“对首部的保护”。

串行处理事务时延
    并行连接

    通过多条TCP连接发起并发的HTTP连接

    持久连接

    重用TCP连接,以消除连接及关闭时延

    管道化连接

    通过共享的TCP连接发起并发的HTTP请求


并行连接
持久连接
管道化连接

HTTP/1.1允许在持久连接上可选地使用请求管道。这是在keep-alive连接上的进一步性能优化。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向地球另一端的服务器时,第二条和第三条请求也可以开始发送了。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能。

关闭连接的奥秘