TCP的握手和挥手

TCP在建立连接和关闭连接的时候分别需要三次握手和四次挥手的操作,这是为什么?

TCP的握手和挥手

TCP的握手和挥手

SYN、ACK、FIN存放在TCP的标志位,分别表示:

SYN:代表请求创建连接,所以在三次握手中SYN=1

ACK:代表确认接受,ACK=1表示信息收到了,并在建立连接后发送数据时,都需要加上ACK=1,来表示数据接收成功。

FIN:表示请求关闭连接,在分手时发送了两遍,是因为TCP的连接是双向的,一次FIN只能关闭一个方向。

seq:***,当传输数据时,需要对发送的数据进行拆包,***就是对每个数据包进行的编号,这样接收方才能对接收的数据进行再次拼接。(初识***是随机生成的,这样不一样的数据包拼接时就不会发生错误了)

ack:表示下一个数据包的编号

连接与关闭的完整过程:

(1)创建连接时:

客户端首先要SYN=1,表示要创建连接

服务端接收到后,要告诉客户端,我接受到了,所以ACK=1,所以就变成了SYN=1 ACK=1

理论上这时候就已经连接成功了,但是要防止意外(当服务端的响应迟迟未到达客户端时,客户端会请求从新发送,这时如果之前和新的连接请求都已经到达了服务端,那么服务端对于两次请求都响应,会建立两个连接,浪费资源),所以客户端要再发送一个消息给服务端确认一下,这时候只需要ACK=1就行了。

至此,三次握手完成。

(2)关闭连接时:

客户端首先要发送FIN=1,表示要关闭客户端与服务器之间一个方向的连接,

服务端收到关闭连接的请求,返回ACK =1

这时只关闭了一个方向的连接,另一个方向也需要关闭,所以服务端会向客户端发送关闭连接的请求,FIN=1,ACK=1

客户端接收到后发送ACK=1,表示接受成功。

为什么连接时是三次握手,而关闭时是四次挥手?

是因为TCP的连接时双向的,所以关闭时需要在两个方向上分别关闭,而每个关闭又都需要请求和确认。