谈谈三次握手四次挥手

640 阅读3分钟

三次握手

三次握手的目的:建立TCP连接

过程如图 在这里插入图片描述

图中字符的含义:

  • SYN:连接请求/接收 报文段
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号

第一次握手

客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。

第二次握手

服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1。

第三次握手

客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,也是一样把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1)。

为什么要三次握手

目的是让双方都确认各自的收发的正常的

  • 第一次握手:客户端什么都不能确认,服务器确认对方发送正常,自己接收正常
  • 第二次握手:客户端确认自己和对方的收发都正常
  • 第三次握手:服务器确认自己和对方的收发都正常

四次挥手

四次挥手的目的:释放TCP连接

过程如图 在这里插入图片描述

图中字符的含义

  • FIN :连接终止位
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号。希望收到的下一个数据的第一个字节的序号

第一次挥手

客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接

第二次挥手

服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了。

第三次挥手 如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。

第四次挥手 客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1)。

为什么要四次挥手

因此第二、三次挥手都是从服务器向客户端发出,第二次挥手与第三次挥手之间服务器可能还有数据要发送,不能提前发送FIN

TCP与UDP

  • TCP是面向连接的。UDP是无连接的,发送数据前不需要先建立连接。
  • TCP提供可靠服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
  • 因为TCP可靠,面向连接,不会丢失数据因此适合大数据量的交换
  • TCP是面向字节流,UDP面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP电话和视频会议等)。
  • TCP只能是1对1的,UDP支持1对1,1对多。
  • TCP的首部较大为20字节,而UDP只有8字节。

参考文档

关于 TCP 三次握手和四次挥手,满分回答在此