http协议介绍

tcp

  1. 三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

    把大象放冰箱,总共分三步:

    • 客户端告诉服务端我要连你了

    • 服务端告诉客户端我收到了你的信号,连吧

    • 客户端告诉服务端:那我就要连了 服务端连上了之后

    • 假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

    • 服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

    • 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

    • 客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

    服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

    客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

  2. TCP KeepAlive

    TCP KeepAlive 的基本原理是,隔一段时间给连接对端发送一个探测包,如果收到对方回应的 ACK,则认为连接还是存活的,在超过一定重试次数之后还是没有收到对方的回应,则丢弃该 TCP 连接。

http

http1.0 和1.1 发布时间很早 也没差几个月。我们基本上最开始用的都是1.1

2015年后发布2.0 于谷歌浏览器而言,使用2.0 要求强制使用https协议。

但实际上两者之间可以单独使用

1.1 的主要功能有:

1. keep-alive 选项,建立连接后,在一定时间内不会断开,其他请求都可以使用这条连接。
2. pipelining 管道,通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器的响应只能够一个接着一个的返回 (但各大浏览器有些不支持/默认关闭,因此这功能可以说是鸡肋)

2.0 加入了哪些内容

1. 二进制分帧 
    在应用层与传输层之间增加一个二进制分帧层以此达到“在不改动HTTP的语义,HTTP 方法、状态码、URI及首部字段的情况下,突破HTTP1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。使用二进制代替纯文本在网络中传输,速度更快
2. 多路复用
    户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。注意,同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送stream,也可以一边接收者服务器的响应,而服务器那端同理。(个人猜测实现上应该是,发送请求时,判断当前请求地址上有没有已建立的tcp链接,有就复用,反证目前包可以打乱。请求结束时候,判断当前tcp链接上是否还有包没响应,没有就关上)
3. 请求优先级
    既然所有资源都是并行发送,那么就需要「优先级」的概念了,这样就可以对重要的文件进行先传输,加速页面的渲染。
4. 预测资源请求
    服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。

https

参考文章

HTTP/2.0 简单总结 tcp

Last updated