关于三次握手和四次挥手

参考博客链接1
参考博客链接2
参考以上博客以及书籍,以上博客中写的会更为详细,本篇仅为根据自己的理解,整理成自己更容易理解背诵的样子

首先请结合这两种图通读全文

关于三次握手和四次挥手_第1张图片
关于三次握手和四次挥手_第2张图片

TCP首部中的五个字段含义:

SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。

  • 客户端发送带有SYN标志的数据包-一次握手->服务端
  • 服务端发送带有SYN/ACK标志的数据包-二次握手->客户端
  • 客户端发送带有ACK标志的数据包-三次握手->服务端

三次握手的大概过程

  1. 客户端向服务端发送数据包,告诉对方我要和你建立连接了
  2. 服务端收到并向客户端发送数据包,告诉对方我收到了你的通知
  3. 客户端收到并再次向服务端发送确认,双方建立连接

TCP连接为什么需要三次握手

先说三次握手的过程,再说以下
首先TCP协议是一个面向连接可靠的、基于字节流的传输层协议,为保证TCP连接的可靠性至少三次握手,超过三次也可以但是会造成资源浪费,所以TCP连接需要三次握手。

1 防止重复连接—面向连接
客户端向服务端发送连接即第一次握手,服务端收到并向客户端发送确认信号,如果这个时候就建立连接,在网络如果有延迟的情况下,再发起第二次、第三次连接,就会造成重复或错误连接;
有第三次握手的话,那么客户端在接收到服务器端seq+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。
2 维护可靠的初始序列号—可靠性
(在这里请仔细看TCP首部的示意图,序号为seq,确认号为ack)
客户端想要建立连接,将SYN置为1,随机产生一个序号seq=x,发送给服务端 ;
服务端收到并确认建立连接,将SYN、ACK都置为1, 随机产生一个序号seq=y,确认号为ack=x+1,发送给客户端;
客户端收到并确认建立连接,将ACK置为1,序号为seq=x+1,确认号为ack=y+1,发送给服务端;

正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号。 需要注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。

TCP四次挥手

关于三次握手和四次挥手_第3张图片

● 第一次:客户端告诉服务端,我要关闭连接了,此时客户端不会再发送数据,但能接收数据;
● 第二次:服务端告诉客户端,我知道了,此时服务端可能还在发送数据;
● 第三次:服务端告诉客户但,确认关闭连接;
● 第四次:客户端告诉服务端,我也关闭连接了

服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。当然如果服务端在第二次挥手时已经完成数据传输,就可以直接在第二次发送我知道,并且关闭连接变成三次挥手。

以上,如有错误或不足请指正,谢谢。

你可能感兴趣的:(计算机网络,网络,tcp/ip,网络协议)