TCP协议的握手和断开

Posted 六维世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议的握手和断开相关的知识,希望对你有一定的参考价值。

  • TCP是面向连接的协议,它在源点和终点之间建立虚拟连接,而不是物理连接

  • 在数据通信之前,发送端与接收端要先建立连接,等数据发送结束后,双方再断开连接


  • 三次握手

  • 第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号

  • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。

  • 第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。

四次断开
  • 主机A发送FIN控制位发出断开连接的请求

  • 主机B进行响应,确认收到断开连接请求

  • 主机B提出反方向的关闭要求

  • 主机A确认收到的主机B的关闭连接请求


从抓包工具上我们可以看它的握手过程和断开过程

这是三次握手阶段:

第一次握手,客户端向服务器发送seq序列号,这个序列号是随机的,ack为确认码,用于确认接收到了服务器发送的数据,因为第一次握手服务器还没发送数据,所以ack是0

第二次握手,服务器向客户端发送seq序列号,这个序列号也是随机的,ack为确认码,用于确认接收到了客户端发送的数据,ack=客户端的seq+1,告诉客户端接收到了上一个seq,下次请客户端从seq+1开始发

第三次握手,正式发送数据,客户端第一次发送的seq被确认收到,所以这次的seq为第二次握手时服务器的ack,表示客户端向服务器按顺序开始发送数据

之后开始正式发送数据,seq,ack依次递增

(只有前两次握手时候有SYN码,此时SYN=1,表示希望建立连接)



这是四次断开阶段:

第一次断开:客户端请求断开,会发送ack码,表示接收成功上次数据,并且发送FIN(finally的简写)码,FIN码为1表示请求断开

第二次断开:服务器接收到FIN码,首先发送一次ack码,表示接受成功数据

第三次断开:服务器在第二次断开之后,紧接着发送一个ack码和FIN码,请求断开

第四次断开:客户端发送ack码,表示接收到服务器请求,连接断开


为什么建立连接是三次握手,而关闭连接却是四次挥手呢?


这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

以上是关于TCP协议的握手和断开的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议的握手和断开

TCP3次握手连接协议和4次握手断开连接协议

Linux下从TCP状态机,三次握手判断DDOS攻击

TCP协议的3次握手与4次挥手过程详解

TCP协议三次握手四次挥手过程

TCP协议的三次握手漏洞问题!