三次握手
- 客户端发起一个我要创建的连接数据包的请求发送到服务端,这里面有个标志位syn=1(创建请求的数据包),seq=X
- 服务端接收到数据包之后知道了我有一个客户要跟我创建连接了,创建连接之后呢,开启TCP Socket的端口,端口开启之后呢,返回给客户端,返回给客户端数据里也是一个syn的标志位,返回ack=X+1,seq=Y再发送一个seq,服务端的seq
- 客户端拿到了之后说服务端允许我创建这个TCP连接了,它再去发送它的ack=Y+1,seq=Z(seq又等于一个新的数字)这就是创建一个TCP连接的过程
为什么要进行三次握手
为了防止服务端开启一些无用的连接,因为我们知道网络传输是有延时的,因为我们中间可能隔着非常远的距离,要通过光纤,然后还有各种中间的代理服务器,来进行一个传输,传输的过程当中,比如说客户端这边发起了一个syn=1创建连接的请求,如果服务端这边就直接创建了这个连接,返回的这个内容给客户端,这个数据包因为网络传输的原因丢失了,丢失了之后,客户端就一直没有接收到服务器返回的这个东西,它这边有设置了一个超时时间说我关闭了,超过了这个时间之后连接创建就关闭了,我可能再发起一个新的创建连接的请求,这个时候服务端,如果我们没有第三次握手在这里的话服务端是根本不知道客户端它到底有没有接收到我返回的信息,并且它没有给我一个确认要创建还是要关闭这个请求,那么它这边的端口就一直开着等着,客户端来发送实际的请求数据了,那这个时候服务端开销就浪费了,因为它不知道连接已经创建失败了,客户端可能去创建别的新的连接了,所以我们需要三次握手来确认这个过程,让客户端和服务端能够及时的察觉到说我们因为一些网络原因的问题导致数据端没有查到,这个端口连接就已经关闭了,我们不需要一直等在那边,所以这种情况。三次握手主要是为了规避网络传输当中延时而导致的一些服务器开销的问题。
HTTP请求创建TCP连接的过程当中三次握手数据包的一个详细内容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。