TCP

TCP是一种面向连接的协议,可以保证传输的可靠性

TCP是一种全双工的协议

三次握手

三次握手的流程

TCP 三次握手

为什么是三次而不是两次

首先客户端给服务器端发送请求之后,当服务器端收到请求就可以确保客户端的发送功能是正常的

然后服务器端给客户端响应(seq=y, ack=x+1),当客户端收到消息之后,就可以确保服务器端的发送和接收功能都是正常的

此时客户端再给服务器端发送一条响应,那么服务器端就可以确保客户端的接收功能也是正常的。

如果说只进行两次握手,客户端给服务器端发送Hello,服务器端给客户端回一个hi,可能存在一个问题,这个消息并没有被客户端所接收,连接可能会存在数据丢失导致不可靠的问题。

四次挥手

TCP通过四次挥手来保证数据完整传输的

四次挥手需要确保双方后面都不会再发送数据的情况下再进行断开连接

过程:

  1. 客户端给服务器端发送一个带有FIN结束标识和seq=1的断开连接的请求包,主要目的是告诉客户端我这边不再发送数据包了,但是可以接收数据。
  2. 服务器端会给客户端发送一个ack包,表示自己已经知道客户端不会再向自己发送数据了
  3. 服务端给客户端发送一个断开连接的请求包,告知客户端自己这边也不会发送数据了
  4. 客户端给服务器端做出最后的响应,当服务端收到响应之后就会断开连接并释放资源;客户端这边需要等待一段时间再去断开连接,等待的时间是两倍的请求时间。

为什么不能将服务器端的两次请求合并成一个?

第二次挥手和第三次挥手之间是有一定的延迟性的,延迟可能是几秒、几十秒甚至几分钟

第二次挥手直接进行一次确认可以保证不会触发TCP的超时重传机制,减少额外的开销