TCP/IP协议的三次握手及四次挥手

前言

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。它是在网络的使用中最基本的协议,大多数我们生活中的网络应用都是建立在TCP连接之上的。像我之前参与开发的一套短信网关系统就是根据TCP的keepAlive长连接,客户传输我们数据,我们对数据进行拆粘包。都是建立在TCP的基础上的。

TCP/IP协议定义了一个在因特网上传输的包,成为IP数据报,IP数据报由首部和数据两部分组成。

IP报头中包含了大量的信息,如源IP地址、目的IP地址、数据报长度、IP版本号等。
数据部分保存传输层的数据,如保存TCP、UDP、ICMP等数据

本文主要写TCP的连接和释放也就是我们常说的三次握手四次挥手


TCP报文头

TCP报文头格式

  • 在报文首部中我们先观察源端口目的端口,他们各占了16个比特
  • 之后我们再观察SEQ序号字段,它占了32比特,TCP连接中传送的数据流中的每一个字节都有一个序号,序号字段代表本报文段要发送的数据的第一个字节的序号。
  • 在观察确认号ACK字段,通讯的任何一方在收到对方的一个报文之后都要发送一个相对应的确认报文来表示确认收到。确认报文会包含确认号,他的值表示期望收到的对方的下一个报文段的序号值。

如何标示他是一个确认报文呢?我们要关注如下三个标志位:

  1. ACK:只有当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。
  2. SYN:同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。
  3. FIN:用于释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放连接。

三次握手

TCP连接建立的方式主要采用客户与服务器的方式,主动发起连接建立的应用进程称之为Client,被动等待连接建立的应用称之为Server,TCP/IP中采用三次握手来建立一个连接。

三次握手


  1. 第一次握手时,Clent向Server发送一个连接请求,所以需要设置SYN=1,同时,我们需要发送自己的序列号Seq=X
  2. 第二次握手时,通讯的任何一方在收到对方的一个报文之后,需要发送一个确认报文,这时候服务器发起第二次握手,来回复客户端端一个确认报文,确认报文,需要设置ACK=1,接着发送一个确认号ACKnum,这个确认号就是期望收到对方的下一个报文段的数据的第一个字节的序号,这时候我们确认序号等于X+1,+1代表的是他收到了SYN标示,SYN这也是个连接接收的报文,我们还需要发送SYN=1,同时附带自己的序列号Y
  3. 第三次握手时,这时候客户端收到服务器的响应报文,需要回复确认报文,确认报文ACK=1,ACKnum=Y+1,表示收到了SYN表示,之后就TCP连接建立成功了。

Q1:为什么是三次握手?
A1:前两次报文表示服务器可以收到报文,也可以发送给客户端,但是服务器不知道客户端能不能收到,所以需要三次握手,即客户端在发送一个确认报文。

四次挥手

这时候客户端想要关闭连接,就要四次挥手才能释放连接了。
四次挥手

  1. 第一次挥手,客户端发送一个FIN=1的包,表示当前报文是请求释放报文,同时带上自己的序列号X
  2. 第二次挥手,服务器需要确认客户端的FIN包,表明自己接收到了客户端的关闭连接的请求于是发送一个确认包ACK=1,ACKnum=X+1
  3. 第三次挥手,由于第二次挥手,确认了客户的关闭其扭曲,但是还没有准备好关闭连接,等到服务器准备好关闭连接的时候,向客户端发送结束连接的请求,即FIN=1,Seq=Y
  4. 第四次挥手客户端收到了服务器的关闭连接的请求,这时候他需要发送一个确认包ACK=1,ACKnum=Y+1,服务器接到这个确认包之后就会关闭连接,进入CLOSED状态,如果服务器端关闭连接之后,他不会再响应客户端,这时候客户在等待某个固定时间后,将会自行关闭,进入CLOSED状态,这时候就完成了TCP连接的释放