一、TCP协议简述
TCP协议位于传输层用来建立传输数据的通道以及传输数据,那么在这一层的tcp协议就涉及到客户端与服务端通信的连接,数据的传输、关闭连接。
通信的连接使用的就是客户端与服务端的三次握手,一旦三次握手成功就建立了双方的通信通道;接着就可以互相通信传输数据了;最后传输数据完成后断开双方通道,通过四次挥手。
上图中简单的画出建连接的三次握手、数据传输、断开连接的四次挥手过程。上图中涉及到一些参数,这里做一些了解。
参数 | 含义 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
seq | 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号 |
ACK | 确认号是否有效,一般置为1。(ACK=0时,确认号无效) |
FIN | 用来释放(断开)一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接 |
注意:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
二、三次握手
- 第一次握手
客户端发送发送SYN包到服务器,请求建立连接,并进入SYN_SENT状态,等待服务器确认;
- 第二次握手
服务端收到客户端发送的SYN包后进行确认(将ACK的值置为收到的序号+1),并且服务端再给客户端发送ACK,告诉客户端自己已经收到并且确认了,然后服务端进入SYN_RCVD状态;
- 第三次握手
客户端收到服务端的SYN和ACK包后,向服务器发送确认包ACK(ack=x+2),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
三、四次挥手
四次挥手是客户端和服务端数据交互完毕进行断开连接所需要做的工作。
- 第一次挥手
客户端发送一个FIN,用来关闭客户端和服务端之间的数据传输,此时客户端进入FIN_WAIT_1状态。
- 第二次挥手
服务端收到客户端的FIN后,发送一个ACK给客户端表示确认,确认号序号为收到序号+1(x+2),此时服务端进入CLOSE_WAIT状态。
- 第三次挥手
服务端向客户端发送一个FIN,用来关闭服务端到客户端的数据传输,此时服务端进入LAST_ACK状态。
- 第四次挥手
客户端收到服务端发送过来的FIN,进入TIME_WAIT状态,并且发送一个ACK给服务端,确认序号为收到序号+1(y+2),服务端进入CLOSED状态,完成四次挥手。