Open Samgao0312 opened 2 years ago
在客户端和服务器之间进行一个 HTTP 请求的发送和返回的过程中,需要先创建一个叫做tcp connection的一个东西,因为http是不存在连接这么一个概念的,它只有请求和响应的概念。那么,请求和响应都是数据包,它们之间是要经过一个传输的通道,这个传输的通道在哪里呢,就在 TCP 里面去创建的。
tcp connection
http
TCP
这个连接(tcp连接)是可以一直保持在那边的,我们的http请求是在这个连接的基础上面去发送的。
这里面就有一个概念,就是在 TCP 连接上面是可以发送多个 http 请求的。不同的 HTTP 版本里面这个模式是不一样的。 (1) 在 HTTP 1.0 里面,连接是在一个 HTTP 请求创建的时候就去创建这个 TCP 连接,连接创建完之后请求发送过去,在服务器响应了之后,这个 TCP 连接就关闭了。 (2) 在 HTTP 1.1 里面,连接可以通过某种方式去声明,可以一直保持在那边,意思就是请求发送完之后连接没有关闭。然后,第二个请求进来的时候它还可以在这个连接上面进行一个发送。
HTTP 1.0
HTTP
HTTP 1.1
那么这有什么好处呢? TCP 连接在创建的过程当中是有三次握手的,三次握手就是代表着有三次网络传输和三次消耗。客户端发送过去是、然后服务端返回也是、最后客户端再发送一次,这个时候才创建了这个tcp连接。连接建立之后才能去发送http请求。所以,如果我们在这个 TCP 连接把它保持在那边,后面的第二个 http 请求就没有三次握手的开销。
tcp
在 HTTP2 里面还有一个好处,就是 HTTP2 里面 TCP 连接和 Http 请求是可以并发的。这就导致在同一个用户对同一个服务器发起一个网页请求的时候它只需要一个 TCP 连接。
HTTP2
Http
客户端发一个数据包给服务端,以发起一个创建连接的请求。这个数据包包含以下两部分:
1. `SYN=1`: 它是一个标志位,就是说我就是一个创建请求的一个数据包。 2. `Seq=X`: `x`是数字,一般来说都等于`1`。
当服务端接收到这个数据包之后,它知道了有一个客户要跟它创建一个连接。那么创建这个连接之后,服务器端就会开启一个TCP的socket的一个端口。当这个端口开启之后,它会返回给客户端一个数据包,数据包里包含以下几部分:
socket
1. `SYN=1`: 客户端数据里面也是一个`SYN=1`的标志位。 3. `ACK=X+1`:`ACK`就等于客户端发送过来的这个`Seq`的值加一。 4. `Seq=y`:这个是服务端的一个`Seq`。
最后,客户端拿到之后,知道服务端已经允许它去打开这个创建的这个 tcp 连接了,它再去发送一个数据包:
1. `Ack = y + 1`: 其中 y 是服务器端返回的数据包中 Seq=y 的值; 2. `Seq=z`:其中 z 是一个新数组。
ok 这就是创建一个tcp连接的过程。
这是为了防止服务端这边它开启一些无用的连接。 我们知道网络传输是有延迟的,客户端和服务器可能隔的非常远的距离,比如要通过一个光纤传输, 还有各种中间的代理服务器来进行一个传输。
那么,传输的过程中,比如:客户端这边它发起了一个SYN=1这个创建连接的请求,如果服务端这边就直接创建了这个连接, 然后服务器端返回了内容给客户端。但是呢,数据包可能因为网络传输的原因丢失了,客户端一直没有接收到服务器返回的东西,客户端这边可能又设置了一个 超时时间,超过了这个时间之后这个连接创建就关闭了。
SYN=1
于是,客户端可能又发起一个新的创建连接的请求,但是这个时候服务是不知道的。。因为没有第三次握手在这里,服务端是根本不知道客户端它到底有没有接收到它返回的信息。并且也没有给服务端一个确认 说要去创建还是要关闭这个请求。。那么,服务器端的这个端口就一直开在那边等待着客户端来发送实际的请求数据了,这个时候服务端这个开销就浪费了。
因为服务器端不知道这个连接已经创建失败了,可能客户端已经去创建一个新的连接去了。所以,我们需要这个三次握手来确认这个过程,让客户端和服务端能够及时的察觉到说 因为网络原因的一些问题导致内容没有查到,然后这个端口这个连接就可以关闭了。我们不需要一直等在那边。
所以,针对这种情况三次握手主要是为了就是规避网络传输延时导致服务器开销的问题。
为什么要有四次挥手? 主要是为了确保双方都知道对方断开连接。
具体步骤为:
FIN
ACK
主要是为了确认双方的接收能力和发送能力是否正常、 指定自己的初始化序列号为后面的可靠性传送做准备
于是乎,它们就断了,分手手续完成
先弄清楚一个概念 —— HTTP请求和TCP连接之间的关系
在客户端和服务器之间进行一个 HTTP 请求的发送和返回的过程中,需要先创建一个叫做
tcp connection
的一个东西,因为http
是不存在连接这么一个概念的,它只有请求和响应的概念。那么,请求和响应都是数据包,它们之间是要经过一个传输的通道,这个传输的通道在哪里呢,就在TCP
里面去创建的。这个连接(tcp连接)是可以一直保持在那边的,我们的
http
请求是在这个连接的基础上面去发送的。那么这有什么好处呢?
TCP
连接在创建的过程当中是有三次握手的,三次握手就是代表着有三次网络传输和三次消耗。客户端发送过去是、然后服务端返回也是、最后客户端再发送一次,这个时候才创建了这个tcp
连接。连接建立之后才能去发送http
请求。所以,如果我们在这个TCP
连接把它保持在那边,后面的第二个http
请求就没有三次握手的开销。在 HTTP2 里面还有一个好处,就是
HTTP2
里面TCP
连接和Http
请求是可以并发的。这就导致在同一个用户对同一个服务器发起一个网页请求的时候它只需要一个TCP
连接。三次握手
客户端发一个数据包给服务端,以发起一个创建连接的请求。这个数据包包含以下两部分:
当服务端接收到这个数据包之后,它知道了有一个客户要跟它创建一个连接。那么创建这个连接之后,服务器端就会开启一个
TCP
的socket
的一个端口。当这个端口开启之后,它会返回给客户端一个数据包,数据包里包含以下几部分:最后,客户端拿到之后,知道服务端已经允许它去打开这个创建的这个 tcp 连接了,它再去发送一个数据包:
ok 这就是创建一个tcp连接的过程。
那么为什么要进行这样的一个三次握手呢?
这是为了防止服务端这边它开启一些无用的连接。 我们知道网络传输是有延迟的,客户端和服务器可能隔的非常远的距离,比如要通过一个光纤传输, 还有各种中间的代理服务器来进行一个传输。
那么,传输的过程中,比如:客户端这边它发起了一个
SYN=1
这个创建连接的请求,如果服务端这边就直接创建了这个连接, 然后服务器端返回了内容给客户端。但是呢,数据包可能因为网络传输的原因丢失了,客户端一直没有接收到服务器返回的东西,客户端这边可能又设置了一个 超时时间,超过了这个时间之后这个连接创建就关闭了。于是,客户端可能又发起一个新的创建连接的请求,但是这个时候服务是不知道的。。因为没有第三次握手在这里,服务端是根本不知道客户端它到底有没有接收到它返回的信息。并且也没有给服务端一个确认 说要去创建还是要关闭这个请求。。那么,服务器端的这个端口就一直开在那边等待着客户端来发送实际的请求数据了,这个时候服务端这个开销就浪费了。
因为服务器端不知道这个连接已经创建失败了,可能客户端已经去创建一个新的连接去了。所以,我们需要这个三次握手来确认这个过程,让客户端和服务端能够及时的察觉到说 因为网络原因的一些问题导致内容没有查到,然后这个端口这个连接就可以关闭了。我们不需要一直等在那边。
所以,针对这种情况三次握手主要是为了就是规避网络传输延时导致服务器开销的问题。
四次挥手
为什么要有四次挥手? 主要是为了确保双方都知道对方断开连接。
具体步骤为:
FIN
: 客户端第一次发送消息给服务端告诉它需要断开连接;ACK
: 服务端收到消息后返回消息告诉客户端:知道了,为了确保服务端收到了之前所有的 HTTP 请求,服务端需要等一等再断开连接FIN
: 服务端确认所有的 HTTP 请求都收到了,主动发消息给客户端:我这边所有的请求都处理完了,我也可以断开连接了ACK
: 客户端收到这个请求后,返回消息告诉服务端:我知道,断开连接吧主要是为了确认双方的接收能力和发送能力是否正常、 指定自己的初始化序列号为后面的可靠性传送做准备
于是乎,它们就断了,分手手续完成