HTTP中的TCP三次握手-详细解析(TCP ConnectionTCP的三次握手介绍为什么创建TCP三次握手)
Posted 黑木令
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP中的TCP三次握手-详细解析(TCP ConnectionTCP的三次握手介绍为什么创建TCP三次握手)相关的知识,希望对你有一定的参考价值。
TCP三次握手:
废话不多说, 直接上代码以及图例 (为了让大家方便阅读, 都有自己验证过程的一些图片作为分享) 。
1. 了解 TCP Connection
1. 在了解 TCP 之前我们需要了解的一个概念 TCP Connection(连接) :
1. 在我们的客户端和我们的服务器之间进行一个 http 请求的发送和返回的过程当中, 我们是需要去创建一个 TCP Connection 的一个设置 。
1. Connection 头设置为 Connection: keep-alive 意思是: 完成这个 HTTP 请求之后, 不要断开 HTTP 请求使用的 TCP 连接 。
2. HTTP/1.1 把 Connection 头写进标准, 并且默认开启 持久化连接; 除非 Connection 在请求中声明为 Connection: close, 那么浏览器和服务器之间是会维持一段时间的 TCP连接, 不会一个请求结束就断掉 。
3. 因为 http 是不存在 '链接' 这样的概念的, 它只有请求和响应这样的一个概念, 请求和响应都是数据包, 它们之间是需要一个传输的通道的, 那么它们传输的通道在哪里呢? 就是在 TCP 中创建了一个从客户端发起到服务端接收的一个链接, 这个链接是可以一直保持在那里的 。
4. 我们的 http 请求就是在(TCP)创建的链接的基础上面去发送的 。
5. 在 TCP链接 上面是可以发送多个 http请求 的,
1. HTTP1.0 : 这个 TCP链接 是在 http请求 创建的时候, 他就去创建这个 TCP 链接, 链接创建完成之后请求发送过去, 然后服务器响应之后, TCP 链接就关闭了 。
2. HTTP1.1 : 这个 TCP链接 可以通过某种方式去声明让这个 TCP链接 一直保持着; 也就是我们的一个 http请求 发送完成之后 TCP链接 没有关闭, 第二个请求过来的时候, 它还可以在这个 TCP链接 上面发送; 这个有什么好处?
1. TCP链接 在创建的过程中是有三次握手这样的一个消耗的, 三次握手代表着有三次网络传输: 客户端发送一次, 服务端返回一次, 然后客户端再发送一次; 这个时候才创建了 TCP 链接, 然后才能去发送 HTTP 请求(http与tcp的关系) 。
2. 如果我们将 TCP链接 保持在那边, 那么第二次 HTTP请求 就没有三次握手的开销 。
3. HTTP2 : 在 http2 里面 TCP链接 上面的 http请求 是可以并发的 。 这就导致我们在同一个用户同一个服务器发起一个网页请求的时候, 他只需要一个 TCP链接 。
图片示例:
2. TCP(HTTP) 的三次握手介绍:
1. 第一次握手:*
1. 客户端发起一个需要创建链接(发送)数据包的一个请求, 它发送到服务端 。
2. SYN(标志位) : 占据了第一个标志位 (假设: SYN = 1), 就是说这是一个创建请求的数据包 。
3. Seq : (假设 Seq=X) Seq = 数字, 一般来说它是等于 1 。
2. 第二次握手:
1. 服务端接收到了第一次握手的数据包之后, 就知道有客户端要与服务端创建连接了, 创建这个链接之后, 服务端就会开启一个 TCP selector 的一个端口, 然后这个 TCP selector 端口开启之后, 返回给客户端 。
2. SYN : 标志位 。
3. ACK : (ACK=X+1) ACK 就等于, 第一次握手发送的 Seq + 1 。
4. Seq : (Seq=Y)服务端的一个 Seq, 与客户端的 seq 不同 。
3. 第三次握手:
1. 当客户端拿到这个 服务端的 Seq, 也就是服务端允许客户端打开这个创建的 TCP链接 了, 客户端再去发送它的 ACK(ACK=Y+1), 然后它的 Seq 又等于一个新的数字 。
2. ACK : (ACK=Y+1)ACK 就等于, 第二次握手发送的 Seq 的值 +1 。
3. Seq : (Seq=X+1)Seq 等于服务端第二次握手服务端返回的 ACK 。
图片示例:
图片示例:
3. 为什么我们要去创建 TCP 三次握手呢:
1. 这是为了防止服务端这边开启一些无用的链接 。
2. 我们知道网络传输是有延时的, 因为我们中间隔着非常远的距离, 要通过 光纤 / 中间的代理服务器 进行一个传输 。
3. 那么传输的过程中, 比如说客户端这边发送了一个 SYN=1 创建链接的请求, 如果服务端就直接创建了链接, 那么他返回了内容给客户端, 但是这个服务端传输的这个数据包因为网络传输的原因丢失了, 它丢失时了之后客户端就一直没有接收到服务器返回的这个东西, 有可能设置超时时间, 超过了这个时间这个请求就关闭了;
4. 这个时候我们可能发起一个新的创建链接的请求; 这个时候服务端是不知道的, 如果没有第三次握手在这里的话, 服务端是根本不知道有没有接收到它返回的信息, 并且客户端没有给服务端一个确认是要创建还是要关闭这个请求;
5. 那么服务端就一直开着, 等着客户端发送实际的请求数据, 那么这个时候服务端的这个开销就浪费了, 因为服务端不知道这个链接已经创建失败了客户端可能已经去创建新的链接去了 。
6. 我们需要第三次握手来确认这个过程, 让服务端能够及时的察觉到我们因为网络原因的一些问题这个链接已经关闭了, 服务器不需要一直等在那边 。
7. TCP 三次握手主要是为了规避网络传输过过程中的延时导致的服务器开销的一些问题 。
之前有整理过部分知识点, 现在将整理的相关内容, 验证之后慢慢分享给大家; 这个专题 就是 “HTTP协议原理与实践代码” 的相关专栏; 不积跬步,无以至千里, 戒焦戒躁 。
如果对你有所帮助,喜欢的可以点个关注, 必然回关; 文章还一直持续打磨 。
有什么想要了解的前端知识吗? 可以评论区留言, 会及时跟进分享所提内容 。
整理知识点不易, 每次都是在工作繁忙之余夜深人静之时整理, 无论知识点是大是小, 都会验证后再分享, 以防自己发表的文章给大家造成误导 。如有问题还望不吝赐教,本人会及时更改 (本文原创, 如需转载,请注明出处) 。
HTTP协议原理上篇文章: HTTP 协议详解和版本介绍(HTTP发展历史)
以上是关于HTTP中的TCP三次握手-详细解析(TCP ConnectionTCP的三次握手介绍为什么创建TCP三次握手)的主要内容,如果未能解决你的问题,请参考以下文章